Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [Symfony] nested foreach
Forum PHP.pl > Forum > PHP > Frameworki
voytasf
Witam
Nie mogę sobie poradzić z tym kodem:
  1. <?php
  2. class menuComponents extends sfComponents
  3. {
  4.    public function executeDefault()
  5.    {
  6.        $c = new Criteria();
  7.        $c->add(GrupaPeer::ID_PARENT,0);
  8.          $this->grupy = GrupaPeer::doSelect($c);
  9.          foreach($this->grupy as $grupa)
  10.          {
  11.              $d = new Criteria();
  12.              $d->add(GrupaPeer::ID_PARENT,$grupa->getIDGrupa());
  13.              $this->podgrupy = GrupaPeer::doSelect($d);
  14.          }
  15.    }
  16. }
  17. ?>

template
  1. <ul>
  2.    <?php foreach($grupy as $grupa): ?>
  3.        <li>
  4.        <?php echo link_to($grupa->getNazwaGrupaPl(),"towary/grupa?id=" . $grupa->getIdGrupa()); ?>
  5.        <ul>
  6.            <?php foreach ($podgrupy as $podgrupa): ?>
  7.            <li>
  8.            <?php echo link_to($podgrupa->getNazwaGrupaPl(),"towary/grupa?id=" . $podgrupa->getIdGrupa()); ?>
  9.            </li>
  10.            <?php endforeach ?>
  11.        </ul>
  12.        </li>
  13.    <?php endforeach ?>
  14. </ul>

W wyniku wyświetlają się wszystkie grupy główne (id_parent=0) i w każdej z nich podgrupa ostatniej grupy głównej.
Gdy dam echo w funcji wyświetla ok, przez template jak powyżej.
smentek
Ojej,.. smile.gif

1. Pobieranie obiektów z bazy danych (nawet mowiac bardziej ogolnie - wykonwywanie jakichkolwiek zapytanian do bazy w jakimkolwiek systemie) w petli niema sesu. To tak jak bys robil zakupy, biegajac miedzy domem a sklepem z kazdym pojedynczo zakupionym towarem..

2. Zapytanie do bazy (najlepiej jedno) tworzsz w pliku akcji komponentu. Wynikiem zapytania jest obiekt lub tablica obiektow.
W templecie umieszczasz petle w ktorej wyswietlasz wyniki obiekt po obiekcie poprzez petle foreach.

3. Wazne jest utworzenie prawidlowego MODELU. Jezeli masz Grupy i Podgrupy to pownienes miec 2 tabele w bazie i 2 odpowiedajace im obiekty,


4. Odnosnie braku wyswietlania podgrup:

  1. <?php
  2. $this->podgrupy = GrupaPeer::doSelect($d);
  3. ?>


Zmienna $this->podgrupy jest nadpisywana przy kazdej iteracji.

"Prawidlowe" rozwiazanie to:

  1. <?php
  2. //Tablica na obiekty z zapytan
  3. $podgrupyArray = array();
  4. //Przypisujemy obiekty do tablicy
  5. $podgrupyArray[] =  GrupaPeer::doSelect($d);
  6. //Wysylamy do template
  7. $this->podgrupyArray = $podgrupyArray ;
  8. ?>
phpion
Może nieco odejdę od tematu ale:

Cytat(smentek @ 6.12.2008, 01:05:01 ) *
3. Wazne jest utworzenie prawidlowego MODELU. Jezeli masz Grupy i Podgrupy to pownienes miec 2 tabele w bazie i 2 odpowiedajace im obiekty,

A co w przypadku gdy będzie konieczność dołożenia 3-go poziomu zagłębień? Dodasz nową tabelę? Moim zdaniem rozwiązanie problem drzewiastego menu z jedną tabelą, w której klucz obcy wskazuje na nią samą, jest najlepszym pomysłem.
smentek
Cytat
A co w przypadku gdy będzie konieczność dołożenia 3-go poziomu zagłębień? Dodasz nową tabelę?


Masz racje tworzenie osobnych tabel moze faktycznie nie byc najlepszym rozwiazaniem, Zwlaszcza jesli struktura ma byc nieograniczona.

Cytat
Moim zdaniem rozwiązanie problem drzewiastego menu z jedną tabelą, w której klucz obcy wskazuje na nią samą, jest najlepszym pomysłem.[


To juz zalezy od priorytetów, ktore obrales. Od strony wydajnosci na pewno nie jest to najlepsza metoda z mozliwych.
voytasf
Dziękuję
Już myślałem że nikt nie odpowie.
Jednak bedę zawsze budował model struktur drzewiastych w jednej tabeli.
Zbieranie danych w tablicy jest rozwiązaniem tego problemu i zminiejsza ilość zapytań do bazy.
Pogrzebałem trochę i staram się użyć sfPropelActAsNestedSetBehaviorPlugin do listowania takich struktur.
Dzięki za pomoc

Pozdrawiam
Voytas
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.