Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [Smarty][MySQL][PHP] Rysowanie tabelki (krzyżowej?)
Forum PHP.pl > Forum > Przedszkole
kasior
Pomózcie proszę, bo juz sie zakręciłem zupełnie. Mam dane, ale z rysowaniem tego juz problem.
Ale po kolei. Są dwie tabele: drivers i graph. W pierwszej sa kierowcy, w drugiej sa zapisywane dane ich statusów w poszczególnym tygodniu (np "w aucie")

Wygląda to tak:



Jedynki sa wpisane tylko na razie,zeby coś było widać.

Najpierw wyciągam z bazy dane:

  1. $sql= 'select * from drivers where active = "1"';
  2. $stmt = $hDB->prepare($sql);
  3. $stmt->execute();
  4. $num = $stmt->rowCount();
  5.  
  6.  
  7. if ($num>0){
  8. $art = $stmt->setFetchMode(PDO::FETCH_ASSOC);
  9. for ($i=0;$i<$num;$i++){
  10. $art = $stmt->fetch();
  11. $tmpart[] = $art;
  12. $cat_ids[$i] = $tmpart[$i]['driver_id'];
  13.  
  14. }
  15. }
  16.  
  17. foreach ($cat_ids as $cat) {
  18.  
  19. $sql= 'select * from graph where driver = :driver';
  20. $stmt = $hDB->prepare($sql);
  21. $stmt->bindParam(':driver',$cat,PDO::PARAM_INT);
  22. $stmt->execute();
  23. $num = $stmt->rowCount();
  24.  
  25. if ($num>0){
  26. $arty = $stmt->setFetchMode(PDO::FETCH_ASSOC);
  27. for ($i=0;$i<$num;$i++){
  28. $arty = $stmt->fetch();
  29. $arty['note'] = html_entity_decode(stripslashes($arty['note']),ENT_QUOTES,'utf-8');
  30. $tmparty[$arty['driver']][] = $arty;
  31. }
  32.  
  33. }
  34.  
  35. }
  36. $smarty->assign('lsc',$tmpart);
  37. $smarty->assign('plsc',$tmparty);



nastepnie rysuję sobie wiersze i komórki:

  1. <!-- zawartośc tabel -->
  2. <div class="rightd" id="rightd">
  3. {section start=0 step=1 name=tmpart loop=$lsc}
  4. <div style="width:2765px;overflow:hidden;">
  5.  
  6. {assign var=idc value=$lsc[tmpart].drivers_id}
  7.  
  8. {section start=0 step=1 name=arty loop=52}
  9. {if $smarty.section.arty.rownum == $plsc[$idc][arty].week}
  10. <div data-week="{$smarty.section.arty.rownum}" data-driver_id="{$lsc[tmpart].driver_id}" data-driver_name="{$lsc[tmpart].name}" class="cell tips w{$smarty.section.arty.rownum}" id ="w{$smarty.section.arty.rownum}d{$lsc[tmpart].driver_id}" tip="week {$smarty.section.arty.rownum} " onClick="showdial('klasa', '500', this);" >
  11. 1
  12. </div>
  13. {else}
  14. <div data-week="{$smarty.section.arty.rownum}" data-driver_id="{$lsc[tmpart].driver_id}" data-driver_name="{$lsc[tmpart].name}" class="cell tips w{$smarty.section.arty.rownum}" id ="w{$smarty.section.arty.rownum}d{$lsc[tmpart].driver_id}" tip="week {$smarty.section.arty.rownum} " onClick="showdial('klasa', '500', this);" >
  15.  
  16. </div>
  17. {/if}
  18. {/section}
  19.  
  20.  
  21. <div class="clearing"></div>
  22.  
  23. </div>
  24. {/section}
  25. </div>
  26. <div class="clearing"></div>
  27. <!-- end zawartośc tabel -->



N i wiem,że w rysowaniu kkomórek jest zle bo póki co mam puste komórki i ani tak ani siak.
Poprosze o pomoc.
nospor
Po pierwsze zacznij od poprawnego przygotowania danych. To co ty wybrales to najgorszą z mozliwych opcji...
http://nospor.pl/grupowanie-wynikow.html

