Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [PHP][Smarty]Segregowanie danych w wyświetlanej tabeli
Forum PHP.pl > Forum > PHP
kasior
Witam. Mam problem (no inaczej bym nie pisał nie biggrin.gif )
Moze na początek kawałek kodu:

Kod
$sql = 'CALL replacement ('.$changeweek.')';
$stmt = $hDB->prepare($sql);
             $stmt->execute();
            $num = $stmt->rowCount();
            
            $result = $stmt->setFetchMode(PDO::FETCH_ASSOC);
            for ($i=0;$i<$num;$i++){
                $resultw = $stmt->fetch();
                $wr[] = $resultw;
            }
$smarty->assign('wr',$wr);


Mam z tego tablicę:


direction | driver | truck | client
-------------------------------------------------------------
IN | kowalski | CBA 2659 | klient
--------------------------------------------------------------
OUT | nowak | CBA 2659 | klient
-------------------------------------------------------------

Jak to wyrzucic na stronę w Smarty w formie tabelki :


OUT | truck | IN | client
------------------------------------------------
nowak | CBA 2659 | kowalski | klient
-------------------------------------------------

Poprosze o pomoc.

Nikt nie pomoże?
trueblue
Nie robiłbym tego w Smarty, najlepiej zapytaniem SQL, ale rozumiem, że nie możesz.
Pozostaje PHP.

  1. for ($i=0;$i<$num;$i++){
  2. $resultw = $stmt->fetch();
  3. if($resultw['direction']=='IN')
  4. $wr[$resultw['client']][$resultw['truck']]['in']=$resultw['driver'];
  5. elseif($row['direction']=='OUT')
  6. $wr[$resultw['client']][$resultw['truck']]['out']=$resultw['driver'];
  7. }

Puść to później w Smarty, w dwóch pętlach {foreach} z atrybutem key.
W pierwszej w atrybucie key będziesz mieć klienta, w drugiej, w atrybucie key będzie truck.
Value drugiej pętli, to tablica z dwiema zmiennymi: in oraz out.
kasior
Fajnie opisałeś, ale jednak nie rozumiem tego sad.gif Nigdy nie używałem pętli {foreach} , przeważnie używam {section}
trueblue
  1. OUT,truck,IN,client
  2. {foreach from=$wyniki key=client item=tmp}
  3. {foreach from=$tmp key=truck item=drivers}
  4. {$drivers.out},{$truck},{$drivers.in},{$client}
  5. {/foreach}
  6. {/foreach}


I jeszcze możesz uprościć wcześniejszą pętlę w PHP:
  1. for ($i=0;$i<$num;$i++){
  2. $resultw = $stmt->fetch();
  3. $wr[$resultw['client']][$resultw['truck']][strtolower($resultw['direction'])]=$resultw['driver'];
  4.  
  5. }
kasior
No chciałbym kliknąc pomógł ale jeszcze nie mogę. To coś nie działa. Dostaje w wyniku kupę danych zupełnie niepotrzebnych w tym nazwy pól bazy.

  1. OUT,truck,IN,client
  2.  
  3. O,direction,O,0
  4. 5,graph_id,5,0
  5. 1,driver,1,0
  6. 1,week,1,0
  7. o,status,o,0
  8. b,color,b,0
  9. ,note,,0
  10. W,truck,W,0
  11. ,infoequipment,,0
  12. ,infoservice,,0
  13. v,client,v,0
  14. ,coach,,0
  15. 1,driver_id,1,0
  16. G,name,G,0
  17. D,last_name,D,0
  18. ,last_name2,,0
  19. 1,active,1,0
  20. ,phone,,0
  21. ,phone2,,0
  22. 1,adr,1,0
  23. 6,system,6,0
  24. 2,adddate,2,0
  25. ,lang,,0
  26. ,type,,0
  27. R,country,R,0
  28. w,weeks,w,0


itd...

jeszcze raz cały mój kod:


  1. $sql = 'CALL replacement ('.$changeweek.')';
  2. $stmt = $hDB->prepare($sql);
  3. $stmt->execute();
  4. $num = $stmt->rowCount();
  5.  
  6. $resultw = $stmt->setFetchMode(PDO::FETCH_ASSOC);
  7. for ($i=0;$i<$num;$i++){
  8. $resultw = $stmt->fetch();
  9. $wr[] = $resultw;
  10. }
  11.  
  12. for ($i=0;$i<$num;$i++){
  13. $resultw = $stmt->fetch();
  14. if($resultw['direction']=='IN')
  15. $wr[$resultw['client']][$resultw['truck']]['in']=$resultw['driver'];
  16. elseif($row['direction']=='OUT')
  17. $wr[$resultw['client']][$resultw['truck']]['out']=$resultw['driver'];
  18. }
  19.  
  20. $smarty->assign('wr',$wr);



  1. OUT,truck,IN,client<br /><br />
  2. {foreach from=$wr key=client item=tmp}
  3. {foreach from=$tmp key=truck item=drivers}
  4. {$drivers.out},{$truck},{$drivers.in},{$client}<br />
  5. {/foreach}
  6. {/foreach}





