Skocz do zawartości
Urlop / Vacation Czytaj dalej... ×
  • Zarejestruj się
  • 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

Utwórz konto

Zarejestruj nowe konto, to proste!

Zarejestruj nowe konto

Zaloguj się

Posiadasz własne konto? Użyj go!

Zaloguj się

  • Kto przegląda   0 użytkowników

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

×

Ważne informacje

W celu świadczenie usług przez nasz Serwis na najwyższym poziomie, w ramach Serwisu wykorzystujemy pliki Cookies (tzw. ciasteczka). Korzystając ze stron Serwisu IPSBEYOND.PL bez zmiany ustawień przeglądarki będą one zapisane w pamięci urządzenia. Jeżeli nie dokonacie Państwo zmiany ustawień przeglądarki internetowej to wyrażacie zgodę na zapisywanie plików Cookies.