Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Smarty - section i indeksy tablic
Forum PHP.pl > Forum > Gotowe rozwiązania > Systemy szablonów
marcini82
Witam!

Mam w Smarty petle section, a w niej chce przegladac 2 tablice. Array1 jest indeksowana od 0 do 19 - i z tym nie ma problemu. Natomiast array2 jest indeksowana od 1 do 20 - czyli w tym samym powtorzeniu petli musze podac dla array2 wartosc indeksu o 1 wieksza. Tylko jak to zrobic?? Ponizszy przyklad powoduje blad:

  1. {section name=test start=0 loop=20}
  2. {$array1[test].value} {$array2[test+1].value}
  3. {/section}


Taki cudak rowniez nie dziala:
  1. {section name=test start=0 loop=20}
  2. {$array1[test].value} {$array2[$smarty.section.test.iteration].value}
  3. {/section}


Jak to zrobic?
chlebik
Ale co ci konkretnie nie dziala - nie odczytuje sie wartosc petli, wywala blad ? Ja na twoim miejscu wrzucilbym do tego section przy okazji poglad kazdego kroku petli (moze nawet JavaScriptowym alertem) i zobaczyl co jest w te wartosci podstawiane.
sf
1) Smarty nie odbywa się po stronie przeglądarki.
2) użyj foreach tam, jest key
marcini82
Cytat
Ale co ci konkretnie nie dziala - nie odczytuje sie wartosc petli, wywala blad ?

Zaleznie jaka konstrukcje wykombinuje, to albo nie ma zadnej wartosci, albo smarty wywala blad skladni w szablonie.
Problem w tym, ze nie wiem jak podac odpowiedni index dla tablicy. Obojetnie, czy to bedzie $smarty.section.test.iteration czy cos innego - nie moge tego uzyc jako wartosci indeksu przy odczytywaniu z pol tablicy.

Cytat
Smarty nie odbywa się po stronie przeglądarki.

Za bardzo nie wiedzialem gdzie to przypiac. php tez to nie jest...

Cytat
użyj foreach tam, jest key

To tez nie zmienia sytuacji, bo mam $key z jednej tablicy, ale zeby odczytac odpowiedni wiersz z 2 tablicy, to jako index potrzebuje $key+1. A jak to mam napisac?
To jest poprawne skladniowo, ale to zly nr indeksu:
  1. {$array2.$key.value}

A to juz powoduje blad skladni:
  1. {$array2.$key+1.value}
chlebik
Nie przetestuje tego na razie bo nie mam czasu, ale szybkie mysli:

1. Sprawdz na poziomie PHP czy w tych tablicach w ogole cos jest smile.gif

2. W Smarty sprawdz sama pierwsza tablice (ta indeksowana od 0) - czy wyswietlane sa zawarte w niej wartosci.

3. Co to znaczy, ze masz druga tablice indeksowana od 1? Tzn. czy jest to tablica asocjacyjna, gdzie liczby sa indeksami, czy po prostu tablica, w ktorej elementy zaczynaja sie od 1, a w komorce tablicy o indeksie 0 po prostu nic nie ma? No bo jezeli okazuje sie, ze jest to tablica asocjacyjna to zapis $zmienna + 1 nie ma sensu bo to nie liczby, tylko string.


Daj znac jak cos, w nocy usiade na powaznie. Pzdr.
marcini82
Tablice sprawdzalem w php - sa w porzadku. Pierwsza moge bez problemu wyswietlic w smarty.
Druga jest indeksowana liczbowo (nie asocjacyjnie), przy czym tylko dla niektorych liczb sa w niej wartosci, np. moga byc tylko dla indeksu 3 i 7:
Kod
array(1) {
  [3]=>
  array(2) {
    ["f1"]=>
    string(2) "v1"
    ["f2"]=>
    string(2) "v2"
  }
  [7]=>
  array(2) {
    ["f1"]=>
    string(2) "v1"
    ["f2"]=>
    string(2) "v2"
  }
}

Minimalna wartosc indeksu to 1, a maksymalna 20.
Cienki1980
Tak jak sf proponuje wykorzystać foreach.

Pokaż strukturę tych tablic w PHP .. wyświetl je w ten sposób :
  1. <?php
  2. echo "<pre>";print_r($tablica);echo "</pre>";
  3. ?>


a postaramy się coś wymyślić.
chlebik
Re: Cienki i sf - oczywiscie, ze mozna tak zrobic, ale prawda jest taka, ze wlasnie z section w Smartym sa problemy jak cholera i zasadniczo wykorzystanie tej petli do tego, do czego zostala stworzona (tzn. przechodzenia przez zwykla tablice nieasocjacyjna) jest utrudnione. Nie tak dawno tez probowalem zmusic section do poprawnego zachowania i mi nie wyszlo mimo usilnych prob.