EDIT >> ok. dureń ze mnie. zostawiłem poprzednią pętlę smile.gif
trueblue
To jest ok, czy nie?
Jeśli nie to pokaż jeden wiersz: print_r($resultw); (wydrukuj w tej pętli PHP).
kasior
Nie do końca jest ok. Zobacz kawałek wyniku:

  1. Rzeźnik -- EKU 8EV1 -- |
  2. Kalandyk -- CNA 66VC -- |
  3. Bzdyra -- CNA 2M80 -- |
  4. Krawczyk -- CB 9964V -- |
  5. Jasiński -- CB 8362W -- |
  6. Ene -- CB 8361W -- |
  7. -- EKU 8EV1 -- Korbal |


patrz na rejestrację EKU 8EV1 - to się nie składa. (out) jest w pierwszym rzędzie a gdzieś dalej (in). Nie wchodza obok siebie
Specjalnie dodałem kreski,zeby oddzielić i podkreślić wiersze
trueblue
Nie ma to znaczenia.
A gdzie jest Direction (IN, OUT)?
Pokaż ten sam kawałek drukują w pętli PHP: print_r($resultw);

P.S. Uprość pętlę w PHP - jest w moim poście z przykładem pętli w Smarty.
kasior
  1. Array ( [direction] => IN [0] => IN [graph_id] => 5496 [1] => 5496 [driver] => 138 [2] => 138 [week] => 15 [3] => 15 [status] => on truck [4] => on truck [color]
  2. => b3b3b3 [5] => b3b3b3 [note] => [6] => [truck] => [7] => [infoequipment] => [8] => [infoservice] => [9] => [client] => [10] => [coach] => [11] => [driver_id] =>
  3. 138 [12] => 138 [name] => Ioan [13] => Ioan [last_name] => Sandulea [14] => Sandulea [last_name2] => [15] => [active] => 1 [16] => 1 [phone] => [17] => [phone2]
  4. => [18] => [adr] => 1 [19] => 1 [system] => 6-2 [20] => 6-2 [adddate] => 2014-03-28 15:03:41 [21] => 2014-03-28 15:03:41 [lang] => [22] => [type] => CC [23] =>
  5. CC [country] => Romania [24] => Romania [weeks] => w1:w2:w3:w4:w5:w6:w7:w8:w9:w10:w11:w12:w13:w14:w15:w16:w17:w18:w19:w20:w21:w22:w23:w24:w25:w26:w27:w28:w29:w30:w31:w32:w33:w34:w35:w36:w37:w38:
  6. w39:w40:w41:w42:w43:w44:w45:w46:w47:w48:w49:w50:w51:w52 [25] => w1:w2:w3:w4:w5:w6:w7:w8:w9:w10:w11:w12:w13:w14:w15:w16:w17:w18:w19:w20:w21:w22:w23:w24:w25:w26:w27:w28:w29:w30:w31:w32:w33:w34:w35:w36:w37:w38:
  7. w39:w40:w41:w42:w43:w44:w45:w46:w47:w48:w49:w50:w51:w52 [groups] => 2 [26] => 2 )


Pętlę oczywiście uprościłem, na tamtej tylko jeden rekord wyświetlało
trueblue
Ok, dzięki.
A jaki jest klient dla tych dwóch rekordów, które podałeś wcześniej (rejestracja EKU 8EV1).
kasior
No akurat nie ma. Może to ma jakis związek,ze nie ma wszystkich danych jeszcze? Myślałem,ze jak ich nie będzie to beda puste pola.
Spróbuje to odpalić z tygodniem w którym są wszystkie dane
trueblue
Akurat tu tak nie będzie, ale może to rozwiązanie Cię zadowoli:

  1. for ($i=0;$i<$num;$i++){
  2. $resultw = $stmt->fetch();
  3. $wr[empty($resultw['client'])?("brak-".$i):$resultw['client']][$resultw['truck']][strtolower($resultw['direction'])]=$resultw['driver'];
  4.  
  5. }
