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

文章來源

3.1 What is Smarty? / 什么是Smarty

Smarty 3 是一個Shopware前段的模板(template)工具。有了它,你不需要懂很多PHP的知識,只需要專注于HTML,CSS和JavaScript和一點點Smarty的知識就夠了。

3.2 The basics / 基礎知識

Smarty的語法和HTML,XML等標記語言很像。每個Smarty標簽都以花括號 { 開始,以花括號 } 結束,就像HTML中的 <> 一樣。包含Smarty的文件后綴名為 .tpl。 你可以把它當成一個包含了Smarty標簽的HTML文檔。
模板引擎(template engine)會渲染tpl文件并轉換成有效的HTML文件形式。

舉例:簡單的Smarty標簽
{s name="shopName"}DemoShop{/s}
{s}標簽用于定義文本片段,并使他可翻譯(make it translatable)。可以看到,Smarty標簽都在花括號內,和HTML一樣,它也可以有不同的屬性比如這里的 name=""。

3.2.1 Variables
為了開始Smarty的學習,我們先嘗試用Smarty輸出從Shopware系統取得的信息。每個頁面都由模板引擎進行渲染,并顯示所需數據。所有數據都被存儲在名為模板變量(template variables)。所有的變量都能通過Smarty的語法:美元符 $ + 變量名 調用到。

舉例:變量輸出
<h2>{$sArticle.name}</h2>
該例會輸出變量.name的內容,輸出樣式為 h2。這里用到的分隔符 . 是用于訪問其子值的(sub-values)。像本例中所看到的那樣,變量可以不僅僅是簡單的string或者number類型,它可以是一個數字集,即數組(array)。
上面的例子中,變量名為sArticle,該變量是個數組,包含了多個字段,而name是它字段中的一個。
模板變量可以被嵌套的更深,比如{$sArticle.image.thumbnails[0].source}。數組的所有字段可以通過 [] 語法訪問到。

3.2.2 Modifiers
有時候我們不僅僅想要簡單的輸出變量內容,還想要在它被渲染之前對變量進行操作。這里我們就需要Smarty修飾符(Smarty modifiers)了。修飾符是一些用于修改變量輸出的小函數。

舉例:修飾符在變量上的應用
<div> {$sArticle.description|truncate:120} </div>
例子中,修飾符放在變量后面,通過簡單的 | 符號 + 修飾符名字被使用。這里用到的truncate修飾符的作用是:將文本縮短到給定的字符數量,這里是120個字符,該參數通過:+ 數字使用。
你可以對一個變量同時使用多個修飾符,每個修飾符之間用 | 隔開即可。這些修飾符會按照書寫順序一個一個被用到。

舉例:使用兩個修飾符

比如,你想要在使用truncate方法指定字符串數之前,先把其中所包含的HTML標簽去掉:
<div> {$sArticle.description|strip_tags|truncate:120} </div>

3.2.3 Conditions
有時候,你可能需要根據不同的條件輸出不同的結果。這里條件語句用 {if} 標簽,它包含了一條件判斷,最后以 {/if} 結束。在這兩個標簽之間的內容只在條件判斷為true時,才會被輸出。

舉例:定義一個條件
{if $sArticle.description} {$sArticle.description} {else} {$sArticle.description_long|strip_tags|truncate:120} {/if}
本例中,我們定義了一個簡單的條件,來檢測變量是否被定義。正如你所看到的,條件語句中包含了一個 {else} 標簽,在條件不為真的情況下執行 {else} 標簽之后的內容。更多的條件可以通過 {elseif} 來定義。如果想了解更多的操作符,請點擊這里

3.2.4 Loops
為了能夠處理更多數據,比如一個產品列表。我們可以通過循環(Loops)創造一個動態輸出(dynamic output)。比如,我們可以通過迭代方法輸出一個產品列表。

舉例:數組循環

<ul> {foreach $sArticles as $item} <li>{$item.name}</li> {/foreach} </ul>

循環從 {foreach} 標簽開始,到 {/foreach} 標簽結束。在開始標簽中,我們定義了一個想要迭代的數組($sArticles),以及在尋呼那種將要提供的單個數據集($item)。模板引擎會對 {foreach} {/foreach} 之間的每個item進行渲染,并且生成一個包含所有產品名的新列表。

**3.2.5 Official documentation / 官方文檔
Smarty還有許多特性,但在這里不再贅述,如想要了解,請點擊這里直接進入Smarty的官方文檔。

3.3 Template inheritance / 模板繼承

想要編輯Shopware中已存在的模板文檔(template file),你不需要拷貝所有文件或重寫核心代碼。使用模板繼承系統,你只需編輯真正想要更改的部分。 這有很多好處:
1. 不需要拷貝整個模板
2. 少些代碼,少些維護
3. 你的模板一直可以升級(兼容性)
4. 你的模板仍然可以通過插件擴展

3.3.1 Inherit a standard theme / 繼承默認主題
我們強烈推薦你在自定義主題時,使用模板繼承系統。這樣會為你省下很多時間和工作。Shopware提供了兩個標準的主題供你選擇。最常見的情況是使用Shopware Responsive主題。這是一個現代化,全響應式(fully responsiv)的主題,它實現了Shopware 5所有有趣強大的功能。你只需要做一些設計上的變更,而不需要重建shop的整個功能。如果你想要了解更多,并且從頭開始構建自己的功能,你可以繼承Shopware的Bare主題,該主題只繼承了一些基礎的HTML功能。

