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:

SMARTY:
  1. {assign var='zmienna' value='test'}
  2. Właśnie stworzyliśmy zmienną $zmienna o wartości {$zmienna}

Wyświetli nam się to:

CODE:
  1. 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:

SMARTY:
  1. {assign var='zmienna' value=array(0=>'test')}
  2. {assign var='zmienna[0]' value='test'}


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:

SMARTY:
  1. {assign var='zmienna' value=','|explode:'jeden,dwa,trzy'}

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:

SMARTY:
  1. {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.

Dodaj komentarz

5 odpowiedzi dla tego wpisu

  1. macem napisał:

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

  2. MariuszT napisał:

    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.

  3. macem napisał:

    Racja ale czasami mogą sprawić sporo problemów i kilka godzin szukania w kodzie zmian i porpawki :D

  4. MariuszT napisał:

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

  5. murwazy napisał:

    przydalo sie – dzieki:)

Odpowiedz



Podobne wpisy: