Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> Smarty - section i indeksy tablic
marcini82
post 6.05.2007, 09:00:41
Post #1





Grupa: Zarejestrowani
Postów: 190
Pomógł: 1
Dołączył: 20.05.2005
Skąd: Poznań

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


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?
Go to the top of the page
+Quote Post
 
Start new topic
Odpowiedzi (1 - 13)
chlebik
post 6.05.2007, 09:35:58
Post #2





Grupa: Zarejestrowani
Postów: 113
Pomógł: 5
Dołączył: 12.09.2006
Skąd: Pruszków/Warszawa

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


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.


--------------------
"Człowiek dążący do swego celu może być skuteczny tylko w przypadku, jeśli każdą minutę swego życia wykorzysta z maksymalną korzyścią dla osiągnięcia zaplanowanego celu. Jeśli stworzył dla siebie system kar i karze sam siebie za każdą zmarnowaną minutę. Człowiekowi w zupełności wystarczą 3-4 godziny snu, cały pozostały czas może być wykorzystany dla osiągnięcia upragnionego celu." -- Wiktor Suworow
Java devBlog
KulturalnyChlebik
Go to the top of the page
+Quote Post
sf
post 6.05.2007, 09:46:38
Post #3





Grupa: Zarejestrowani
Postów: 1 597
Pomógł: 30
Dołączył: 19.02.2003
Skąd: Tychy

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


1) Smarty nie odbywa się po stronie przeglądarki.
2) użyj foreach tam, jest key


--------------------
Zapraszam na mój php blog, tworzenie stron.
Go to the top of the page
+Quote Post
marcini82
post 6.05.2007, 10:36:18
Post #4





Grupa: Zarejestrowani
Postów: 190
Pomógł: 1
Dołączył: 20.05.2005
Skąd: Poznań

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


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}
Go to the top of the page
+Quote Post
chlebik
post 6.05.2007, 15:16:29
Post #5





Grupa: Zarejestrowani
Postów: 113
Pomógł: 5
Dołączył: 12.09.2006
Skąd: Pruszków/Warszawa

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


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.


--------------------
"Człowiek dążący do swego celu może być skuteczny tylko w przypadku, jeśli każdą minutę swego życia wykorzysta z maksymalną korzyścią dla osiągnięcia zaplanowanego celu. Jeśli stworzył dla siebie system kar i karze sam siebie za każdą zmarnowaną minutę. Człowiekowi w zupełności wystarczą 3-4 godziny snu, cały pozostały czas może być wykorzystany dla osiągnięcia upragnionego celu." -- Wiktor Suworow
Java devBlog
KulturalnyChlebik
Go to the top of the page
+Quote Post
marcini82
post 6.05.2007, 20:39:47
Post #6





Grupa: Zarejestrowani
Postów: 190
Pomógł: 1
Dołączył: 20.05.2005
Skąd: Poznań

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


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.
Go to the top of the page
+Quote Post
Cienki1980
post 6.05.2007, 21:12:07
Post #7





Grupa: Przyjaciele php.pl
Postów: 1 590
Pomógł: 40
Dołączył: 11.01.2007
Skąd: Centrum

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


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ć.


--------------------
404
Go to the top of the page
+Quote Post
chlebik
post 6.05.2007, 23:11:14
Post #8





Grupa: Zarejestrowani
Postów: 113
Pomógł: 5
Dołączył: 12.09.2006
Skąd: Pruszków/Warszawa

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


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


--------------------
"Człowiek dążący do swego celu może być skuteczny tylko w przypadku, jeśli każdą minutę swego życia wykorzysta z maksymalną korzyścią dla osiągnięcia zaplanowanego celu. Jeśli stworzył dla siebie system kar i karze sam siebie za każdą zmarnowaną minutę. Człowiekowi w zupełności wystarczą 3-4 godziny snu, cały pozostały czas może być wykorzystany dla osiągnięcia upragnionego celu." -- Wiktor Suworow
Java devBlog
KulturalnyChlebik
Go to the top of the page
+Quote Post
Cienki1980
post 6.05.2007, 23:24:40
Post #9





Grupa: Przyjaciele php.pl
Postów: 1 590
Pomógł: 40
Dołączył: 11.01.2007
Skąd: Centrum

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


@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


--------------------
404
Go to the top of the page
+Quote Post
chlebik
post 6.05.2007, 23:39:21
Post #10





Grupa: Zarejestrowani
Postów: 113
Pomógł: 5
Dołączył: 12.09.2006
Skąd: Pruszków/Warszawa

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


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.


--------------------
"Człowiek dążący do swego celu może być skuteczny tylko w przypadku, jeśli każdą minutę swego życia wykorzysta z maksymalną korzyścią dla osiągnięcia zaplanowanego celu. Jeśli stworzył dla siebie system kar i karze sam siebie za każdą zmarnowaną minutę. Człowiekowi w zupełności wystarczą 3-4 godziny snu, cały pozostały czas może być wykorzystany dla osiągnięcia upragnionego celu." -- Wiktor Suworow
Java devBlog
KulturalnyChlebik
Go to the top of the page
+Quote Post
marcini82
post 8.05.2007, 11:57:20
Post #11





Grupa: Zarejestrowani
Postów: 190
Pomógł: 1
Dołączył: 20.05.2005
Skąd: Poznań

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


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...
Go to the top of the page
+Quote Post
chlebik
post 8.05.2007, 16:01:08
Post #12





Grupa: Zarejestrowani
Postów: 113
Pomógł: 5
Dołączył: 12.09.2006
Skąd: Pruszków/Warszawa

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


Wroc, czekaj - nie rozumiem czegos. To znaczy, ze caly czas mowiles o tablicy tablic? Bo juz sie gubie.


--------------------
"Człowiek dążący do swego celu może być skuteczny tylko w przypadku, jeśli każdą minutę swego życia wykorzysta z maksymalną korzyścią dla osiągnięcia zaplanowanego celu. Jeśli stworzył dla siebie system kar i karze sam siebie za każdą zmarnowaną minutę. Człowiekowi w zupełności wystarczą 3-4 godziny snu, cały pozostały czas może być wykorzystany dla osiągnięcia upragnionego celu." -- Wiktor Suworow
Java devBlog
KulturalnyChlebik
Go to the top of the page
+Quote Post
Cienki1980
post 8.05.2007, 16:20:02
Post #13





Grupa: Przyjaciele php.pl
Postów: 1 590
Pomógł: 40
Dołączył: 11.01.2007
Skąd: Centrum

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


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.


--------------------
404
Go to the top of the page
+Quote Post
marcini82
post 9.05.2007, 10:30:57
Post #14





Grupa: Zarejestrowani
Postów: 190
Pomógł: 1
Dołączył: 20.05.2005
Skąd: Poznań

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


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
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.07.2025 - 07:00