舉例:在Theme.php中定義一個父主題
class Theme extends \Shopware\Components\Theme { protected $extend = 'Responsive'; // ... }

3.3.2 Inheritance and plugin templates / 模板繼承和插件
在Shopware中安裝的插件會被放在集成系統的特定位置中。
所有插件模板都放在核心主題模板(the templates of the core themes)后面。你可以通過設置Theme.php文檔中的$injectBeforePlugins 變量來決定,你的主題是要在插件之前處理還是之后處理。
如果你想要創建一個可以在Shopware社區中被購買的普通主題,那么該變量值應為true,這樣你的主題就會在插件之前被處理。-->這種方法保證了你可以在你的主題中使用所有插件。
如果你想在本地修改某個特定的插件,那么就把該變量設置為false,以擴展插件模板。
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對所有前端文件都使用固定的文件路徑結構,前端的每一個部分都有自己的路徑和自己的模板文件。每個文件路徑中你都可以找到index.tpl文件,它包括了該文件路徑中的基礎部分。
當你定義父主題時,你可以在自己的主題路徑中創建一個同名的文件, 用于重寫并覆蓋已存在的模板文件(template files)。
比如,如果你想要完全重寫 "產品細節" 頁面,你可以在自定義的主題中,找到相對應的路徑,比如 "產品細節" 頁面對應的是 frontend/detail/index.tpl。
Shopware會移動檢測到你創造的文件,并且將他們加入到模板繼承系統中(template inheritance system)

3.3.4 Extending template files / 擴展模板
大多數情況下,你并不想要重寫整個模板文件,只是想要編輯或修改其中的字部分。因此你需要用到Smarty的拓展方法 {extends}。該方法要寫在文件的第一行,file屬性的內容為你想要繼承的文檔路徑。

舉例:拓展一個模板文件
{extends file="parent:frontend/detail/index.tpl"}
{extends}file="" 屬性中,你定義的文檔路徑中,將默認主題文件夾(theme file)為根文件夾。
前綴parent:告訴Shopware在父主題中搜索文件。這樣就能拓展父主題中的模板了。
被拓展的文件不能有自己的HTML結構,因為你必須自己告訴引擎,你的模板代碼要放在哪里。相反,你將獲得父文件定義的所有內容塊。

注意:{extends}語句必須寫在.tpl文檔的第一行

3.3.5 Blocks / 代碼塊
Smarty代碼塊(blocks)被用來在邏輯段中構造模塊代碼(template code)。這些代碼塊可以被其他文件在特定的位置進行拓展。通過 {block} 標簽我們可以在Smarty中創建代碼塊,該標簽將代碼內容作為一個新的段落(segment)封裝起來。每個block都有 name="" 屬性,給這段代碼定義一個獨一無二的名字。通過這個名字,我們能從其他文件中訪問到這段代碼。

舉例:A.tpl中定義一個代碼塊

{block name="frontend_index_logo"}
    <div class="logo--shop"> 
        //...
    </div>
{/block}

當你通過 {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)的內容 ==> {$smarty.block.parent}
  2. frontend_index_logo這個Block中,加上了自己的代碼 ==> <div class="shop--slogan"> ... </div>

使用方法二:
append這個修飾符在原Block之后添加<div class="shop--slogan"> ... </div>
其他修飾符還有:

  • append:在parent template {block}之后添加內容
  • prepend:在parent template {block}之前添加內容
  • hide:如果該Block沒有子Block,則該Block將被忽視
  • nocache:該Block禁用緩存

總結一下,如果你需要編輯或者修改繼承的模塊,需要這樣操作:

  1. 在模板文件中找到你想要修改的block
  2. 在你自己的theme下,按照同樣的路徑創建同名的模板文件
  3. 在2中創建的模板文件中添加 {extend} 標簽,并且在file屬性中寫上1中找到的文件路徑
  4. 在3中新建的模板文件中定義block。你可以通過將 {$smarty.block.parent} 寫在自定義內容的前面/后面,來決定自定義內容和原block內容的先后順序。

3.4 Register custom smarty plugins / 注冊自定義Smarty插件

Shopware 5中,我們添加了在自定義theme中使用自定義插件的功能。用戶能夠創建新的修飾符和Smarty功能。要注冊一個新的插件,你需要在你的主題中創建相關的文件路徑結構。詳細教程請點擊這里

舉例:自定義Smarty插件的路徑
/_private/smarty/function.markdown.php /_private/smarty/modifier.picture.php

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容

  • 2.1 Introduction 本章節會通過一個實例,一步步地為開發者介紹Shopware5的模板創建。本章內容...
    _chuuuing_閱讀 589評論 0 0
  • 介紹 Jinja是基于python的模板引擎,功能比較類似于于PHP的smarty,J2ee的Freemarker...
    ZhouLang閱讀 7,977評論 0 2
  • Spring Cloud為開發人員提供了快速構建分布式系統中一些常見模式的工具(例如配置管理,服務發現,斷路器,智...
    卡卡羅2017閱讀 134,973評論 19 139
  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 173,446評論 25 708
  • /1/ 當你閱讀時感受到痛苦,那都是真實的,當你閱讀時感受到了美,那也都是真實的。 ...
    左耶閱讀 1,162評論 2 7