Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [ZendFramework] Problem z pętlami
Forum PHP.pl > Forum > PHP > Frameworki
Ikky
Mam 2 tabelki

TABELA TEMATY:
temat_id
temat_nazwa

TABELA PRACA:
praca_id
praca_nazwa
praca_temat_id


W kontrolerze mam takie coś:
  1. $tematy = new Default_Model_DbTable_Tematy();
  2. $this->view->tematy = $tematy->fetchAll();


i w widoku:

  1. <?php foreach($this->tematy as $tematy) : ?>
  2. <tr>
  3. <td align='left' class='przedmiot'><?php echo $this->escape($tematy->temat_nazwa);?></td>
  4. <td align='center' class="prace">praca1 praca2 praca3</td>
  5. </tr>
  6. <?php endforeach; ?>


wystwietaja mi sie teraz wszystkie tematy z bazy i w drugiej kolumnie praca1 praca2 praca3
zamiast cyferek chce miec drugą pętle która pętle foreach która pobiera mi wszystkie nazwy prac gdzie
praca_temat_id =
  1. <?php echo $this->escape($tematy->temat_id);?>

no i wlasnie sie mają wyswietalc w takiej formie praca1 praca2

nie wiem jak sie do tego zabrać w ogole :/
phpion
JOIN + odpowiednie obrobienie danych aby uzyskać pożądaną strukturę (np. dla każdego obiektu tematu robisz tablicę z obiektami prac).

Swoją drogą to sugerowałbym najpierw obycie sie z PHP, a nie branie się od razu za ZF bo to dość twardy orzeszek.
Ikky
ma ktoś może jakies linki do przykładu z łączeniem tabel w zendzie? mocuje się z tym juz drugi dzień a najgorsze jest to ze wlasciwie nie wiem co chce zrobić :/

Spróbuje to jeszcze raz opisać bo pierwszy post troche chaotyczny.

Mam 2 tabelki:

Tematy:
temat_id
temat_nazwa

Prace:
praca_id
praca_temat_id
praca_nazwa

Moim celem jest wyświetlenie takiej tabelki

http://www.a.ikky.pl/

Niestety nie moge tego zrobic na sztywno tematy wyświetlaja się tylko jesli spełnią dany warunek w pętli foreach.

teraz troche kodu:

Mój widok w którym wyświetlam tematy/prace
  1. <?php foreach($this->tematy as $tematy) : ?>
  2. <tr>
  3. <td><?php echo $this->escape($tematy->temat_nazwa);?></td>
  4. <td>TU MAJĄ BYĆ PRACE</td>
  5. </tr>
  6. <?php endforeach; ?>


kontroler
  1. $tematy = new Default_Model_DbTable_Tematy();
  2. $data_tematy = $tematy->getTematy($temat_id);
  3. $this->view->tematy = $data_tematy;


no i model:
  1.  
  2. function getTematy($tematy_id)
  3. {
  4. $ids = explode(";", $tematy_id);
  5. $select_tematy = $this->select();
  6. $select_tematy->order('temat_nazwa ASC');
  7. foreach($ids as $key => $value)
  8. $select_tematy->orWhere("temat_id = ?",$ids[$key]);
  9. return $this->fetchAll($select_tematy);
  10. }


jakby ktoś sie zastanawiał po co to explode to ta tabelka bedzie dostepna po zalogowaniu i user ustawia sobie które tematy chce widziec i jego preferencje przetrzymuje w bazie w takiej postaci 1;2;3;4;5;6 (gdzie cyferki to id tematów)

błagam o wskazówki/pomoc/linki/przykłady
phpion
Cytat(Ikky @ 20.08.2009, 19:30:13 ) *
ma ktoś może jakies linki do przykładu z łączeniem tabel w zendzie? mocuje się z tym juz drugi dzień a najgorsze jest to ze wlasciwie nie wiem co chce zrobić :/

No bez jaj :| zaglądałeś chociaż do dokumentacji? Są tam przykłady podane na tacy! Miałem podać link do nich ale - znajdź sobie sam.

