Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> [MySQL][PHP]Przekazanie obiektu do widoku
Marek607
post 21.10.2014, 19:39:07
Post #1





Grupa: Zarejestrowani
Postów: 42
Pomógł: 3
Dołączył: 4.03.2010

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


Witam,

Mam problem ktory idealnie nadaje sie na przedszkole i nie mogę nigdzie znaleść rozwiązania.

Mam funkcje która pobiera sobie dane:

  1. function pobierz_liste_bydla($user_id) {
  2. $lacz = lacz_bd();
  3.  
  4. $wynik = $lacz->query("select * from bydlo where user_id = '".$user_id."'") or die(mysqli_error($lacz));
  5. if(!$wynik) {
  6. return false;
  7. }
  8.  
  9. //tworzymy tablice url
  10. $tablica_bydla = $wynik->fetch_object();
  11.  
  12. return $lista_bydla;
  13. }



I funkcje która ma je wyświetlać:

  1. function wyswietl_liste_bydla($tablica_bydla) {
  2. ?>
  3.  
  4. <br />
  5.  
  6. <form name="tabela_zak" action="usun.php" method="post">
  7.  
  8. <table width="300" cellpadding="2" cellspacing="0">
  9.  
  10. <?php
  11. $kolor = "#cccccc";
  12.  
  13. echo "<tr bgcolor=\"".$kolor."\"><td><strong></strong></td>";
  14.  
  15. echo "<td><strong>Usuń?</strong></td><td><strong>Usuń?</strong></td></tr>";
  16. $ile_bydla = "60";
  17. if ($ile_bydla > 0 ) {
  18. echo "<table style='border-collapse: collapse;'>
  19. <tr>
  20. <th style='width: 20px;'>id (sort)</th>
  21. <th style='width: 150px;'>Imię</th>
  22. <th style='width: 200px;'>Numer</th>
  23. <th style='width: 80px;'>Rasa</th>
  24. <th style='width: 200px;'>Data urodzenia</th>
  25. <th style='width: 200px;'>Numer Matki</th>
  26. <th style='width: 80px;'>Płeć</th>
  27. <th style='width: 80px;'>operacja</th>
  28. </tr>";
  29. for($i=0; $i<$ile_bydla; $i++) {
  30. echo "<tr style='height: 30px;'>
  31. <th class='tab_2'>".$tablica_bydla->id."</th>
  32. <th class='tab_2'>".$tablica_bydla->nazwa."</th>
  33. <th class='tab_2'>".$tablica_bydla->numer."</th>
  34. <th class='tab_2'>".$tablica_bydla->rasa."</th>
  35. <th class='tab_2'>".$tablica_bydla->data_urodzenia."</th>
  36. <th class='tab_2'>".$tablica_bydla->numer_matki."</th>
  37. <th class='tab_2'>".$tablica_bydla->plec."</th>
  38. <th class='tab_2'>
  39. <a href=''><img src='images/edit.png' alt='edytuj' title=skonfiguruj'/></a>
  40. <a href=''><img src='images/settingsadd.png' alt='edytuj usługi dodatkowe' title='skonfiguruj dodatkowe opcje monitoringu'/></a>
  41. <a href=''><img src='images/delete.png' alt='usun' title='usun'/></a>
  42. </th>
  43. </tr>";
  44. }
  45. }
  46. }


