3. Smarty in Shopware / Shopware中Smarty的使用

文章來源

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; // ... }

Position of plugins.png

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}

使用方法一:

  1. 保留父代碼塊(parent block)的內(nèi)容 ==> {$smarty.block.parent}
  2. 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é)一下习绢,如果你需要編輯或者修改繼承的模塊渠抹,需要這樣操作:

  1. 在模板文件中找到你想要修改的block
  2. 在你自己的theme下蝙昙,按照同樣的路徑創(chuàng)建同名的模板文件
  3. 在2中創(chuàng)建的模板文件中添加 {extend} 標(biāo)簽,并且在file屬性中寫上1中找到的文件路徑
  4. 在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

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市赊时,隨后出現(xiàn)的幾起案子吨铸,更是在濱河造成了極大的恐慌,老刑警劉巖祖秒,帶你破解...
    沈念sama閱讀 211,743評論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件诞吱,死亡現(xiàn)場離奇詭異,居然都是意外死亡竭缝,警方通過查閱死者的電腦和手機(jī)房维,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,296評論 3 385
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來抬纸,“玉大人咙俩,你說我怎么就攤上這事∈剩” “怎么了阿趁?”我有些...
    開封第一講書人閱讀 157,285評論 0 348
  • 文/不壞的土叔 我叫張陵,是天一觀的道長晓锻。 經(jīng)常有香客問我歌焦,道長,這世上最難降的妖魔是什么砚哆? 我笑而不...
    開封第一講書人閱讀 56,485評論 1 283
  • 正文 為了忘掉前任独撇,我火速辦了婚禮,結(jié)果婚禮上躁锁,老公的妹妹穿的比我還像新娘纷铣。我一直安慰自己,他們只是感情好战转,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,581評論 6 386
  • 文/花漫 我一把揭開白布搜立。 她就那樣靜靜地躺著,像睡著了一般槐秧。 火紅的嫁衣襯著肌膚如雪啄踊。 梳的紋絲不亂的頭發(fā)上忧设,一...
    開封第一講書人閱讀 49,821評論 1 290
  • 那天,我揣著相機(jī)與錄音颠通,去河邊找鬼址晕。 笑死,一個胖子當(dāng)著我的面吹牛顿锰,可吹牛的內(nèi)容都是我干的谨垃。 我是一名探鬼主播,決...
    沈念sama閱讀 38,960評論 3 408
  • 文/蒼蘭香墨 我猛地睜開眼硼控,長吁一口氣:“原來是場噩夢啊……” “哼刘陶!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起牢撼,我...
    開封第一講書人閱讀 37,719評論 0 266
  • 序言:老撾萬榮一對情侶失蹤匙隔,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后浪默,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體牡直,經(jīng)...
    沈念sama閱讀 44,186評論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,516評論 2 327
  • 正文 我和宋清朗相戀三年纳决,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片乡小。...
    茶點(diǎn)故事閱讀 38,650評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡阔加,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出满钟,到底是詐尸還是另有隱情胜榔,我是刑警寧澤,帶...
    沈念sama閱讀 34,329評論 4 330
  • 正文 年R本政府宣布湃番,位于F島的核電站夭织,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏吠撮。R本人自食惡果不足惜尊惰,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,936評論 3 313
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望泥兰。 院中可真熱鬧弄屡,春花似錦、人聲如沸鞋诗。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,757評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽全庸。三九已至秀仲,卻和暖如春神僵,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背墩崩。 一陣腳步聲響...
    開封第一講書人閱讀 31,991評論 1 266
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留徘键,地道東北人吹害。 一個月前我還...
    沈念sama閱讀 46,370評論 2 360
  • 正文 我出身青樓它呀,卻偏偏與公主長得像奢人,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,527評論 2 349

推薦閱讀更多精彩內(nèi)容

  • 2.1 Introduction 本章節(jié)會通過一個實(shí)例欲主,一步步地為開發(fā)者介紹Shopware5的模板創(chuàng)建逝嚎。本章內(nèi)容...
    _chuuuing_閱讀 540評論 0 0
  • 介紹 Jinja是基于python的模板引擎昧互,功能比較類似于于PHP的smarty叽掘,J2ee的Freemarker...
    ZhouLang閱讀 7,874評論 0 2
  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理,服務(wù)發(fā)現(xiàn),斷路器,智...
    卡卡羅2017閱讀 134,633評論 18 139
  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 171,777評論 25 707
  • /1/ 當(dāng)你閱讀時感受到痛苦,那都是真實(shí)的辽幌,當(dāng)你閱讀時感受到了美成玫,那也都是真實(shí)的哭当。 ...
    左耶閱讀 1,110評論 2 7