...kolejny programista ze znajomością ZF...
Ikky
Czy nazwałem się kiedyś programistą? Każdy musi od czegoś zacząc sorry. Zanim założylem ten durny temat siłowałem się z przykładami z dokumentacji pare razy. Za kazdym razem konczylem z errorem "Can not join tables" pozatym nie wiem nawet czy gdybym je połączył to uzyskałbym taki efekt jaki chce. Przedewszystkim chcialbym poprosic kogos zeby mi powiedzial jak rozwiazac moj problem czy kolejna pętla w środku drugiej kolumny to dobry pomysł a potem zrobie wszystko zeby poradzic sobie samemu. Wcale nie sprawia mi przyjemnosci proszenie o pomoc innych na forum no ale tylko chyba to mi pozostało a po to to forum jest.
phpion
Nie, nigdzie nie nazwałeś się w ten sposób. Jest to uogólnienie z mojej strony bo coraz więcej osób porywa się od razu na frameworka nie mając podstaw w pracy z "czystym" PHP.

Ok, podam Ci pomocną dłoń. Stosując JOINa otrzymasz (przykładowo!) takie dane:
Kod
imie   | posiadane_skarpetki
----------------------------
mietek | czerwone
mietek | różowe
heniek | zielone
heniek | pomarańczowe
heniek | przezroczyste

Co w tablicy PHP będzie wyglądało tak:
  1. 'imie' => 'mietek',
  2. 'posiadane_skarpetki' => 'czerwone'
  3. ),
  4. 'imie' => 'mietek',
  5. 'posiadane_skarpetki' => 'różowe'
  6. ),
  7. 'imie' => 'heniek',
  8. 'posiadane_skarpetki' => 'różowe'
  9. ),
  10. // ...itd
  11. );

Wyświetlając taką strukturę pętlą foreach otrzymasz powtórzenia na poziomie kolumny "imie". Musisz więc obrobić dane PRZED przekazaniem ich do widoku aby ich strukura wyglądała tak:
  1. 'imie' => 'mietek',
  2. 'skarpety' => array(
  3. 'posiadane_skarpetki' => 'czerwone'
  4. ),
  5. 'posiadane_skarpetki' => 'różowe'
  6. )
  7. )
  8. ),
  9. 'imie' => 'heniek',
  10. 'skarpety' => array(
  11. 'posiadane_skarpetki' => 'zielone',
  12. // ...itd
  13. )
  14. )
  15. )
  16. );

Na takiej lub podobnej strukturze osiągniesz swój cel.
Ikky
k dzięki bardzo za pomoc coś się ruszyło wreszcie
doszedłem do momentu kiedy juz mam wyswietlane dane niestety tak jak napisales powtarza się imie z Twojego przykładu
jak to obrobic? tzn nie podawaj mi rozwiazania bo juz mi duzo pomogles tylko powiedz jak sie do tego zabrac

na razie mam taką pętle:
  1. foreach($dane as $key => $value)
  2. {
  3. echo $value[temat_nazwa] . " - ";
  4.  
  5. echo $value[temat_nazwa] . " - " .$value[praca_nazwa] . "<br />";;
  6. }
  7. echo "<br />";
  8. }


temat1 - praca1
temat2 - praca2
temat3- praca3
temat3- praca4

<czyli powtarza tą 3>
wymarzone rozwiązanie:
temat3- praca3 praca4
phpion
Przypuśćmy, że masz taką tablicę uzyskaną na podstawie bazy danych:
  1. $array = array(
  2. 'temat_nazwa' => 'temat1',
  3. 'praca_nazwa' => 'praca1'
  4. ),
  5. 'temat_nazwa' => 'temat2',
  6. 'praca_nazwa' => 'praca2'
  7. ),
  8. 'temat_nazwa' => 'temat3',
  9. 'praca_nazwa' => 'praca3'
  10. ),
  11. 'temat_nazwa' => 'temat3',
  12. 'praca_nazwa' => 'praca4'
  13. )
  14. );

Jest to dość uproszczona tablica i zapewnie nie taką faktycznie uzyskujesz ale na takiej będę operował.