Napisałem to samo w jednym pliku i tutaj działa:

  1. $zapytanie ="select * from bydlo where user_id=".$user_id."";
  2. $wynik=$bd->query($zapytanie);
  3. $ile=$wynik->num_rows;
  4. if ($ile > 0 ) {
  5. echo "<table style='border-collapse: collapse;'>
  6. <tr>
  7. <th style='width: 20px;'>id (sort)</th>
  8. <th style='width: 150px;'>Imię</th>
  9. <th style='width: 200px;'>Numer</th>
  10. <th style='width: 80px;'>Rasa</th>
  11. <th style='width: 200px;'>Data urodzenia</th>
  12. <th style='width: 200px;'>Numer Matki</th>
  13. <th style='width: 80px;'>Płeć</th>
  14. <th style='width: 80px;'>operacja</th>
  15. </tr>";
  16. for($i=0; $i<$ile; $i++) {
  17. $wiersz = $wynik->fetch_object();
  18. echo "<tr style='height: 30px;'>
  19. <th class='tab_2'>".$wiersz->id."</th>
  20. <th class='tab_2'>".$wiersz->nazwa."</th>
  21. <th class='tab_2'>".$wiersz->numer."</th>
  22. <th class='tab_2'>".$wiersz->rasa."</th>
  23. <th class='tab_2'>".$wiersz->data_urodzenia."</th>
  24. <th class='tab_2'>".$wiersz->numer_matki."</th>
  25. <th class='tab_2'>".$wiersz->plec."</th>
  26. <th class='tab_2'>
  27. <a href='?page=admin_panel&act=edit&id=2'><img src='images/edit.png' alt='edytuj' title=skonfiguruj serwer'/></a>
  28. <a href='?page=edit_other&id=2'><img src='images/settingsadd.png' alt='edytuj usługi dodatkowe' title='skonfiguruj dodatkowe opcje monitoringu'/></a>
  29. <a href='?page=del_proof&id=2'><img src='images/delete.png' alt='usun' title='usun serwer'/></a>
  30. </th>
  31. </tr>";
  32. }
  33. echo "</table>";
  34. }


Widze gdzie jest różnica tzn że w 2 przykładzie dane z obiektu są pobierane w petli a tutaj je wysyłam stąd w 2 przykładzie mam ładnie pokazane wszystkie przykłady a w pierwszym mam pętle pierwszego rekordu ( bo tylko go przekazuje).


Pytania sa 2:

1) Jak przenieść for.... do funkcji pobierz_liste...... by w widoku czyli wyswietl_liste.... mógł sobie tylko podać nazwy $tablica_bydla->numer itp.?
2) Jak z funkcji pobierającej dane przekazać liczbe znalezionych rekordów? mam zrobić tam dodatkową funkcje liczącą czy poprostu dodać drugi argument do wyswietl_liste_bydla i jemu przekazać ilość?

Dzięki za pomoc.
Go to the top of the page
+Quote Post
owca_82
post 21.10.2014, 21:02:02
Post #2





Grupa: Zarejestrowani
Postów: 77
Pomógł: 8
Dołączył: 22.04.2012

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


Ad 1. No normalnie ... wstaw po prostu tą pętle do tej funkcji - samo fetch_object pobiera tylko jeden wiersz wyniku, dlatego musisz zrobić pętle za pomocą właściwości num_rows obiektu wyniku - całość tego robisz po stronie modelu i zwracasz dane.

Ad 2. Nie musisz przekazywać żadnej ilości, po prostu poszczególne znalezione rekordy dodajesz do tablicy zanim je przekażesz do widoku, a w nim jeżeli chcesz wyświetlić wszystko robisz pętle i tyle.


Ogólnie to powinno działać tak:

1. Odpowiednia metoda kontrolera zgłasza widokowi żądanie wyświetlenia odpowiednich rekordów przekazując mu obiekt modelu, oraz id żądania.
2. Widok pobiera sobie z modelu surowe dane, wczytuje odpowiedni szablon z elementami dynamicznymi, czyli ze wstawkami zmiennych i łączy wszystko w całość i wypluwa wszystko na wyjście.
Go to the top of the page
+Quote Post
Marek607
post 21.10.2014, 21:11:39
Post #3





Grupa: Zarejestrowani
Postów: 42
Pomógł: 3
Dołączył: 4.03.2010

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


OK, czyli pobierz dodałem:

  1. $ile=$wynik->num_rows;
  2. for($i=0; $i<$ile; $i++) {
  3. $tablica_bydla = $wynik->fetch_object();
  4. }
  5. return $tablica_bydla;
  6. }


Według tego skrypt wyświetlania powinien działać niezmieniony, jednak caly czas pokazuje mi pętle pierwszego rekordu - jak to rozgryść?
Możesz podać kod jak to powinno wyglądać? Po stronie widoku też mam dodać pętle?
Go to the top of the page
+Quote Post
owca_82
post 21.10.2014, 21:20:37
Post #4





Grupa: Zarejestrowani
Postów: 77
Pomógł: 8
Dołączył: 22.04.2012

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


Wyniki musisz wrzucić do tablicy, czyli tak:

  1. $tablica_bydla[] = $wynik->fetch_object();


