3.1 What is Smarty? / 什么是Smarty
Smarty 3 是一個Shopware前段的模板(template)工具颅崩。有了它谨湘,你不需要懂很多PHP的知識冻璃,只需要專注于HTML碗淌,CSS和JavaScript和一點(diǎn)點(diǎn)Smarty的知識就夠了脚草。
3.2 The basics / 基礎(chǔ)知識
Smarty的語法和HTML颜曾,XML等標(biāo)記語言很像丹鸿。每個Smarty標(biāo)簽都以花括號 { 開始乾颁,以花括號 } 結(jié)束壕翩,就像HTML中的 <> 一樣蛉迹。包含Smarty的文件后綴名為 .tpl。 你可以把它當(dāng)成一個包含了Smarty標(biāo)簽的HTML文檔放妈。
模板引擎(template engine)會渲染tpl文件并轉(zhuǎn)換成有效的HTML文件形式北救。
舉例:簡單的Smarty標(biāo)簽
{s name="shopName"}DemoShop{/s}
{s}標(biāo)簽用于定義文本片段,并使他可翻譯(make it translatable)芜抒≌洳撸可以看到,Smarty標(biāo)簽都在花括號內(nèi)挽绩,和HTML一樣膛壹,它也可以有不同的屬性比如這里的 name=""。
3.2.1 Variables
為了開始Smarty的學(xué)習(xí)唉堪,我們先嘗試用Smarty輸出從Shopware系統(tǒng)取得的信息模聋。每個頁面都由模板引擎進(jìn)行渲染,并顯示所需數(shù)據(jù)唠亚。所有數(shù)據(jù)都被存儲在名為模板變量(template variables)链方。所有的變量都能通過Smarty的語法:美元符 $ + 變量名 調(diào)用到。
舉例:變量輸出
<h2>{$sArticle.name}</h2>
該例會輸出變量.name的內(nèi)容灶搜,輸出樣式為 h2祟蚀。這里用到的分隔符 . 是用于訪問其子值的(sub-values)。像本例中所看到的那樣割卖,變量可以不僅僅是簡單的string或者number類型前酿,它可以是一個數(shù)字集,即數(shù)組(array)鹏溯。
上面的例子中罢维,變量名為sArticle,該變量是個數(shù)組丙挽,包含了多個字段肺孵,而name是它字段中的一個。
模板變量可以被嵌套的更深颜阐,比如{$sArticle.image.thumbnails[0].source}平窘。數(shù)組的所有字段可以通過 [] 語法訪問到。
3.2.2 Modifiers
有時候我們不僅僅想要簡單的輸出變量內(nèi)容凳怨,還想要在它被渲染之前對變量進(jìn)行操作瑰艘。這里我們就需要Smarty修飾符(Smarty modifiers)了。修飾符是一些用于修改變量輸出的小函數(shù)。
舉例:修飾符在變量上的應(yīng)用
<div> {$sArticle.description|truncate:120} </div>
例子中磅叛,修飾符放在變量后面屑咳,通過簡單的 | 符號 + 修飾符名字被使用萨赁。這里用到的truncate修飾符的作用是:將文本縮短到給定的字符數(shù)量弊琴,這里是120個字符,該參數(shù)通過:+ 數(shù)字使用杖爽。
你可以對一個變量同時使用多個修飾符敲董,每個修飾符之間用 | 隔開即可。這些修飾符會按照書寫順序一個一個被用到慰安。
舉例:使用兩個修飾符
比如腋寨,你想要在使用truncate方法指定字符串?dāng)?shù)之前,先把其中所包含的HTML標(biāo)簽去掉:
<div> {$sArticle.description|strip_tags|truncate:120} </div>
3.2.3 Conditions
有時候化焕,你可能需要根據(jù)不同的條件輸出不同的結(jié)果萄窜。這里條件語句用 {if} 標(biāo)簽,它包含了一條件判斷撒桨,最后以 {/if} 結(jié)束查刻。在這兩個標(biāo)簽之間的內(nèi)容只在條件判斷為true時,才會被輸出凤类。
舉例:定義一個條件
{if $sArticle.description} {$sArticle.description} {else} {$sArticle.description_long|strip_tags|truncate:120} {/if}
本例中穗泵,我們定義了一個簡單的條件,來檢測變量是否被定義谜疤。正如你所看到的佃延,條件語句中包含了一個 {else} 標(biāo)簽,在條件不為真的情況下執(zhí)行 {else} 標(biāo)簽之后的內(nèi)容夷磕。更多的條件可以通過 {elseif} 來定義履肃。如果想了解更多的操作符,請點(diǎn)擊這里
3.2.4 Loops
為了能夠處理更多數(shù)據(jù)坐桩,比如一個產(chǎn)品列表尺棋。我們可以通過循環(huán)(Loops)創(chuàng)造一個動態(tài)輸出(dynamic output)。比如撕攒,我們可以通過迭代方法輸出一個產(chǎn)品列表陡鹃。
舉例:數(shù)組循環(huán)
<ul> {foreach $sArticles as $item} <li>{$item.name}</li> {/foreach} </ul>
循環(huán)從 {foreach} 標(biāo)簽開始,到 {/foreach} 標(biāo)簽結(jié)束抖坪。在開始標(biāo)簽中萍鲸,我們定義了一個想要迭代的數(shù)組($sArticles),以及在尋呼那種將要提供的單個數(shù)據(jù)集($item)擦俐。模板引擎會對 {foreach} {/foreach} 之間的每個item進(jìn)行渲染脊阴,并且生成一個包含所有產(chǎn)品名的新列表。
**3.2.5 Official documentation / 官方文檔
Smarty還有許多特性,但在這里不再贅述嘿期,如想要了解品擎,請點(diǎn)擊這里直接進(jìn)入Smarty的官方文檔。
3.3 Template inheritance / 模板繼承
想要編輯Shopware中已存在的模板文檔(template file)备徐,你不需要拷貝所有文件或重寫核心代碼萄传。使用模板繼承系統(tǒng),你只需編輯真正想要更改的部分蜜猾。 這有很多好處:
1. 不需要拷貝整個模板
2. 少些代碼秀菱,少些維護(hù)
3. 你的模板一直可以升級(兼容性)
4. 你的模板仍然可以通過插件擴(kuò)展
3.3.1 Inherit a standard theme / 繼承默認(rèn)主題
我們強(qiáng)烈推薦你在自定義主題時,使用模板繼承系統(tǒng)蹭睡。這樣會為你省下很多時間和工作衍菱。Shopware提供了兩個標(biāo)準(zhǔn)的主題供你選擇。最常見的情況是使用Shopware Responsive主題肩豁。這是一個現(xiàn)代化脊串,全響應(yīng)式(fully responsiv)的主題,它實(shí)現(xiàn)了Shopware 5所有有趣強(qiáng)大的功能清钥。你只需要做一些設(shè)計上的變更琼锋,而不需要重建shop的整個功能。如果你想要了解更多循捺,并且從頭開始構(gòu)建自己的功能斩例,你可以繼承Shopware的Bare主題,該主題只繼承了一些基礎(chǔ)的HTML功能从橘。
舉例:在Theme.php中定義一個父主題
class Theme extends \Shopware\Components\Theme { protected $extend = 'Responsive'; // ... }
3.3.2 Inheritance and plugin templates / 模板繼承和插件
在Shopware中安裝的插件會被放在集成系統(tǒng)的特定位置中念赶。
所有插件模板都放在核心主題模板(the templates of the core themes)后面。你可以通過設(shè)置Theme.php文檔中的$injectBeforePlugins 變量來決定恰力,你的主題是要在插件之前處理還是之后處理叉谜。
如果你想要創(chuàng)建一個可以在Shopware社區(qū)中被購買的普通主題,那么該變量值應(yīng)為true踩萎,這樣你的主題就會在插件之前被處理停局。-->這種方法保證了你可以在你的主題中使用所有插件。
如果你想在本地修改某個特定的插件香府,那么就把該變量設(shè)置為false董栽,以擴(kuò)展插件模板。
class Theme extends \Shopware\Components\Theme { protected $extend = 'Responsive'; protected $name = 'CustomTheme'; protected $injectBeforePlugins = true; // ... }
3.3.3 Overwriting template files / 重寫模板文件
Shopware對所有前端文件都使用固定的文件路徑結(jié)構(gòu)企孩,前端的每一個部分都有自己的路徑和自己的模板文件锭碳。每個文件路徑中你都可以找到index.tpl文件,它包括了該文件路徑中的基礎(chǔ)部分勿璃。
當(dāng)你定義父主題時擒抛,你可以在自己的主題路徑中創(chuàng)建一個同名的文件推汽, 用于重寫并覆蓋已存在的模板文件(template files)。
比如歧沪,如果你想要完全重寫 "產(chǎn)品細(xì)節(jié)" 頁面歹撒,你可以在自定義的主題中,找到相對應(yīng)的路徑诊胞,比如 "產(chǎn)品細(xì)節(jié)" 頁面對應(yīng)的是 frontend/detail/index.tpl暖夭。
Shopware會移動檢測到你創(chuàng)造的文件,并且將他們加入到模板繼承系統(tǒng)中(template inheritance system)
3.3.4 Extending template files / 擴(kuò)展模板
大多數(shù)情況下厢钧,你并不想要重寫整個模板文件鳞尔,只是想要編輯或修改其中的字部分。因此你需要用到Smarty的拓展方法 {extends}早直。該方法要寫在文件的第一行,file屬性的內(nèi)容為你想要繼承的文檔路徑市框。
舉例:拓展一個模板文件
{extends file="parent:frontend/detail/index.tpl"}
在 {extends}
的 file=""
屬性中霞扬,你定義的文檔路徑中,將默認(rèn)主題文件夾(theme file)為根文件夾枫振。
前綴parent:告訴Shopware在父主題中搜索文件喻圃。這樣就能拓展父主題中的模板了。
被拓展的文件不能有自己的HTML結(jié)構(gòu)粪滤,因為你必須自己告訴引擎斧拍,你的模板代碼要放在哪里。相反杖小,你將獲得父文件定義的所有內(nèi)容塊肆汹。
注意:
{extends}
語句必須寫在.tpl文檔的第一行
3.3.5 Blocks / 代碼塊
Smarty代碼塊(blocks)被用來在邏輯段中構(gòu)造模塊代碼(template code)。這些代碼塊可以被其他文件在特定的位置進(jìn)行拓展予权。通過 {block}
標(biāo)簽我們可以在Smarty中創(chuàng)建代碼塊昂勉,該標(biāo)簽將代碼內(nèi)容作為一個新的段落(segment)封裝起來。每個block都有 name=""
屬性扫腺,給這段代碼定義一個獨(dú)一無二的名字岗照。通過這個名字,我們能從其他文件中訪問到這段代碼笆环。
舉例:A.tpl中定義一個代碼塊
{block name="frontend_index_logo"}
<div class="logo--shop">
//...
</div>
{/block}
當(dāng)你通過 {extends} 方法繼承A.tpl這個模板文件時攒至,就獲得了訪問該模板文件中所有blocks的能力,你可以這樣訪問這些blocks:
{* 使用方法一 *}
{block name="frontend_index_logo"}
{$smarty.block.parent}
<div class="shop--slogan">
<h2>My shop is the best!</h2>
</div>
{/block}
{* 使用方法二 *}
{block name="frontend_index_logo" append}
<div class="shop--slogan">
<h2>My shop is the best!</h2>
</div>
{/block}
使用方法一:
- 保留父代碼塊(parent block)的內(nèi)容 ==>
{$smarty.block.parent}
- 在
frontend_index_logo
這個Block中躁劣,加上了自己的代碼 ==><div class="shop--slogan"> ... </div>
使用方法二:
append
這個修飾符在原Block之后添加<div class="shop--slogan"> ... </div>
迫吐。
其他修飾符還有:
- append:在parent template {block}之后添加內(nèi)容
- prepend:在parent template {block}之前添加內(nèi)容
- hide:如果該Block沒有子Block,則該Block將被忽視
- nocache:該Block禁用緩存
總結(jié)一下习绢,如果你需要編輯或者修改繼承的模塊渠抹,需要這樣操作:
- 在模板文件中找到你想要修改的block
- 在你自己的theme下蝙昙,按照同樣的路徑創(chuàng)建同名的模板文件
- 在2中創(chuàng)建的模板文件中添加 {extend} 標(biāo)簽,并且在file屬性中寫上1中找到的文件路徑
- 在3中新建的模板文件中定義block梧却。你可以通過將 {$smarty.block.parent} 寫在自定義內(nèi)容的前面/后面奇颠,來決定自定義內(nèi)容和原block內(nèi)容的先后順序。
3.4 Register custom smarty plugins / 注冊自定義Smarty插件
Shopware 5中放航,我們添加了在自定義theme中使用自定義插件的功能烈拒。用戶能夠創(chuàng)建新的修飾符和Smarty功能。要注冊一個新的插件广鳍,你需要在你的主題中創(chuàng)建相關(guān)的文件路徑結(jié)構(gòu)荆几。詳細(xì)教程請點(diǎn)擊這里
舉例:自定義Smarty插件的路徑
/_private/smarty/function.markdown.php /_private/smarty/modifier.picture.php