Docelowo chcesz uzyskać coś takiego:
  1. $array = array(
  2. 'temat_nazwa' => 'temat1',
  3. 'prace' => array(
  4. 'praca1'
  5. )
  6. ),
  7. 'temat_nazwa' => 'temat2',
  8. 'prace' => array(
  9. 'praca2'
  10. )
  11. ),
  12. 'temat_nazwa' => 'temat3',
  13. 'prace' => array(
  14. 'praca3',
  15. 'praca4'
  16. )
  17. )
  18. );

Musisz więc odpowiednio obrobić uzyskane wcześniej dane:
  1. $temp = array();
  2.  
  3. foreach ($array as $item) {
  4. if (!isset($temp[$item['temat_nazwa']) || !is_array($temp[$item['temat_nazwa'])) {
  5. $temp[$item['temat_nazwa'] = array(
  6. 'temat_nazwa' => $item['temat_nazwa'],
  7. 'prace' => array()
  8. );
  9.  
  10. $temp[$item['temat_nazwa']['prace'][] = $item['praca_nazwa'];
  11. }
  12. }
  13.  
  14. $array = $temp;

W wyniku przekształcenia powinieneś otrzymać odpowiednią strukturę. Nie testowałem, pisane z palca - powinno jednak działać. Jeśli nie to chociaż ideę załapiesz winksmiley.jpg
Ikky
Wow dzięki bardzo tyle ze pewnie cos zwaliłem bo dostaje dośc dziwną tablice. To jest mój cały kod (poprawiłem w pętli pare literówek)
  1. $array = array(
  2. 'temat_nazwa' => 'temat1',
  3. 'praca_nazwa' => 'praca1'
  4. ),
  5. 'temat_nazwa' => 'temat2',
  6. 'praca_nazwa' => 'praca2'
  7. ),
  8. 'temat_nazwa' => 'temat3',
  9. 'praca_nazwa' => 'praca3'
  10. ),
  11. 'temat_nazwa' => 'temat3',
  12. 'praca_nazwa' => 'praca4'
  13. )
  14. );
  15.  
  16. $temp = array($array);
  17.  
  18. foreach ($array as $item)
  19. {
  20.  
  21. if (!isset($temp[$item['temat_nazwa']]) || !is_array($temp[$item['temat_nazwa']]))
  22. {
  23. $temp[$item['temat_nazwa']] = array(
  24. 'temat_nazwa' => $item['temat_nazwa'],
  25. 'prace' => array()
  26. );
  27.  
  28. $temp[$item['temat_nazwa']['prace']] = $item['praca_nazwa'];
  29. }
  30.  
  31.  
  32. }
  33. $array1= $temp;
  34.  
  35. print_r($array1);


I tablica:

  1. <?
  2. Array (
  3. [0] => Array (
  4. [0] => Array (
  5. [temat_nazwa] => temat1
  6. [praca_nazwa] => praca1
  7. )
  8. [1] => Array (
  9. [temat_nazwa] => temat2
  10. [praca_nazwa] => praca2
  11. )
  12. [2] => Array (
  13. [temat_nazwa] => temat3
  14. [praca_nazwa] => praca3
  15. )
  16. [3] => Array (
  17. [temat_nazwa] => temat3
  18. [praca_nazwa] => praca4
  19. )
  20. )
  21. [temat1] => Array (
  22. [temat_nazwa] => temat1
  23. [prace] => Array ( )
  24. )
  25. [t] => praca3
  26. [temat2] => Array (
  27. [temat_nazwa] => temat2
  28. [prace] => Array ( )
  29. )
  30. [temat3] => Array (
  31. [temat_nazwa] => temat3
  32. [prace] => Array ( )
  33. )
  34. )
  35. ?>


jak zamieniam to
  1. 'prace' => array()


  1. 'prace' => array($array)
  2.  
  3. lub
  4.  
  5. 'prace' => array($temp)
  6.  


