Skocz do zawartości
  • 0
naXe

Pętla foreach w szablonie

Pytanie

http://codepad.org/8wg7T9rL

kod z powyższego linka jak widać działa poprawnie, w szablonie stosuje podobny, ale już nie chce działać i zwraca poniższy błąd.

{{$data = [];}}
{{$i = 0;}}

{{foreach \IPS\Db::i()->select('*', 'players_stats_cache', [ 'id=?', \IPS\Request::i()->id ]) as $row}}
	{{$data[] = $row;}}
	{{$data[$i]['players'] = json_decode($data['players'], true);}}

	{{if $i++ > count($data)}}
		{{break;}}
	{{endif}}
{{endforeach}}

--- ten kod zwraca błąd :/ ---
{{foreach $data['players'] as $player}}
  {$player['gq_name']}
{{endforeach}}
  • [[Template playersstats/front/widgets/playerstats is throwing an error. This theme may be out of date. Run the support tool in the AdminCP to restore the default theme.]]
Edytowano przez naXe

Udostępnij ten post


Link to postu
Udostępnij na innych stronach

15 odpowiedzi na to pytanie

Polecane posty

  • 1

Jak już to powinno to być tak:

{{$data = [];}}
{{$i = 0;}}

{{foreach \IPS\Db::i()->select('*', 'players_stats_cache', [ 'id=?', \IPS\Request::i()->id ]) as $row}}
	{{$row['players'] = json_decode($row['players'], true);}}
	{{$data[] = $row;}}

	{{if $i++ > count($data)}}
		{{break;}}
	{{endif}}
{{endforeach}}


{{foreach $data as $playerData}}
    {{foreach $playerData['players'] as $player}}
        {$player['gq_name']}
    {{endforeach}}
{{endforeach}}

i powinno działać

Udostępnij ten post


Link to postu
Udostępnij na innych stronach
  • 0
{{$data = [];}}
{{$i = 0;}}

{{foreach \IPS\Db::i()->select('*', 'players_stats_cache', [ 'id=?', \IPS\Request::i()->id ]) as $row}}
	{{$data[$i]['players'] = json_decode($data['players'], true);}}

	{{if $i++ > count($data)}}
		{{break;}}
	{{endif}}
	{{$data[] = $row;}}
{{endforeach}}

{{foreach $row['players'] as $player}}
  {$player['gq_name']}
{{endforeach}}

PS. Masz odpalony Dev Mode?

Edytowano przez X3nO

Udostępnij ten post


Link to postu
Udostępnij na innych stronach
  • 0

Nie i kod z Twojego postu nie ma prawa działać.

Edytowano przez naXe

Udostępnij ten post


Link to postu
Udostępnij na innych stronach
  • 0

Ani jeden ani drugi nie będzie działać. wyszedłeś z pierwszej pętli więc nie masz już zmiennej $row[ 'players' ]

dodatkowo to:

{{$data[] = $row;}}
	{{$data[$i]['players'] = json_decode($data['players'], true);}}

	{{if $i++ > count($data)}}
		{{break;}}
	{{endif}}

jest jakieś debilne (bez obrazy)

Udostępnij ten post


Link to postu
Udostępnij na innych stronach
  • 0

Dlaczego debilne? Taki kod stosowałem kilka lat temu w aplikacji dla IPB3 i przechodził bez problemów.

Udostępnij ten post


Link to postu
Udostępnij na innych stronach
  • 0

Z kilku powodów

Starasz się pisać nowoczesny kod stosując skrótową notację np. dla tablic, czyli zamiast array() dajesz [], a nie stosujesz się do podstawowej zasady MVC. W pliku szablonu nie powinieneś a wręcz nie możesz mieć logiki, czyli pobierania i obrabiania danych. W szablonie powinieneś co najwyżej przelecieć pętlą po jakiejś tabeli i wyświetlić dane - koniec.

{{$data[$i]['players'] = json_decode($data['players'], true);}}

Używasz $i jako indeksu tablicy, ale pomijając go czyli jak dasz samo

{{$data[]['players'] = json_decode($data['players'], true);}}

osiągniesz dokładnie to samo.

kolejne w json_decode powinno być chyba $row[ 'players' ] a nie $data, bo do zmiennej $data to dopiero zapisujesz :)

{{if $i++ > count($data)}}
		{{break;}}
	{{endif}}

ten warunek nigdy nie zostanie spełniony, bo najpierw następuje porównanie, a później inkrementacja zmiennej

{{foreach $data['players'] as $player}}
  {$player['gq_name']}
{{endforeach}}

po zakończeniu pętli, która pobiera i obrabia dane odwołujesz się do elementu players tablicy, którego po prostu nie ma bo jest pod indeksem [0]['players'], [1]['players'] itp.

 

@X3nO Twój kod jest dopiero masakrą :P

{{$data[$i]['players'] = json_decode($data['players'], true);}}
...
{{$data[] = $row;}}

najpierw w indeksie 0 zapisujesz w ['players'] jakieś dane, a później całe row wrzucasz pod indeks 1. Przy następnym obrocie pętli indeks 1 zostanie nadpisany przez players i w indeks 2 znowu zapiszesz coś co nadpiszesz w kolejnym przebiegu pętli

{{foreach $row['players'] as $player}}
  {$player['gq_name']}
{{endforeach}}