I taką tablicę przekazujesz do widoku i tam również robisz pętle po niej jeżeli chcesz wyświetlić wszystkie dane z poszczególnych rekordów - można to oczywiście trochę modyfikować wczytując layout pojedynczego wyniku w wszystko składać w klasie widoku, ale to już inna bajka.
Go to the top of the page
+Quote Post
Marek607
post 21.10.2014, 21:43:50
Post #5





Grupa: Zarejestrowani
Postów: 42
Pomógł: 3
Dołączył: 4.03.2010

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


I nadal jestem w tym samym miejscu, bo obiekt mam przekazany, ale pokazuje mi tylko jeden rekord ( teraz już nie pierwszy a ostatni - mogę prosić o napisanie funkcji która wyświetli pokolei te rekordy? Bo to jest głownie problemem że nie wiem jak je obrobić i wyświetlić od strony widoku.
Go to the top of the page
+Quote Post
ixpack
post 21.10.2014, 22:36:15
Post #6





Grupa: Zarejestrowani
Postów: 248
Pomógł: 55
Dołączył: 1.06.2010
Skąd: mam to wiedzieć?

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


Stary... Zwracasz $tablica_bydla (jeden obiekt) tak?
I zobacz w swojej petli for tylko nadpisujesz swoj obiekt, ktory pozniej zwracasz...

Przerob tak:
  1. $ile=$wynik->num_rows;
  2. $tablica_bydla = array();
  3. for($i=0; $i<$ile; $i++) {
  4. $tablica_bydla[] = $wynik->fetch_object();
  5. }
  6. return $tablica_bydla;

i w widoku robisz:
  1. foreach($tablica_bydla as $bydle) {
  2. echo '<pre>Bydle[' . $bydle->id . ']: ' . print_r($bydle, 1) . '</pre>'; //oczywiscie ubierz to w html...
  3. }


Olej tabelki. Zobacz co moze css3 -> flex box. szybko, latwo.

Ten post edytował ixpack 21.10.2014, 22:41:49


--------------------
Łatwo jest być odważnym za murami własnego zamku.
Go to the top of the page
+Quote Post
Marek607
post 10.11.2014, 17:23:20
Post #7





Grupa: Zarejestrowani
Postów: 42
Pomógł: 3
Dołączył: 4.03.2010

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


Dzięki ci bardzo - działa właśnie tak jak chciałem!

Pozwole sobie odświeżyć temat - jak z takiego zapytania pobrać wynik i jedną zmienną dać do innego zapytania?

Jak w widoku mam pętle foreach i wynik $bydle->id to chciałbym na podstawie tego wyniku zrobić zapytanie - ktoś pomoże mi to ugryść?

  1. foreach($tablica_bydla as $bydle) {
  2. //tu chce pobrać $bydle->id i sprawdzić w innej tabeli jaka jest nazwa dla tego id
  3. echo '<pre>Bydle[' . $bydle->id . ']: ' . print_r($bydle, 1) . '</pre>'; //oczywiscie ubierz to w html...
  4. }


w strukturalnym poprostu robiłem po foreach zapytanie ale nie wiem jak to zrobić by nie było to w widoku.

//EDIT

Zrobiłem:

  1. foreach($tablica_zdarzen as $bydle) {
  2. require_once('funkcje/funkcje_obora.php');
  3. $lacz = lacz_bd();
  4. $zapytanie = $lacz->query("select * from bydlo where id = '".$bydle->bydlo_id."'") or die(mysqli_error($lacz));
  5. $wiersz = $zapytanie->fetch_object();


nazwe wywołuje jako $wiersz->nazwa, ale takie coś mieć w widoku to wstyd facepalmxd.gif

czy przerobienie tego na zasadzie:
  1. foreach($tablica_zdarzen as $bydle) {
  2. if ($nazwa_bydla = pobierz_nazwe_bydla(".$bydle->bydlo_id.")) {
  3. wyswietl_nazwe_bydla($nazwa_bydla);
  4. }


będzie bardziej zgodne z oddzielaniem modelu/kontrolera od widoku?
jak to ugryść by miało ręce i nogi?

Ten post edytował Marek607 10.11.2014, 18:08:33
Go to the top of the page
+Quote Post

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

 



RSS Wersja Lo-Fi Aktualny czas: 19.04.2024 - 03:26