Ta strona używa ciasteczek (cookies), dzięki którym nasz serwis może działać lepiej. Dowiedz się więcej Rozumiem

Kurs Windu Front cz 2 - Smarty cz 1

W tej części kursu opiszemy system szablonów z jakiego korzysta nasz CMS!

kurs-windu-front2

Windu CMS wykorzystuje system templatów SMARTY. Ogólnie rzecz biorąc jest to silnik który pozwala wykorzystywać w bardziej zawansowany i prostszy sposób możliwości języka PHP z poziomu kodu HTML.

Przykładowo jeżeli bez systemu SMARTY chcieli byśmy wykonać kod PHP w naszym pliku index.php musieli byśmy wywołać kod zaczynający się od znaczników php, w przypadku smartów sprawa jest znacznie prostsza
 
{$moja_zmienna}
 
Jak widzimy jest znacznie prościej.

Jak zapewne zauważycie w Windu czasami wykorzystujemy pojedynczy nawias klamrowy a czasami podwójny. Pojedynczy nawias występuje w kodzie samego systemu CMS oraz w widgetach, natomiast w tempaltach wykorzystujemy podwójny nawias klamrowy. To jaki znacznik będzie wykorzystywany można zadeklarować w configu Smartów, my zdecydowaliśmy się na podwójny dlatego aby użytkownik w kodzie mógł wykorzystywać bez problemu nawiasy klamrowe które nie są w tym wypadku znakiem specjalnym wywołującym Smarty.
 

