Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [smarty] Jak przekazać zmienną będącą tablicą do funkcji w smarty
Forum PHP.pl > Forum > Gotowe rozwiązania > Systemy szablonów
MariuszT
Tytuł zawiły ale w gruncie rzeczy prosta sprawa tylko nie wiem jak to nazwać. Poniższy przykład jest specjalnie przygotowany aby było łatwiej go zrozumieć. Muszę przekazać wartość tablicy o indeksie id do własnej funkcji/pluginu. Póki robię to tak jak jest w pierwszej linijce index.tpl to wszystko działa. Niestety mam trochę większe potrzeby ale o tym na końcu. Oto przykładowa aplikacja:

index.php
  1. <?php
  2. // tutaj ustawienia smarty, inicjacja klasy itd.
  3.  
  4. $zmienna[0]['id']=1;
  5. $smarty->assign('zmienna', $zmienna);
  6. $smarty->display('index.tpl');
  7. ?>


index.tpl
  1. {test testujemy=$zmienna[0].id}
  2. {test testujemy="$zmienna[0].id"}
  3. {test testujemy="$zmienna[0][id]"}
  4. {test testujemy="$zmienna[0]['id']"}


wynik
Cytat
1
Array.id

Array['id']


Skompilowany plik:
  1. <?php echo smarty_function_test(array('testujemy' => $this->_tpl_vars['zmienna'][0]['id']), $this);?>
  2.  
  3. <?php echo smarty_function_test(array('testujemy' => ($this->_tpl_vars['zmienna'][0]).".id"), $this);?>
  4.  
  5. <?php echo smarty_function_test(array('testujemy' => ($this->_tpl_vars['zmienna'][0][$this->_sections['id']['index']])), $this);?>
  6.  
  7. <?php echo smarty_function_test(array('testujemy' => ($this->_tpl_vars['zmienna'][0])."['id']"), $this);?>


No i kto mi teraz doradzi jak ja mam przekazać wartość zmiennej $zmienna[0]['id'] skoro w rzeczywistości tak używam mojego pluginu:
Cytat
{zapytanie nazwa='zdjecie' select='id, opis' from='nt_strony_zdjecia' where="strona=WARTOSC_NASZEJ_ZMIENNEJ" order='sort' limit='1'}

Jak widać w pliku index.tpl próbowałem różnych sposobów i nic nie wychodzi :/ Widać wyraźnie w skompilowanym pliku, że smarty głupieje :/

Co prawda znalazłem rozwiązanie ale wcale mi się ono nie podoba. Robię coś takiego:
Cytat
{assign var='zdjecie_id' value=$zdjecie[0].id}
{zapytanie nazwa='zdjecie' select='id, opis' from='nt_strony_zdjecia' where="strona=$zdjecie_id" order='sort' limit='1'}

Działa ale to takie... nieeleganckie ;P

Jakieś pomysły na rozwiązanie?
Cezar708
Cytat
{zapytanie nazwa='zdjecie' select='id, opis' from='nt_strony_zdjecia' where="strona="|cat:$zmienna[0].id order='sort' limit='1'}

więcej o łączeniu stringów tutaj.
MariuszT
Przyznam, że o tym nie pomyślałem. I już mógłbym kliknąć przycisk "Pomógł" gdyby nie to:

Cytat
{zapytanie nazwa='zdjecie' select='id, opis' from='nt_strony_zdjecia' where="strona=WARTOSC_NASZEJ_ZMIENNEJ AND inny_warunek=x" order='sort' limit='1'}

Ten plugin ma za zadanie wyciągać wyniki z bazy danych i przesyłać je bezpośrednio do smarty z pominięciem plików .php więc zapytania mogą być niekiedy dość skomplikowane i nie wystarczy zwykłe dołączenie wartości na końcu
Cezar708
hmm szczerze mówiąc może źle to rozumiem, ale dlaczego by nie:

Cytat
{zapytanie nazwa='zdjecie' select='id, opis' from='nt_strony_zdjecia' where="strona="|cat:$zmienna[0].id|cat:" AND inny_warunek=x" order='sort' limit='1'}


.. czyli kilka razy użycie |cat:, może jest jakieś drugie dno?
MariuszT
Masz rację, znowu się nie zastanowiłem tylko szybko odpowiedziałem. Twoje rozwiązanie jest skuteczne. Szkoda tylko, że trzeba tak kombinować ;/ Nie rozumiem czemu smarty ucina .id :/
Cezar708
a możesz mi odpowiedzieć na jedno pytanie? Dlaczego mieszasz warstwę prezentacji (widoku) z warstwą modelu. Dlaczego wywołujesz zapytania do bazy danych z poziomu templatu SMARTY? Nie jest to dobra praktyka. Na pewno jest jakieś lepsze rozwiązanie.
MariuszT
Wiedziałem, że ktoś zada takie pytanie winksmiley.jpg Robię tak ponieważ buduję multi cms czyli cms na którym można postawić nieskończenie wiele serwisów i wszystko na jednym serwerze, na jednych skryptach i na jednej bazie danych. Nie jestem w stanie przewidzieć czego będzie potrzebował użytkownik bo potrzeby są różne. Nie mogę mu też dać dostępu do plików php. Dlatego daję mu prosty sposób na pobranie danych w szablonach. To mu daje praktycznie nieograniczone możliwości a w smarty skutkuje tylko jedną linijką więcej.

Koleś chce sobie np. zrobić podstronę www.example.com/newsy/ więc tworzy newsy.tpl, tam wsadza zapytanie do bazy danych o newsy ze swojej strony i gotowe, działa winksmiley.jpg
Cezar708
Twoje rozwiązanie jest... niestandardowe...

Ale jeśli chcesz aby twórcy podstron mieli dostęp tylko do bazy i do template a nie mieli do kodów PHP to może stwórz na każdego użytkownika jego "domowy katalog na php". W takim pliku będzie mógł sobie do woli pracować, bez żadnych ograniczeń. A zawsze taki plik można zaincludować w pliku *.tpl za pomocą {include_php}.

Dzięki takiemu rozwiązaniu nie zwiążesz rąk użytkownikowi, a na pewno dla takiego będzie większe pole manewru.

Pozdrawiam
MariuszT
Hehe wiem, że rozwiązanie jest niestandardowe ale bardzo praktyczne smile.gif Nie chcę im dawać dostępu do żadnego php. Nie mam czasu żeby sprawdzać co oni tam wyprawiają a mogą różne rzeczy robić i potem ja za to będę odpowiadał. Chcę zablokować dostęp do {include_php} i {php}. Chcę aby koleś mógł tylko wybrać jakieś dane z bazy danych (i to też nie wszystkie ale to już zabezpieczyłem). I do tego moje rozwiązanie nadaje sie idealnie tongue.gif Wiesz, to mimo wszystko tylko cms i jakieś ograniczenia muszą być. I tak możliwości są bardzo duże a ten plugin do smarty to tylko dla niestandardowych rozwiązań, reszta jest obsługiwana przez moduły php np. newsy czy galeria zdjęć.

Swoją drogą, jak już poznałeś moje założenia to zadam jeszcze jedno pytanie. Czy jest coś jeszcze w zabezpieczeniach o czym powinienem pamiętać oprócz wyłączenia {include_php} i {php} ? Tagi <?php ?> są traktowane standardowo czyli po prostu wyświetlane.



EDIT 10.02.2008
Znalazłem przez przypadek rozwiązanie problemu - może komuś się przyda. Nie trzeba używać żadnych sztuczek, wystarczy zmienną wcisnąć między `` smile.gif U mnie to wygląda tak:

Cytat
{zapytanie nazwa='zdjecie' select='id, opis' from='nt_strony_zdjecia' where="strona=`$zdjecie[0].id`" order='sort' limit='1'}


I smarty prawidłowo rozpoznaje, że to tablica.
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.