Majac juz poprawnie i optymalnie przygotowane dane, nie wiem w czym problem.

Lecisz po userach i generujesz wiersz dla kazdego usera. Standarrdowo generujesz komorki na numer i nazwisko, a potem generujesz komorki tyle ile masz tych tygodni.
kasior
No to mam tyle tak? I dalej stoję. sad.gif

  1. $sql= 'select d.driver_id DID, d.active, g.driver GID, g.* from drivers d left join graph g on d.driver_id = g.driver where d.active = "1"';
  2. $stmt = $hDB->prepare($sql);
  3. $stmt->execute();
  4. $stmt->fetchAll(PDO::FETCH_GROUP);
nospor
To zamiast stac, usiadź i przecytaj co masz napisane i podane na tacy w linku co ci podalem
kasior
przecież widze, ale ty nie widzisz,ze ja uzywam PDO i musze jakoś to przepisać. sek w tym,że maam chyba pomroczność jasną i nic mi nie wychodzi. Naprawde nie chcesz napisać kilka linijek,zeby nakierowac?? Dla was to proste a ja dłubie to 3 dzień bez skutku.
nospor
Cytat
ale ty nie widzisz,ze ja uzywam PDO
No bez zartow.... co ma piernik do wiatraka? U mnie sa pobrane dane z zapytania i ty musisz pobrac danez z zapytania. Pozniej obrobka jest taka sama niezaleznie czy to PDO czy nie.
kasior
ok ok smile.gif Pobrałem dane i mam teraz cos takiego:

  1. (
  2. [7] => Array
  3. (
  4. [0] => Array
  5. (
  6. [graph_id] => 17
  7. [driver] => 7
  8. [week] => 1
  9. [status] => 2
  10. [color] => 91de2d
  11. [note] =>
  12. [truck] => 3
  13. )
  14.  
  15. [1] => Array
  16. (
  17. [graph_id] => 18
  18. [driver] => 7
  19. [week] => 10
  20. [status] => 4
  21. [color] => fff555
  22. [note] =>
  23. [truck] => 3
  24. )
  25.  
  26. [2] => Array
  27. (
  28. [graph_id] => 19
  29. [driver] => 7
  30. [week] => 8
  31. [status] => 2
  32. [color] => 91de2d
  33. [note] =>
  34. [truck] => 0
  35. )
  36.  
  37. )
  38.  
  39. [8] => Array
  40. (
  41. [0] => Array
  42. (
  43. [graph_id] => 20
  44. [driver] => 8
  45. [week] => 7
  46. [status] => 3
  47. [color] => ff4444
  48. [note] =>
  49. [truck] => 0
  50. )
  51.  
  52. [1] => Array
  53. (
  54. [graph_id] => 21
  55. [driver] => 8
  56. [week] => 1
  57. [status] => 3
  58. [color] => ff4444
  59. [note] =>
  60. [truck] => 0
  61. )
  62.  
  63. )
  64.  
  65. )


wyświetlam:

  1. <!-- zawartośc tabel -->
  2. <div class="rightd" id="rightd">
  3. {section start=0 step=1 name=tmpart loop=$lsc}
  4. <div style="width:2765px;overflow:hidden;">
  5.  
  6. {assign var=idc value=$lsc[tmpart].driver_id}
  7.  
  8. {section start=0 step=1 name=arty loop=$plsc[$idc]}
  9.  
  10.  
  11. <div data-week="{$smarty.section.arty.rownum}" data-driver_id="{$lsc[tmpart].driver_id}" data-driver_name="{$lsc[tmpart].name}" class="cell tips w{$smarty.section.arty.rownum}" id ="w{$smarty.section.arty.rownum}d{$lsc[tmpart].driver_id}" tip="week {$smarty.section.arty.rownum} " onClick="showdial('klasa', '500', this);" >
  12. {$plsc[$idc][arty].week}
  13. </div>
  14. {sectionelse}
  15.  
  16. {/section}
  17.  
  18.  
  19. <div class="clearing"></div>
  20.  
  21. </div>
  22. {/section}
  23. </div>
  24. <div class="clearing"></div>
  25. <!-- end zawartośc tabel -->
  26.  