Rozwiazanie zas tutaj okazalo sie banalnie proste, wystarczylo to wrzucic na spokojnie na warsztat. Z PHP przekazuje do Smarty 2 tablice, obydwie nieasocjacyjne. I kod wyglada sobie tak:



  1. {section name=test start=0 loop=4}
  2.  
  3. {assign var = "licznik" value = $smarty.section.test.iteration}
  4.  
  5. {$array1[test]} ------- {$array2[$licznik]}
  6.  
  7. {/section}



1. Wyrzuc to .value z wartosci tablicy - u mnie kiedy tego uzywam to wyskakuje mi 1 element stringa umieszczonego pod pierwszym indeksem. Mowiac krotko - kiedy w tablicy[0] mam wartosc 'jeden' do kiedy uzyje Twojej notacji mam po podstawieniu literke 'j'.

2. Skoro ty sie chcesz odwolywac do 1 elementu wyzej to uzycie $smarty.section.test.iteration jest jak najbardziej poprawne bo przeciez wartosc ta zawsze startuje od 1. Ja skojarzlyem te zmienna z inna by miec pewnosc, ze to wszystko dziala, ale jak nawet w miejsce $array2[$licznik] wstawie $array2[$smarty.ect....] to i tak mi dziala.


Pzdr
Chlebik
Cienki1980
@chlebik no właśnie .. skoro z section są problemy to lepiej korzystać z foreach, który takich problemów nie robi i działa miło i przyjemnie biggrin.gif. Można korzystać z samych section można z samych foreach a można z powodzeniem korzystać z obu w przypadku tablic wielowymiarowych.

Czekam na widok tej tablicy generowanej w PHP bo chciałbym się przekonać, czy rzeczywiście jest tak trudne do zrobienia to wyświetlanie tego w section/foreach
chlebik
Aj no trudne - wyzwanie i tyle cool.gif Po prostu nie rozumiem dlaczego cos, co w teorii powinno dobrze dzialac jest takie toporne. Co wiecej - ani manual Smarty, ani ksiazeczka wydana przez Helion nie sa w zbyt wiele w tej materii pomocne.
marcini82
No wiec zamieszczam strukture obu tablic, oczywiscie troche skrocona.

Pierwsza, 20 pol indeksowanych od 0 do 19:
Kod
Array
(
    [0] => Array
        (
            [columnId] => 81
            [columnNumber] => 1
            [columnComment] =>
        )
    ...
    ...
    ...

    [19] => Array
        (
            [columnId] => 100
            [columnNumber] => 20
            [columnComment] =>
        )

)


I druga, mozliwe indeksy od 1 do 20, przy czym w tablicy sa obecne tylko niektore z nich:
Kod
          Array
          (
                    [2] => Array
                        (
                            [columnId] => 82
                            [personId] => 11
                            [name] => Jurek
                            [surname] => Jurczak
                            ...
                            ...
                            ...
                        )

                    [6] => Array
                        (
                            [columnId] => 90
                            [personId] => 16
                            [name] => Marek
                            [surname] => Markowski
                            ...
                            ...
                            ...
                        )
            )


W 1 iteracji chce odczytac element 1 tablicy o indeksie 0 i element 2 tablicy o indeksie 1 (jesli istnieje).
W 2 iteracji chce odczytac element 1 tablicy o indeksie 1 i element 2 tablicy o indeksie 2 (jesli istnieje).
I tak dalej...
chlebik
Wroc, czekaj - nie rozumiem czegos. To znaczy, ze caly czas mowiles o tablicy tablic? Bo juz sie gubie.
Cienki1980
Dla tak stworzonych tablic w PHP możesz wykonać w Smartach takie coś:

  1. //kod php w którym tworzyłem sobie przykładowe tablice 
  2. <?php
  3.  
  4. for($i=0;$i<20;$i++)
  5. {
  6.  $tab[$i]['column_id']=rand(3,30);
  7. }
  8.  
  9. $x=rand(2,19);
  10.  
  11. for($r=1;$r<$x;$r++)
  12. {
  13.  $tab2[$r]['name']="jakis_name".$r;
  14. }
  15.  
  16.  
  17.  
  18. include('Smarty.class.php');
  19. $smarty = new Smarty;
  20.  
  21.  
  22. $smarty->assign('tab',$tab);
  23. $smarty->assign('tab2',$tab2);
  24. $smarty->display('testx.tpl');
  25. ?>


a pętla w Smartach wyglądała tak:
  1. <table width="100%">
  2. {section name=x loop=$tab}
  3. {assign var=g value=$smarty.section.x.index+1}
  4. <tr><td>{$tab[x].column_id}</td><td>{$tab2[$g].name}</td></tr>
  5. {/section}


Nie wiem czy o taki efekt Ci chodzi, ale może coś pomogłem.
marcini82
Cytat
Nie wiem czy o taki efekt Ci chodzi, ale może coś pomogłem.

O to wlasnie chodzilo. Dziekuje biggrin.gif

Kluczem do sukcesu okazalo sie:
Kod
{assign var=g value=$smarty.section.x.index+1}

Jak juz mam ta zmienna to reszta jest prosta. Ale na to rozwiazanie nie wpadlem snitch.gif
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.