Skocz do zawartości

Witamy na polskim forum Contao
Zarejestruj się teraz, aby skorzystać ze wszystkich funkcji forum. Kiedy się zalogujesz, będziesz mógł tworzyć tematy, pisać posty, rozdawać punkty reputacji, korzystać z prywatnych wiadomości i zarządzać swoim profilem. Jeśli posiadasz już konto, zaloguj się - w przeciwnym wypadku zarejestruj się już teraz!
Zdjęcie

zapytanie do zapytania


  • Zaloguj się, aby dodać odpowiedź
4 odpowiedzi w tym temacie

#1
gutenbergus

gutenbergus

    Znawca

  • Zarejestrowani
  • PipPipPipPip
  • 189 postów
Witajcie,

Mam taką oto sytuację. Mam tablicę z hotelami w miastach. Każdy rekord posiada pole hotel i miasto. Chciałbym wyświetlić listę wszystkich hoteli pogrupowanych po miastach:

- Kraków
---- hotel 1
---- hotel 2
- Warszawa
---- hotel 3
---- hotel 4
- Wrocław
---- hotel 5
---- hotel 6

Czyli powinienem mieć zapytanie zwracające wszystkie miasta a potem w pętli przez tablicę miast pytać o wszystkie hotele. No kombinuję i nic. Poradźcie, proszę.


 
class ModuleHD_reservation extends Module
{
 
protected $strTemplate = 'mod_HD_reservation';
 
protected function compile()
{
 
/* obiekt z zapytaniem o wszystkie hotele w bazie (to dziala ok) */
$objHotele = $this->Database->prepare("
 
SELECT
* from tl_HD_hotele
") -> execute($this->HD_reservation);
 
while ($objHotele->next())
{
  $arrHotele[] = array
  (
   'id'   => $objHotele -> id,
   'hotel'   => $objHotele->hotel,
   'miasto'  => $objHotele->miasto,
   'reservation_id'=> $objHotele->reservation_id
  );
}
/* koniec */
 
 
/* pytamy o miasta w ktorych są hotele */
$objMiasta = $this->Database->prepare("
 
SELECT
miasto from `tl_HD_hotele` group by miasto order by miasto asc
 
") -> execute($this->HD_reservation);
 
while ($objMiasta->next())
{
  $arrMiasta[] = array
  (
   'miasto'   => $objMiasta->miasto
  );
  /* pytamy o wszystkie hotele w danym miescie */
  $objHoteleWMiastach = $this->Database->prepare("
 
  SELECT
  id, hotel from `tl_HD_hotele` where miasto like '" . $objMiasta->miasto . "'"
 
  ) -> execute($this->HD_reservation);
 
 
  while($objHoteleWMiastach->next()) {
   $arrHoteleWMiastach[] = array
   (
	'hotelwmiescie' => $objHoteleWMiastach->hotel,
	'idhoteluwmiescie' => $objHoteleWMiastach->id
	);
  }
}
 
$this->Template->hotele = $arrHotele;
$this->Template->miasta = $arrMiasta;
 
}
 
}
 
 

  • 0

#2
Kamil

Kamil

    Contao ambassador

  • Administratorzy
  • 1 538 postów
  • Strona www:zobacz
  • LokalizacjaLidzbark Warminski
Dlaczego wykonujesz dodatkowe dwa zapytania, skoro wszystkie dane masz w pierwszym? A najprościej takie drzewko wyświetlić budując array:

while ($objHotele->next())
{
    $arrHotele[$objHotele->miasto][] = array
    (
        // ...
    );
}
A w templatce dwie pętle foreach() i wsio.
  • 0

Codefog - Contao web development


#3
gutenbergus

gutenbergus

    Znawca

  • Zarejestrowani
  • PipPipPipPip
  • 189 postów
Bardzo dziękuję, rzeczywiście inne nawyki = inne myślenie. Mam prośbę, zobacz czy to co napisałem jest poprawne z punktu widzenia Twojej metody.

w templatce:
   <select name="city" id="citySelector" style="display: none;">
    <option value="" selected><? echo $GLOBALS['TL_LANG']['HD_reservation']['SelectCity']; ?></option>
    <?php if ($this->hotele) { ?>
    <?php foreach($this->hotele as $miasto): ?>
    <option value="" class="optionCity"><? echo $miasto[0]['miasto']; ?></option>
	 <?php foreach($miasto as $hotel): ?>
	  <option value="<? echo $hotel['reservation_id']; ?>" ><? echo $hotel['hotel']; ?></option>
	 <?php endforeach; ?>
   
    <?php endforeach; ?>
    <?php }; ?>
   </select>

i w klasie jak sugerowałeś:

while ($objHotele->next())
{
  $arrHotele[$objHotele->miasto][] = array
  (
   'id'   => $objHotele -> id,
   'miasto'  => $objHotele -> miasto,
   'hotel'   => $objHotele->hotel,
   'reservation_id'=> $objHotele->reservation_id
  );
}

Pytam ponieważ nie bardzo wiem jak sobie poradzić z wyświetleniem samego indeksu, no bo ta tablica jest indeksowana nazwami miast czyli jeśli jest $arrHotele[Warszawa][0]..... no to jak wyświetlić sam index? Jest jakiś inny sposób niż ten, którego użyłem - mniej redundantny?
  • 0

#4
Kamil

Kamil

    Contao ambassador

  • Administratorzy
  • 1 538 postów
  • Strona www:zobacz
  • LokalizacjaLidzbark Warminski
Zakładając, że $arrHotele to $this->hotele:

<?php foreach ($this->hotele as $miasto => $hotele): ?>
<optgroup label="<?php echo $miasto; ?>">
	<?php foreach ($hotele as $hotel): ?>
	<option value="<?php echo $hotel['id']; ?>"><?php echo $hotel['hotel']; ?></option>
	<?php endforeach; ?>
</optgroup>
<?php endforeach; ?>

  • 0

Codefog - Contao web development


#5
gutenbergus

gutenbergus

    Znawca

  • Zarejestrowani
  • PipPipPipPip
  • 189 postów
Wielkie dzięki, Kamil.
  • 0




Użytkownicy przeglądający ten temat: 1

0 użytkowników, 1 gości, 0 anonimowych użytkowników