kasior
To dalej nie składa wierszy do kupy
trueblue
Sprawdź czy obydwie rejestracje EKU, nie mają czasem spacji przed lub po.
kasior
Nie maja. Zresztą to jedno i to samo pobierane z bazy i wrzucane w odpowiednie pola.

Moze zobrazuje sytuację to będzie lepiej.
mam ładna tabelke z kierowcami , trzymajmy sie nazwy - OUT



Nastepna tabelka przedstawia IN



Tabelka którą teraz chcę uzyskać wyglądałaby tak biorąc pod uwage,ze nie zawsze są wszystkie dane (np wchodzi dwóch na jednego trucka bo jeden się uczy) lub nie ma klienta lub nie ma wchodzącego np.



Jest to po prostu takie zestawienie wszystkiego
trueblue
W jednym się myliłem, rekordy bez klientów nie będą się wzajemnie nadpisywać w docelowej tabeli. Można więc wrócić do poprzedniego rozwiązania.
Z tego co pokazujesz trudno wywnioskować czy są tam spacje czy nie, bo być może program generujący te widoki je usuwa.

Ja przetestowałem na tabeli z danymi w PHP, działa bez problemu, może brakować klienta, jak i IN lub OUT:

  1. $arr[]=array('direction'=>'IN','driver'=>'kowalski','truck'=>'EKU 8EV1','client'=>'klient');
  2. $arr[]=array('direction'=>'OUT','driver'=>'nowak','truck'=>'EKU 8EV1','client'=>'klient');
  3. $arr[]=array('direction'=>'OUT','driver'=>'nowak2','truck'=>'AAA 2659','client'=>null);
  4. $arr[]=array('direction'=>'IN','driver'=>'kowalski2','truck'=>'AAA 2659','client'=>null);
  5. $arr[]=array('direction'=>'OUT','driver'=>'nowak3','truck'=>'BBB 2659','client'=>null);
  6. $arr[]=array('direction'=>'IN','driver'=>'kowalski3','truck'=>'BBB 2659','client'=>null);
  7. $arr[]=array('direction'=>'OUT','driver'=>'nowak3','truck'=>'CCC 2659','client'=>'marian');
  8.  
  9.  
  10. $wynik=array();
  11. foreach($arr as $row){
  12. $wynik[$row['client']][$row['truck']][strtolower($row['direction'])]=$row['driver'];
  13. }
  14. $smarty->assign('wynik',$wynik);
  15. $smarty->display('test.tpl');


To co generuje test.pl:

OUT,truck,IN,client
nowak,EKU 8EV1,kowalski,klient
nowak2,AAA 2659,kowalski2,
nowak3,BBB 2659,kowalski3,
nowak3,CCC 2659,,marian

Możesz jeszcze spróbować tak:
  1. $wynik[trim($row['client'])][trim($row['truck'])][strtolower($row['direction'])]=$row['driver'];

kasior
ok. czyli co zostawiam z tamtego kodu?? bo już się zakręciłem. począwszy od zapytania sql
trueblue
  1. for ($i=0;$i<$num;$i++){
  2. $resultw = $stmt->fetch();
  3. $wr[trim($resultw['client'])][trim($resultw['truck'])][strtolower($resultw['direction'])]=$resultw['driver'];
  4.  
  5. }
kasior
a w smarty nic już nie przerabiałeś? bo ja ciągle mam bajzel. jeszcze raz cały kod mój.:

  1. $sql = 'CALL replacement ('.$changeweek.')';
  2. $stmt = $hDB->prepare($sql);
  3. $stmt->execute();
  4. $num = $stmt->rowCount();
  5.  
  6. for ($i=0;$i<$num;$i++){
  7. $resultw = $stmt->fetch();
  8. $wr[trim($resultw['client'])][trim($resultw['truck'])][strtolower($resultw['direction'])]=$resultw['driver'];
  9. }
  10.  
  11. $smarty->assign('wr',$wr);



Kod
OUT,truck,IN,client<br /><br />
                    {foreach from=$wr key=client item=tmp}
                        {foreach from=$tmp key=truck item=drivers}
                            {$drivers.out} -- {$truck} -- {$drivers.in}  |<br />
                        {/foreach}
                    {/foreach}
trueblue
W Smarty nic.
Wcześniej pisałeś o bałaganie kiedy jakiejś pętli nie usunąłeś.
Czym teraz bałagan się objawia?
kasior
Podałem cały mój kod. już nic zbędnego w nim nie ma - najwyzej cos brakuje. W twoim ostatnim przykładzie jest foreach a ja miałem wrzucić for - nie wiem czy to to czy jak.. Wróciliśmy do tego samego wyniku:

tu akurat są id-ki ale to nie ma większego znaczenia teraz

  1. OUT,truck,IN,client
  2.  
  3. 115 -- WGM 31K8 -- |
  4. 7 -- EKU 8EV7 -- |
  5. 65 -- EKU 8EV3 -- |
  6. 60 -- CNA 3C78 -- |
  7. 104 -- CNA 3C76 -- |
  8. 36 -- EKU 8EV1 -- |
  9. 19 -- CNA 66VC -- |
  10. 67 -- CNA 2M80 -- |
  11. 23 -- CB 9964V -- |
  12. 48 -- CB 8362W -- |
  13. 116 -- CB 8361W -- |
  14. -- EKU 8EV1 -- 22 |
  15. 61 -- -- 138 |
  16. 129 -- EKU 3ER5 -- |
  17. 92 -- CNA 3M82 -- |
  18. 117 -- EKU 3ER4 -- |
  19. 119 -- CNA 8U78 -- |
  20. 108 -- CNA 69VX -- |
  21. 128 -- CNA 39TH -- |
  22. 127 -- CNA 6T85 -- |
  23. 139 -- CNA 47TM -- |
  24. 49 -- CB 9374V -- |
  25. 141 -- CB 8342W -- |
trueblue
Bardziej mnie interesuje co masz w $wr, dla tego fragmentu, czyli: print_r($wr);
kasior
A proszę bardzo, oto mój debug:

  1. Debug:
  2.  
  3. Array
  4. (
  5. [WGM 31K8] => Array
  6. (
  7. [out] => 115
  8. )
  9. )
  10.  
  11. Debug:
  12.  
  13. Array
  14. (
  15. [EKU 8EV7] => Array
  16. (
  17. [out] => 7
  18. )
  19. )
  20.  
  21. Debug:
  22.  
  23. Array
  24. (
  25. [EKU 8EV3] => Array
  26. (
  27. [out] => 65
  28. )
  29.  
  30. [CNA 3C78] => Array
  31. (
  32. [out] => 60
  33. )
  34.  
  35. [CNA 3C76] => Array
  36. (
  37. [out] => 104
  38. )
  39. )
  40.  
  41. Debug:
  42.  
  43. Array
  44. (
  45. [EKU 8EV1] => Array
  46. (
  47. [out] => 36
  48. )
  49.  
  50. [CNA 66VC] => Array
  51. (
  52. [out] => 19
  53. )
  54.  
  55. [CNA 2M80] => Array
  56. (
  57. [out] => 67
  58. )
  59.  
  60. [CB 9964V] => Array
  61. (
  62. [out] => 23
  63. )
  64.  
  65. [CB 8362W] => Array
  66. (
  67. [out] => 48
  68. )
  69.  
  70. [CB 8361W] => Array
  71. (
  72. [out] => 116
  73. )
  74. )
  75.  
  76. Debug:
  77.  
  78. Array
  79. (
  80. [EKU 8EV1] => Array
  81. (
  82. [in] => 22
  83. )
  84.  
  85. [] => Array
  86. (
  87. [in] => 138
  88. [out] => 61
  89. )
  90. )
  91.  
  92. Debug:
  93.  
  94. Array
  95. (
  96. [EKU 3ER5] => Array
  97. (
  98. [out] => 129
  99. )
  100.  
  101. [CNA 3M82] => Array
  102. (
  103. [out] => 92
  104. )
  105. )
  106.  
  107. Debug:
  108.  
  109. Array
  110. (
  111. [EKU 3ER4] => Array
  112. (
  113. [out] => 117
  114. )
  115.  
  116. [CNA 8U78] => Array
  117. (
  118. [out] => 119
  119. )
  120.  
  121. [CNA 69VX] => Array
  122. (
  123. [out] => 108
  124. )
  125.  
  126. [CNA 39TH] => Array
  127. (
  128. [out] => 128
  129. )
  130. )
  131.  
  132. Debug:
  133.  
  134. Array
  135. (
  136. [CNA 6T85] => Array
  137. (
  138. [out] => 127
  139. )
  140.  
  141. [CNA 47TM] => Array
  142. (
  143. [out] => 139
  144. )
  145. )
  146.  
  147. Debug:
  148.  
  149. Array
  150. (
  151. [CB 9374V] => Array
  152. (
  153. [out] => 49
  154. )
  155. )
  156.  
  157. Debug:
  158.  
  159. Array
  160. (
  161. [CB 8342W] => Array
  162. (
  163. [out] => 141
  164. )
  165. )