to mam wielka tablice ktora absolutnie nie ma sensu powtarzene elementy z tego $array po pare razy
phpion
Wkradło Ci się kilka wpadek. Ten kod działa poprawnie:
  1. $array = array(
  2. 'temat_nazwa' => 'temat1',
  3. 'praca_nazwa' => 'praca1'
  4. ),
  5. 'temat_nazwa' => 'temat2',
  6. 'praca_nazwa' => 'praca2'
  7. ),
  8. 'temat_nazwa' => 'temat3',
  9. 'praca_nazwa' => 'praca3'
  10. ),
  11. 'temat_nazwa' => 'temat3',
  12. 'praca_nazwa' => 'praca4'
  13. )
  14. );
  15.  
  16. $temp = array();
  17.  
  18. foreach ($array as $item)
  19. {
  20.  
  21. if (!isset($temp[$item['temat_nazwa']]) || !is_array($temp[$item['temat_nazwa']]))
  22. {
  23. $temp[$item['temat_nazwa']] = array(
  24. 'temat_nazwa' => $item['temat_nazwa'],
  25. 'prace' => array()
  26. );
  27. }
  28.  
  29. $temp[$item['temat_nazwa']]['prace'][] = $item['praca_nazwa'];
  30. }
  31. $array = $temp;
  32.  
  33. print_r($array);
  34.  
  35. echo '<hr>';
  36.  
  37. foreach ($array as $temat) {
  38. echo '<h3>'.$temat['temat_nazwa'].'</h3>';
  39.  
  40. if (count($temat['prace']) > 0) {
  41. foreach ($temat['prace'] as $praca) {
  42. echo '<h4>'.$praca.'</h4>';
  43. }
  44. }
  45. else {
  46. echo '<p>Brak prac</p>';
  47. }
  48. }
Ikky
a jak moge do tego:

  1. $temp[$item['temat_nazwa']]['prace'][] = $item['praca_nazwa'];

dodać kolejne pole które opisuje prace ?
phpion
Poprzez tablicę czyli np.
  1. $temp[$item['temat_nazwa']]['prace'][] = array(
  2. 'praca_nazwa' => $item['praca_nazwa'],
  3. 'kolejne_pole' => $item['kolejne_pole']
  4. // ...itd.
  5. );
Ikky
array przed przeróbką:
  1. $dane = array(
  2. 'temat_nazwa' => 'temat1',
  3. 'autorzy_imie' => 'autor1 ',
  4. 'praca_nazwa' => 'praca1',
  5. 'praca_data' => 'data1'
  6. ),
  7. 'temat_nazwa' => 'temat1',
  8. 'autorzy_imie' => 'autor2',
  9. 'praca_nazwa' => 'praca2',
  10. 'praca_data' => 'data2'
  11. ),
  12. 'temat_nazwa' => 'temat2',
  13. 'autorzy_imie' => 'autor3',
  14. 'praca_nazwa' => 'praca3',
  15. 'praca_data' => 'data3'
  16. ),
  17. 'temat_nazwa' => 'temat3',
  18. 'autorzy_imie' => 'autor4',
  19. 'praca_nazwa' => 'praca4',
  20. 'praca_data' => 'data4'
  21. )
  22. );


array po przeróbce:

  1. $dane = array(
  2. 'temat1' => array(
  3. 'temat_nazwa' => 'temat1',
  4. 'prace' => array(
  5. 'praca_nazwa' => 'praca1',
  6. 'praca_data' => '05.06.2009',
  7. 'autorzy_imie' => 'autor1'
  8. ),
  9. 'praca_nazwa' => 'praca2',
  10. 'praca_data' => '05.06.2009',
  11. 'autorzy_imie' => 'autor2'
  12. )
  13. )
  14. ),
  15. 'temat2' => array(
  16. 'temat_nazwa' => 'temat2',
  17. 'prace' => array(
  18. 'praca_nazwa' => 'praca3',
  19. 'praca_data' => 'data3',
  20. 'autorzy_imie' => 'autor3'
  21. )
  22. )
  23. ),
  24. 'temat3' => array(
  25. 'temat_nazwa' => 'temat3',
  26. 'prace' => array(
  27. 'praca_nazwa' => 'praca4',
  28. 'praca_data' => 'data4',
  29. 'autorzy_imie' => 'autor4'
  30. )
  31. )
  32. )
  33. );




/edit


UDAŁO MI SIĘ TO ZROBIĆ SAMEMU tongue.gif

jescze raz wielkie dzięki phpion smile.gif
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.