Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> [ZendFramework] Problem z pętlami
Ikky
post
Post #1





Grupa: Zarejestrowani
Postów: 120
Pomógł: 1
Dołączył: 5.07.2009

Ostrzeżenie: (0%)
-----


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 :/
Go to the top of the page
+Quote Post
phpion
post
Post #2





Grupa: Moderatorzy
Postów: 6 072
Pomógł: 861
Dołączył: 10.12.2003
Skąd: Dąbrowa Górnicza




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.
Go to the top of the page
+Quote Post
Ikky
post
Post #3





Grupa: Zarejestrowani
Postów: 120
Pomógł: 1
Dołączył: 5.07.2009

Ostrzeżenie: (0%)
-----


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
Go to the top of the page
+Quote Post
phpion
post
Post #4





Grupa: Moderatorzy
Postów: 6 072
Pomógł: 861
Dołączył: 10.12.2003
Skąd: Dąbrowa Górnicza




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...
Go to the top of the page
+Quote Post
Ikky
post
Post #5





Grupa: Zarejestrowani
Postów: 120
Pomógł: 1
Dołączył: 5.07.2009

Ostrzeżenie: (0%)
-----


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.
Go to the top of the page
+Quote Post
phpion
post
Post #6





Grupa: Moderatorzy
Postów: 6 072
Pomógł: 861
Dołączył: 10.12.2003
Skąd: Dąbrowa Górnicza




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.

Ten post edytował phpion 20.08.2009, 19:02:44
Go to the top of the page
+Quote Post
Ikky
post
Post #7





Grupa: Zarejestrowani
Postów: 120
Pomógł: 1
Dołączył: 5.07.2009

Ostrzeżenie: (0%)
-----


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

Ten post edytował Ikky 20.08.2009, 22:30:32
Go to the top of the page
+Quote Post
phpion
post
Post #8





Grupa: Moderatorzy
Postów: 6 072
Pomógł: 861
Dołączył: 10.12.2003
Skąd: Dąbrowa Górnicza




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 (IMG:style_emoticons/default/winksmiley.jpg)
Go to the top of the page
+Quote Post
Ikky
post
Post #9





Grupa: Zarejestrowani
Postów: 120
Pomógł: 1
Dołączył: 5.07.2009

Ostrzeżenie: (0%)
-----


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
Go to the top of the page
+Quote Post
phpion
post
Post #10





Grupa: Moderatorzy
Postów: 6 072
Pomógł: 861
Dołączył: 10.12.2003
Skąd: Dąbrowa Górnicza




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. }
Go to the top of the page
+Quote Post
Ikky
post
Post #11





Grupa: Zarejestrowani
Postów: 120
Pomógł: 1
Dołączył: 5.07.2009

Ostrzeżenie: (0%)
-----


a jak moge do tego:

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

dodać kolejne pole które opisuje prace ?

Ten post edytował Ikky 21.08.2009, 19:18:29
Go to the top of the page
+Quote Post
phpion
post
Post #12





Grupa: Moderatorzy
Postów: 6 072
Pomógł: 861
Dołączył: 10.12.2003
Skąd: Dąbrowa Górnicza




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. );
Go to the top of the page
+Quote Post
Ikky
post
Post #13





Grupa: Zarejestrowani
Postów: 120
Pomógł: 1
Dołączył: 5.07.2009

Ostrzeżenie: (0%)
-----


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 (IMG:style_emoticons/default/tongue.gif)

jescze raz wielkie dzięki phpion (IMG:style_emoticons/default/smile.gif)

Ten post edytował Ikky 22.08.2009, 13:12:22
Go to the top of the page
+Quote Post

Reply to this topicStart new topic
2 Użytkowników czyta ten temat (2 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Aktualny czas: 22.08.2025 - 22:25