dodatkowo tutaj odwołujesz się do zmiennej $row, której już dawno nie ma bo się skończyła po zakończeniu pierwszej pętli

Udostępnij ten post


Link to postu
Udostępnij na innych stronach
  • 0

To tylko dla przykładu użyłem kodu w szablonie, chcę pobrać dane w pliku PHP i w szablonie tylko wyświetlać wcześniej pobrane dane.
 

1 godzinę temu, Spanner napisał:

Używasz $i jako indeksu tablicy, ale pomijając go czyli jak dasz samo

Zgadza się, ale już w porównywaniach ( if ) nie można stosować [] więc użyłem 'własnego indeksowania'.

 

1 godzinę temu, Spanner napisał:

kolejne w json_decode powinno być chyba $row[ 'players' ] a nie $data, bo do zmiennej $data to dopiero zapisujesz :)

Nie wydaje mi się ;) 

 

1 godzinę temu, Spanner napisał:

ten warunek nigdy nie zostanie spełniony, bo najpierw następuje porównanie, a później inkrementacja zmiennej

Zostanie spełniony, iż użyłem tego kodu gdzie indziej i nie ma z nim problemu. A jest on po to, że nie wiem dlaczego do tablicy dodaje się kolejny klucz z pustymi wartościami.

 

@Spanner to jak powinno być, żeby działało? Już próbowałem kilku metod i każda zwraca błąd :/ 

Udostępnij ten post


Link to postu
Udostępnij na innych stronach
  • 0
7 minut temu, naXe napisał:

Zgadza się, ale już w porównywaniach ( if ) nie można stosować [] więc użyłem 'własnego indeksowania'.

tak, ale skoro warunek nie będzie nigdy spełniony to ten if jest zbędny :)

 

7 minut temu, naXe napisał:

Nie wydaje mi się ;) 

A mnie tak, bo dekodujesz coś czego nie ma :) $data jest pustą tablicą a ty próbujesz zdekodować wartość dla indeksu players :]

 

9 minut temu, naXe napisał:

Zostanie spełniony, iż użyłem tego kodu gdzie indziej i nie ma z nim problemu. A jest on po to, że nie wiem dlaczego do tablicy dodaje się kolejny klucz z pustymi wartościami.

No chyba, że bierze Ci się jakiś pusty element skądś to wtedy prędzej, ale ogólnie to nigdy nie będzie spełnione bo nawet sprawdzałem sobie to w kodzie jakbym dał :)

11 minut temu, naXe napisał:

@Spanner to jak powinno być, żeby działało? Już próbowałem kilku metod i każda zwraca błąd :/ 

skąd to masz:

15 godzin temu, naXe napisał:

json_decode($data['players'], true);}}

 

15 godzin temu, naXe napisał:

--- ten kod zwraca błąd :/ --- {{foreach $data['players'] as $player}} {$player['gq_name']} {{endforeach}}

To nie będzie działać bo nie ma takiego indeksu w tablicy

Udostępnij ten post


Link to postu
Udostępnij na innych stronach
  • 0

Dlaczego nie ma takiego indeksu skoro ja sam ustalam nazwę ( players )?

Edytowano przez naXe

Udostępnij ten post


Link to postu
Udostępnij na innych stronach
  • 0
29 minut temu, naXe napisał:

Dlaczego nie ma takiego indeksu skoro ja sam ustalam nazwę ( players )?

Pokaż mi w którym miejscu, bo nie widzę

Udostępnij ten post


Link to postu
Udostępnij na innych stronach
  • 0
15 godzin temu, naXe napisał:

$data[$i]['players'] = json_decode($data['players'], true);

 

Udostępnij ten post


Link to postu
Udostępnij na innych stronach
  • 0

No i o tym cały czas Ci też pisze a Ty dalej uparcie :)

Działa to tak:

Deklarujesz zmienną $data jako tablica - OK

Ale później masz tak:

zdekoduj $data['players'] z jsona do tablicy - zwraca null bo takiego elementu nie masz

Zapisuje wynik json_decode (czyli null) pod indeksem $i i w indeksie players

następnie próbujesz zrobić foreach na $data['players'], które nie istnieje - zwraca błąd

Udostępnij ten post


Link to postu
Udostępnij na innych stronach
  • 0

Gdy zdekoduje $row['players'] to również jest to samo, mimo że jak zdumpuje całą zmienną $data to elementy się wyświetlają poprawnie

Udostępnij ten post


Link to postu
Udostępnij na innych stronach
  • 0

No poczacz :D Nie pomyślałem nawet, aby użyć pętli w pętli.

Udostępnij ten post


Link to postu
Udostępnij na innych stronach
  • 0

Dlatego od początku pisze i pisze, a Ty dalej, że nie że ok :P

Dlatego też pisałem że kod jest debilny ;]

Udostępnij ten post


Link to postu
Udostępnij na innych stronach

Bądź aktywny! Zaloguj się lub utwórz konto

Tylko zarejestrowani użytkownicy mogą komentować zawartość tej strony


  • Kto przegląda   0 użytkowników

    Brak zalogowanych użytkowników przeglądających tę stronę.

×

Ważne informacje

Kontynuując przeglądanie strony, wyrażasz zgodę na używanie przez nas plików cookies.