Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> [smarty] Jak przekazać zmienną będącą tablicą do funkcji w smarty, tytuł zawiły ale sprawa prosta.. gorzej z rozwiązaniem :)
MariuszT
post
Post #1





Grupa: Zarejestrowani
Postów: 26
Pomógł: 1
Dołączył: 9.06.2003
Skąd: Tomaszów Mazowiecki

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


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?

Ten post edytował MariuszT 17.01.2008, 11:35:05
Go to the top of the page
+Quote Post
Cezar708
post
Post #2





Grupa: Zarejestrowani
Postów: 1 116
Pomógł: 119
Dołączył: 10.05.2005
Skąd: Poznań

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


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.

Ten post edytował Cezar708 17.01.2008, 12:05:30
Go to the top of the page
+Quote Post
MariuszT
post
Post #3





Grupa: Zarejestrowani
Postów: 26
Pomógł: 1
Dołączył: 9.06.2003
Skąd: Tomaszów Mazowiecki

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


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
Go to the top of the page
+Quote Post
Cezar708
post
Post #4





Grupa: Zarejestrowani
Postów: 1 116
Pomógł: 119
Dołączył: 10.05.2005
Skąd: Poznań

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


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?
Go to the top of the page
+Quote Post
MariuszT
post
Post #5





Grupa: Zarejestrowani
Postów: 26
Pomógł: 1
Dołączył: 9.06.2003
Skąd: Tomaszów Mazowiecki

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


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 :/
Go to the top of the page
+Quote Post
Cezar708
post
Post #6





Grupa: Zarejestrowani
Postów: 1 116
Pomógł: 119
Dołączył: 10.05.2005
Skąd: Poznań

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


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.
Go to the top of the page
+Quote Post
MariuszT
post
Post #7





Grupa: Zarejestrowani
Postów: 26
Pomógł: 1
Dołączył: 9.06.2003
Skąd: Tomaszów Mazowiecki

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


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

Ten post edytował MariuszT 17.01.2008, 15:37:03
Go to the top of the page
+Quote Post
Cezar708
post
Post #8





Grupa: Zarejestrowani
Postów: 1 116
Pomógł: 119
Dołączył: 10.05.2005
Skąd: Poznań

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


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
Go to the top of the page
+Quote Post
MariuszT
post
Post #9





Grupa: Zarejestrowani
Postów: 26
Pomógł: 1
Dołączył: 9.06.2003
Skąd: Tomaszów Mazowiecki

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


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.

Ten post edytował MariuszT 10.02.2008, 20:33:20
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 Aktualny czas: 20.08.2025 - 10:30