Składnia
Podstawowy kod HTML z przykładowymi tagami wygląda następująco
{* I am a Smarty comment, I don&#39;t exist in the compiled output  *}<html><head><title></title></head><body>

{* another single line smarty comment  *}
<!-- HTML comment that is sent to the browser -->

{* this multiline smarty
   comment is
   not sent to browser
*}

{*********************************************************
Multi line comment block with credits block
  @ author:         bg@example.com
  @ maintainer:     support@example.com
  @ para:           var that sets block style
  @ css:            the style output
**********************************************************}

{* The header file with the main logo and stuff  *}
{include file=&#39;header.tpl&#39;}


{* Dev note:  the $includeFile var is assigned in foo.php script  *}
<!-- Displays main content block -->
{include file=$includeFile}

{* this <select> block is redundant *}
{*
</select><select name="company"></select><select>
  {html_options options=$vals selected=$selected_id}
</select>
*}

<!-- Show header from affiliate is disabled -->
{* $affiliate|upper *}

{* you cannot nest comments *}
{*
<select name="company">
  {*<option value="0">-- none --</option> *}
  {html_options options=$vals selected=$selected_id}
</select>
*}</body></html>
Zmienne Zmienną należy oczywiście przekazać do silnika Smarty. Możemy to zrobić na 2 sposoby. Albo wywołujemy odpowiedni kod z poziomu kontrolera, czyli w miejscu w którym definiujemy uruchomienie silnika smarty (zajmiemy się tym w części dotyczącej widgetów). Druga opcja to zdefiniowanie zmiennej z poziomu templata.
{$foo}
{assign var=foo value=[1,[9,8],3]}   // can be nested

Short variable assignment:

{$foo=$bar+2}
{$foo = strlen($bar)}               // function in assignment
{$foo = myfunct( ($x+$y)*3 )}       // as function parameter 
{$foo.bar=1}                        // assign to specific array element
{$foo.bar.baz=1}                    
{$foo[]=1}                          // appending to an array

Smarty "dot" syntax (note: embedded {} are used to address ambiguities):

{$foo.a.b.c}        =>  $foo[&#39;a&#39;][&#39;b&#39;][&#39;c&#39;] 
{$foo.a.$b.c}       =>  $foo[&#39;a&#39;][$b][&#39;c&#39;]         // with variable index
{$foo.a.{$b+4}.c}   =>  $foo[&#39;a&#39;][$b+4][&#39;c&#39;]       // with expression as index
{$foo.a.{$b.c}}     =>  $foo[&#39;a&#39;][$b[&#39;c&#39;]]         // with nested index

PHP-like syntax, alternative to "dot" syntax:

{$foo[1]}             // normal access
{$foo[&#39;bar&#39;]}
{$foo[&#39;bar&#39;][1]}
{$foo[$x+$x]}         // index may contain any expression
{$foo[$bar[1]]}       // nested index
{$foo[section_name]}  // smarty {section} access, not array access!

Variable variables:

$foo                     // normal variable
$foo_{$bar}              // variable name containing other variable 
$foo_{$x+$y}             // variable name containing expressions 
$foo_{$bar}_buh_{$blar}  // variable name with multiple segments
{$foo_{$x}}              // will output the variable $foo_1 if $x has a value of 1.

Object chaining:

{$object->method1($x)->method2($y)}

Direct PHP function access:

{time()}
Definiowanie zmiennych z poziomu PHP
Jest to przykład ogólny, w przypadku Windu CMS zmienne w ten sposób będziemy definiowali jedynie z poziomu controllera widgetu.
 
<?php smarty="new" smarty-="">assign(&#39;firstname&#39;, &#39;Doug&#39;);
$smarty->assign(&#39;lastname&#39;, &#39;Evans&#39;);
$smarty->assign(&#39;meetingPlace&#39;, &#39;New York&#39;);

$smarty->display(&#39;index.tpl&#39;);

?></?php>

Wywołanie zmiennych zdefiniowanych w PHP
 
Hello {$firstname} {$lastname}, glad to see you can make it.


{* this will not work as $variables are case sensitive *}
This weeks meeting is in {$meetingplace}.
{* this will work *}
This weeks meeting is in {$meetingPlace}.

Modyfikatory
Każdą zmienną możemy w prosty sposób zmodyfikować, przyciąć, zmienić czy dokonać innych operacji. Do tego celu mamy szereg bardzo przydatnych i prostych narzędzi.
Dokumentacja Smarty doskonale pokazuje wykorzystanie modyfikatorów
http://www.smarty.net/docs/en/language.modifiers.tpl
Lista możliwych gotowych modyfikatorów
  • capitalize - {$articleTitle|capitalize} - zamiana pierwszej litery na wielką w każdym słowie
  • cat - {$articleTitle|cat:' yesterday.'} - doklejanie zmiennej na końcu stringa
  • count_characters - {$articleTitle|count_characters} - zwraca liczbę liter w stringu
  • count_paragraphs - {$articleTitle|count_paragraphs } - zwraca liczbę paragrafów w stringu
  • count_sentences - {$articleTitle|count_sentences } - zwraca liczbę zdań
  • count_words - {$articleTitle|count_words } - zwraca liczbę słów
  • date_format - {$yesterday|date_format:"%A, %B %e, %Y"}  - zwraca sformatowaną datę
  • default - {$articleTitle|default:'no title'} - w przypadku pustego ciągu znaków zwraca zdefiniowaną wartość domyślną
  • escape - {$articleTitle|escape:'html'} - filtruje wybrane typy znaków, w przykładzie są to tagi HTML
  • from_charset - zmiana typu kodowania stringa
  • indent - {$articleTitle|indent:10}  - dodaje wcięcie tabulatora dla danego stringa
  • lower - {$articleTitle|lower} - zmienia litery na małe
  • nl2br - {$articleTitle|nl2br} - zamienia znak nowej linii na znacznik htmlowy BR
  • regex_replace - {$articleTitle|regex_replace:"/[\r\t\n]/":" "} - pozwala na wykorzystanie wyrażeń regularnych
  • replace - {$articleTitle|replace:'Garden':'Vineyard'} - zamienia wybrany wyraz na inny zdefiniowany w tagu
  • spacify - {$articleTitle|spacify:"^^"} - pozwala na wstawienie pomiędzy każą literę odpowiedniego znaku, na przykład spacji lub apostrofu
  • string_format - {$number|string_format:"%.2f"} - pozwala na sformatowanie stingu jako liczbę
  • strip - {$articleTitle|strip:' '} - usuwa lub zamienia odstępu na początku i końcu wieksza.
  • strip_tags - {$articleTitle|strip_tags} - usuwa wszelkie tagi i pozostawia czysty tekst
  • to_charset - zmienia kodowanie stringu
  • truncate - {$articleTitle|truncate:30} - przycina ciąg do danej długości
  • unescape {$articleTitle|unescape:"html"} - działa w odwrotny sposób do tagu escape
  • upper - zmienia litery na duże.
  • wordwrap - {$articleTitle|wordwrap:20} - łamie wyrazy dłuższe niż określone
 
Przykładowe wykorzystanie 
{* apply modifier to a variable *}
{$title|upper}

{* modifier with parameters *}
{$title|truncate:40:"..."}

{* apply modifier to a function parameter *}
{html_table loop=$myvar|upper}

{* with parameters *}
{html_table loop=$myvar|truncate:40:"..."}

{* apply modifier to literal string *}
{"foobar"|upper}

{* using date_format to format the current date *}
{$smarty.now|date_format:"%Y/%m/%d"}

{* apply modifier to a custom function *}
{mailto|upper address="smarty@example.com"}

{* using  php&#39;s str_repeat *}
{"="|str_repeat:80}

{* php&#39;s count *}
{$myArray|@count}

{* this will uppercase and truncate the whole array *}
<select name="name_id">
{html_options output=$my_array|upper|truncate:20}
</select>

Modyfikatory można sklejać i tworzyć ich kombinacje. Przykładowe wykorzystanie
{$articleTitle}
{$articleTitle|upper|spacify}
{$articleTitle|lower|spacify|truncate}
{$articleTitle|lower|truncate:30|spacify}
{$articleTitle|lower|spacify|truncate:30:". . ."}

Atrybuty
W smartach możemy przekazywać atrybuty, czyli includując plik tempalta czy wywołując funkcję mamy możliwość jej parametryzowania. Wykorzystywane jest to na przykład w przypadku widgetów czy kodów fraz językowej.
 
{include file="header.tpl"}
{include file="header.tpl" nocache}  // is equivalent to nocache=true
{include file="header.tpl" attrib_name="attrib value"}
{include file=$includeFile}
{include file=#includeFile# title="My Title"}

{assign var=foo value={counter}}  // plugin result
{assign var=foo value=substr($bar,2,5)}  // PHP function result
{assign var=foo value=$bar|strlen}  // using modifier
{assign var=foo value=$buh+$bar|strlen}  // more complex expression

{html_select_date display_days=true}
{mailto address="smarty@example.com"}
<select name="company_id">
  {html_options options=$companies selected=$company_id}
</select>

Więcej na ten temat znajdziemy na stronie projektu w obszernej dokumentacji: http://www.smarty.net/docs/en/ z której też pochodzą przytoczone przykłady.