Smarty: assign w szablonie i tablica
11 lutego 2008
Przyczepie się jeszcze raz do smarty
Byłem i nadal jestem pod dużym wrażeniem możliwości tego systemu szablonów ale niestety okazuje się, że i tutaj są pewne niedoróbki. Poprzedni problem (Smarty: {include} i widoczność zmiennych) można opisać jako świadomy wybór twórców smarty. Szkoda tylko, że nie dali żadnego wyboru programistom. Natomiast to o czym chcę dzisiaj napisać to już wyraźna luka w tak przecież bogatych możliwościach tego systemu.
A chodzi o {assign}. Ta prosta komenda pozwala stworzyć zmienną bezpośrednio z poziomu szablonu. Działa to tak:
-
Właśnie stworzyliśmy zmienną $zmienna o wartości {$zmienna}
Wyświetli nam się to:
-
Właśnie stworzyliśmy zmienną $zmienna o wartości test
Jak widać, zastosowanie jest banalnie proste. Ale jakie było moje zaskoczenie gdy okazało się, że nie mogę w ten sposób stworzyć tablicy! To naprawdę zadziwiające biorąc pod uwagę, że smarty ma doskonale zaimplementowany mechanizm tablic. Próbowałem różnych sposobów, wymienię chociażby dwa najbardziej sensowne:
Niestety nie działa. Bez względu na to czy bierzemy wartość var i/lub value w jakieś cudzysłowy podwójne, pojedyncze czy ukośne czy w ogóle ich nie używamy (a już przekonałem się na własnej skórze, że cudzysłowy mają dla smarty niebagatelne znaczenie). Próbowałem jeszcze innych dziwacznych sposobów, bez efektu.
Znalazłem w Internecie kilka rozwiązań ale były albo bardzo dziwne albo ktoś je stworzył kilka lat temu i już nie działają. Poniżej jeden ciekawy przykład:
Korzystamy tu z możliwości używania poleceń php w smarty jako modyfikatorów. Przyznam, że nawet tego nie sprawdzałem
Nie lubię takich rozwiązań. Zwłaszcza, że problem wróci gdy będziemy potrzebowali stworzyć tablicę asocjacyjną. Ale widać po tym jak ludzie kombinują żeby sobie poradzić z problemem.
Rozwiązaniem okazał się osobny plugin. Znajduje się on tutaj a jego użycie wygląda tak:
-
{set var=$zmienna value=array(0 => 'jeden', 'dwa', 'test' => 'trzy')}
Można nawet tworzyć tablice wielowymiarowe. Zresztą funkcjonalność tego pluginu jest większa, przykłady zastosowania znajdziecie na jego stronie www. Nic nie stoi na przeszkodzie aby go minimalnie przerobić i zastąpić nim standardowe {assign} ale ja postanowiłem zostawić jako osobną komendę {set} żeby nie był to kolejny element o którym będę musiał pamiętać przy aktualizacji smarty.
Blog przede wszystkim o Internecie i mojej pasji jaką jest tworzenie stron www. Ale nie ograniczam się do jednej tematyki, piszę o wszystkim o czym mam ochotę :-)
macem napisał: 08.03.08 o godzinie 15:11
Hejka również znalazłem kilka problemów ze smarty, jednak w bardzo prosty sposób można wyeliminować problem szukająć rozszerzeń w necie lub pisząc własne a jest to dość proste. Jedyny problem to przy aktualizacji do nowej wersji smarty z kompatybilnością.
MariuszT napisał: 08.03.08 o godzinie 20:42
Aktualizacje już nie sprawiają teraz dużych problemów bo nie ma wielkich, rewolucyjnych zmian w smarty. Jak coś zmienią to przeważnie są to zmiany kosmetyczne.
macem napisał: 12.03.08 o godzinie 1:24
Racja ale czasami mogą sprawić sporo problemów i kilka godzin szukania w kodzie zmian i porpawki
MariuszT napisał: 12.03.08 o godzinie 17:52
Tak ale piszemy tu o pluginach więc w tym wypadku aktualizacja nie przysparza tu wielkich problemów. Wystarczy tylko nadpisać stare pliki nowymi i już. Teraz już są tylko kosmetyczne zmiany w Smarty i po wgraniu nowej wersji nie ma obaw, że nasze pluginy przestaną nagle działać.
murwazy napisał: 16.10.09 o godzinie 10:43
przydalo sie – dzieki:)