i mam:



Niby ok, ale co tu dopisac w wyświetlaniu, zeby puste komórki pokazało jak nie ma danych questionmark.gif

mogę zronbić srodkowa pętle tak:

  1. {section start=0 step=1 name=arty loop=52}
  2.  
  3.  
  4. <div data-week="{$smarty.section.arty.rownum}" data-driver_id="{$lsc[tmpart].driver_id}" data-driver_name="{$lsc[tmpart].name}" class="cell tips w{$smarty.section.arty.rownum}" id ="w{$smarty.section.arty.rownum}d{$lsc[tmpart].driver_id}" tip="week {$smarty.section.arty.rownum} " onClick="showdial('klasa', '500', this);" >
  5. {if $plsc[$idc][arty].week}{$plsc[$idc][arty].week}{else}-{/if}
  6. </div>
  7. {sectionelse}
  8.  
  9. {/section}


i wynik:


ale ciągle nie wskakuja komórki na swoje miejsca.
nospor
Gdy wyswietlasz dany wiersz, to masz w nim zrobic petle po tygodniach i dopiero w tej petli, jesli dany user ma dane z tego tygodnia, to wyswietlasz komorke z danymi, jak nie ma, to wyswietlasz pustą komorke
kasior
No własnie sek w tym jak w tym konkretnym przypadku, jeżeli nie mam wpisanych danych dla wszystkich tygodni dla usera. Ta tabelka słuzy min do właśnie wpisywania tych danych. Klika sie komórke , otwiera sie okienko modalne które pobiera data-week i data-driver_id i ajaxowo juz wszystko tam pokazuje i zapisuje. To działa super. Brakuje tylko tego gównianego wyswietlania tabelki.

Wiem,ze mnie zmuszasz do myslenia - i dobrze, ale chyba czegos nie trybie albo nie wiem. Pewnie trzeba jeszcze jakaś pętke w smarty zastosowac albo cos.. bo musze jakoś zadac ten warunek,że jeżeli nie ma danych to ma byc pusta komórka, a jak ma dane to np zakolorowana kolorem danego statusu (to akurat nie problem)
nospor
Pseudokod:

petla po userach {
TR
TD - numer wiersza
TD - imie nazwisko
petla po tablicy z tygodniami {
TD - jesli aktualny user ma dane dla aktualnego tygodnia to wyswietl te dane, jak nie to -
}
}
gdzie tablica z tygodniami to tablica, w ktorej trzymasz wszystkie tygodnie jakie mogą byc: 1,2,3,4...... 52

I juz.
kasior
Ja to wszystko kumam, sęk w tym,ze nie mam tablicy w której trzymam wszystkie tygodnie. spójrz w kody - rysuje tygodnie za pomoca pętli
  1. {section start=0 step=1 name=arty loop=52}


Jedyne co moge tu pobrac to $smarty.section.arty.rownum gdzie ta wartosc jest numerem tygodnia właśnie.
Juz próbowałem:

  1. {section start=0 step=1 name=arty loop=52}
  2.  
  3. {if $plsc[$idc][arty].week and $smarty.section.arty.rownum == $plsc[$idc][arty].week}
  4.  
  5. <div>OK</div>
  6.  
  7. {else}
  8.  
  9. <div> - </div>
  10. {/if}
  11. {/section}


czyli jeżeli jest week i jeżeli on sie równa nr w pętki to wyswietla tak a jak nic nie ma to inaczej - bez skutku a raczej inne cuda wychodzą


Ty mi dobrze przekazujesz i ja to rozumiem dokładnie, problem tkwi tylko w odpowiednim tego wpisaniu.

nospor
{if $plsc[$idc][arty].week and $smarty.section.arty.rownum == $plsc[$idc][arty].week}
Widac ten warunek nie jest prawdziwy. Sprawdz co zawiera dokladnie kazdy element, ktory tu porownujesz i bedziesz mial odpowiedz.
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.