PS>> fajnie ,ze pomagasz smile.gif
trueblue
Czekaj, czekaj, a czemu jest kilka osobnych tablic (w powyższym debugu)?
Czy czasem nie jest tak, że np. EKU 8EV1 przynależy do dwóch różnych klientów (raz z out=36, a raz z in=22)?
kasior
Dobra myśl. Sprawdziłem. W jednym przypadku jest klient - w innym nie ma. Generalnie najważniejsi sa kierowcy i trucki - klient może byc ale nie musi - to nie powinno byc najistotniejsze. Dane są wprowadzane w trakcie i np juz wiadomo,ze gość wchodzi na tego trucka ale jeszcze nie wiadomo gdzie pojedzie i dla kogo - to może wyjśc póżniej gdyż planowanie jest na cały rok. moze to rożświetli bardziej temat
trueblue
Jeśli nie interesuje Cię klient, to spróbuj tak (ale nie może być sytuacji, że jest więcej niż raz występuje ta sama rejestracja z IN (lub z OUT)):
  1. for ($i=0;$i<$num;$i++){
  2. $resultw = $stmt->fetch();
  3. $wr[$resultw['truck']][strtolower($resultw['direction'])]=$resultw['driver'];
  4. }


  1. OUT,truck,IN<br/>
  2. {foreach from=$wr key=truck item=drivers}
  3. {$drivers.out},{$truck},{$drivers.in}<br/>
  4. {/foreach}
kasior
No i teraz działa smile.gif
Nie rozumiem tylko tej kolejności. Zmieniłem driver na last_name i dopisałem name i to jest w porządku:

  1. $wr[$resultw['truck']][strtolower($resultw['direction'])]=$resultw['last_name'].' '.$resultw['name'];


dlaczego jak na końcu jeszcze dopiszę tego klienta nieszczęsnego (bo może sie przecież pojawiac jak jest) to on mi wskakuje w środek zaraz po in?

  1. $wr[$resultw['truck']][strtolower($resultw['direction'])]=$resultw['last_name'].' '.$resultw['name'].' '.$resultw['client'];


EDIT>>> Już wiem. Oświeciło mnie i chyba zrozumiałem wszystko smile.gif Bo przypisany jest w bazie do IN smile.gif

A jak chciałbym w tym foreach pokazać jeszcze kilka pól z bazy na których mi zależy to jak?? {$drivers.pole} ?

Dobra. Pokminię sobie z tym jak i z tym,zeby to w tą tabelkę zapakować smile.gif Wielkie podziękowania. Zaraz klikam pomógł smile.gif
trueblue
W razie problemów pisz. Możliwe też jest rozwiązanie sytuacji kiedy jest kilku kierowców przypisanych od IN lub OUT.
kasior
Jest wporzo. ładnie wygląda już. Jeżeli miałbym o cos pytać to czy jest mozliwość pokazywania jakiegoś pola np w IN a niepokazywania w OUT zy to zawsze jest zespolone?
Np dopisuje sobie pole ADR i pokazuje mi sie ono po lewej i prawej stronie, a gdybym np chciał pokazywac je tylko dla prawej srony czyli IN bo akurat wtedy to mnie interesuje?
trueblue
Tym akurat sterujesz już w szablonie, dodając lub odejmując {$drivers.out} {$drivers.in}
kasior
{$adr.drivers.out} ?
{$drivers.adr.out} ?
{$drivers.out.adr} ?

Nic z tego nie działa.
trueblue
Miałem na myśli usuwanie {$drivers.in} {$drivers.out} z szablonu.

Podane przez Ciebie rozwiązanie nie zadziała, bo nie ma takich zmiennych. Jeśli chcesz dopisywać więcej informacji do IN oraz OUT, musisz przebudować skrypt PHP:
  1. $wr[$resultw['client']][$resultw['truck']][strtolower($resultw['direction'])]=array('driver'=>$resultw['driver'],'adres'=>$resultw['adres']);

Wcześniej pod "in" była zmienna, teraz jest tablica, więc w Smarty odwołasz się tak:
{$drivers.in.driver} zamiast {$drivers.in}
no, a dla adresu {$drivers.in.adres}, dla innych pól musisz rozszerzyć powyższą tablicę w PHP, w szablonie natomiast odwołasz się analogicznie jak dla tych dwóch.
Oczywiście Twoje zapytanie do bazy, dla przykładu powyżej, zwraca pole adres, być może u Ciebie nazywa się inaczej.
kasior
Tak to właśnie zrobiłem zanim zdazyłes napisać smile.gif Dzieki.
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.