Smarty模板引擎

1、Smarty模板引擎

1.Smarty模板引擎簡介php

Smarty分離了邏輯代碼和外在的內容,提供了一種易於管理和使用的方法,將本來與HTML代碼混雜在一塊兒PHP代碼邏輯分離。簡單的講,就是要使PHP程序員同前端人員分離,程序員改變程序的邏輯內容不會影響到前端人員的頁面設計,前端人員從新修改頁面不會影響到程序的程序邏輯,這在多人合做的項目中顯的尤其重要。html

  • Smarty模板引擎優勢:前端

    1)速度:相對於其餘模板技術而言,採用Smarty編寫程序能夠得到最大速度的提升。git

    2)編譯型:採用Smarty編寫的程序在運行時要編譯成一個非模板技術的PHP文件,這個文件採用了PHP與HTML混合的方式,在下一次訪問模板時將WEB請求直接轉換到這個文件中,而沒必要進行從新編譯模板(在源程序沒有改動的狀況下)程序員

    3)緩存技術:Smarty選用的一種緩存技術,它能夠將用戶最終看到的HTML文件緩存成一個靜態的HTML頁,當設定Smarty的cache屬性爲true時,在Smarty設定的cachetime期內將用戶的WEB請求直接轉換到這個靜態的HTML文件中來,這至關於調用一個靜態的HTML文件。github

    4)插件技術:Smarty能夠自定義插件。插件實際就是一些自定義的函數。數據庫

    5)模板中可使用if/elseif/else/endif。在模板文件使用判斷語句能夠很是方便的對模板進行格式重排。api

  • 不適合使用Smarty的地方:數組

    1)須要實時更新的內容。例如像股票顯示,它須要常常對數據進行更新,這類型的程序使用smarty會使模板處理速度變慢。瀏覽器

    2)小項目。因小項目簡單而使美工與程序員兼於一人,使用Smarty會在必定程度上喪失PHP開發迅速的優勢。

2.Smarty模板引擎原理

Smarty模板引擎的原理:把模板文件編譯成php文件,而後每次都去讀取模板的修改時間,沒有修改就不編譯。而後include這個「編譯」後的PHP文件。所謂編譯也就是模板用正則替換成含PHP代碼的過程。模板文件和php程序文件通過模板引擎的編譯後合成一個文件,即編譯後的文件。

3.Smarty開發模式與運行流程

Smarty的這種開發模式是基於MVC框架概念。MVC全名是Model View Controller,是模型(model)-視圖(view)-控制器(controller)的縮寫。MVC已經成爲一種軟件設計典範,它用一種業務邏輯、數據、界面顯示分離的方法組織代碼,將業務邏輯彙集到一個部件裏面,在改進和個性化定製界面及用戶交互的同時,不須要從新編寫業務邏輯。

  • Model(模型)是應用程序中用於處理應用程序數據邏輯的部分。

一般模型對象負責在數據庫中存取數據。

  • View(視圖)是應用程序中處理數據顯示的部分。

一般視圖是依據模型數據建立的。

  • Controller(控制器)是應用程序中處理用戶交互的部分。

一般控制器負責從視圖讀取數據,控制用戶輸入,並向模型發送數據。

Smarty模板引擎將PHP程序直接生成模板文件,最終瀏覽器中讀取的就是Smarty模板文件,而且Smarty可以對模板文件進行判斷,若是是第一次或者模板已經改變,則從新生成。

2、學習Smarty模板

1.下載解壓

  • 根目錄:

2.結構介紹

  • libs下:

  • demo下:

3.基本實現

  • 配置

    test.php

    <?php
    //1.Smarty類的引入  引入上圖的主文件
    require '../libs/Smarty.class.php';
    
    //2.Smarty類的實例化
    $smarty = new Smarty();
    
    //3.Smarty  "五配置兩方法"
    $smarty -> setLeftDelimiter('{');         //左定界符
    $smarty -> setRightDelimiter('}');        //右定界符
    $smarty -> setTemplateDir('tpl');         //html模板的地址
    $smarty -> setCompileDir('template_c');   //模板編譯生成的文件
    $smarty -> setCacheDir('cache');          //緩存地址
    
    //Smarty的緩存機制不太理想,能夠不使用
    $smarty -> setCaching(Smarty::CACHING_LIFETIME_CURRENT);
    $smarty -> setCacheLifetime(300);
  • 基本操做

    test.php

    //1.註冊
    $smarty->assign('title','學習Smarty');
    
    /*也能夠分開
    $title = "學習Smarty";
    $smarty->assign('title',$title);
    */
    
    //2.展現模板
    $smarty->display('test.tpl');

    test.tpl

    {$title}

    以上實現了一個簡單的模板註冊數據以及展現數據

    總結步驟:

    Step 1:加載 Smarty 模版引擎。

    Step 2:創建 Smarty 對象。

    Step 3:設定 Smarty 對象的參數。

    Step 4:在程序中處理變量後,再用 Smarty 的 assign 方法將ji變量置入模版裏。

    Step 5:利用 Smarty 的 display 方法將網頁顯示出來

3、Smarty模板的設計

1.模版註釋

​ 模板註釋被號包圍,例如 **{* this is a comment *} **

​ 定界符能夠改變,若是定界符改成<{}>

​ 則註釋爲 **<{* this is a comment *}>**

2.保留變量

​ 在Smarty模板中使用保留變量時,無須使用assign()方法傳值,直接調用變量名便可。

​ smarty中經常使用 的保留變量:

```php
{$smarty.now}            //取得當前時間戳
{$smarty.const}          //直接訪問php常量
{$smarty.capture}        
{$smarty.config}         //取得配置變量
{$smarty.section} 
{$smarty.template} 
{$smarty.current_dir} 
{$smarty.version} 
{$smarty.block.child} 
{$smarty.block.parent} 
{$smarty.ldelim},  
{$smarty.rdelim}
```

自行百度

3.變量調節器

  • capitalize (首字母大寫)

    繼續在代碼實現:

    test.php

    //1.註冊數據
    $smarty -> assign('habbit','i like eat apple');
    
    //2.展現模板
    $smarty -> display('test.tpl');

    test.tpl

    {$habbit|capitalize}

    效果展現:

    能夠看出每一個單詞的首字母大寫了

  • date_format (轉換時間戳格式)

    test.php

    $smarty -> assign('date',time());

    test.tpl

    {$date|date_format}

    效果是將時間戳格式轉換爲咱們可讀的年月日

    {$date|date_format:"%B %e, %Y"}
  • default (默認展現)

    test.php

    //定義一個變量模擬 我的簽名 爲空的時候
    $signifcant = "";
    $smarty -> assign('signifcant',$signifcant);

    test.tpl

效果展現:

若是$significant不爲空

$signifcant = "哥只是個傳說";

效果展現:

1540804977201

從以上三個變量調節器中,咱們瞭解到了變量調節器的做用以及用法

後面的粗略列出:

  • escpae

    用於html轉碼,url轉碼,十六進制轉碼等。詳見手冊

  • lower/upper

    將變量字符串小(大)寫

  • nl2br

    全部換行符轉換成 <br/>

  • .......(後面本身看手冊)

4.流程控制

  • 條件判斷

    • 基本句式

      {if $name eq "Fred"}
         Welcome Sir.
      {elseif $name eq "Wilma"}
         Welcome Ma'am.
      {else}
         Welcome,whatever you are.
      {/if}
    • 基本的條件修飾符:
      • eq (==)
      • neq (!=)
      • gt (>)
      • lt (<)

    注意:修飾詞必須和變量或常量用空格隔開

    • 案例

    test.php

    $score  = 59;
    $smarty -> assign('score',$score);

    test.tpl

    {if $score gt  90}
      優秀
    {elseif $score gt 59}
      合格
    {else}
      掛科啦
    {/if}

    效果展現:

    • Smarty 的循環語句 section

      • 嘗試使用

      test.php

      $arr2 = array(
          array(
              'title'  => 'Smarty的學習',
              'author' => '小明'
          ),
          array(
              'title'  => 'html的學習',
              'author' => '小紅'
          )
      );
      $smarty -> assign('arr2',$arr2);

      test.tpl

      {section name=arrList loop=$arr2}
        {$arr2[arrList].author}
        {$arr2[arrList].title}
      {/section}

  • 以上是表格其餘 section 的參數

    • foreach

      • 可用於循環關聯數組

        test.php

        $arr2 = array(
            array(
                'title'  => 'Smarty的學習',
                'author' => '小明'
            ),
            array(
                'title'  => 'html的學習',
                'author' => '小紅'
            )
        );
        $smarty -> assign('arr2',$arr2);

        test.tpl

        {foreach item=arrList from=$arr2}
          {$arrList.title}
          {$arrList.author}
          <br>
          {foreachelse}
          當前沒有內容
        {/foreach}

        {foreachelse} 。同時,{section } 也支持 {sectionelse}

        不贅述。

      • Smarty 3以後,支持php原生的foreach 語法

        {foreach $arr2 as $arrList}
          {$arrList.title}
          {$arrList.author}
          <br>
        {/foreach}

5.Smarty文件的引入

  • include

    先建立一個header.tpl 文件,待引入,寫簡單的一句話

    我是 header.tpl

    而後到 test.tpl 中去引入

    {include file="header.tpl"}

​ 效果以下:

`include` 除了 `file` 屬性以外,還有其餘自定義的屬性

​ 好比建立一個屬性sitename 用他表示網站名稱

{include file="header.tpl" sitename="github"}

​ 這時候 header.tpl 裏面就能夠輸出 sitename 的屬性

{$sitename}
  • Smarty類與對象的複製與使用

    • register_object方法,在Smarty中已經棄用

    • assign方法;將一個類的對象以變量的形式複製到smarty模板中使用

      test.php

      class A{
        function meth1(){
            echo "hello";
        }
      };
      
      $a = new A();
      $smarty->assign('a',$a);
      
      $smarty -> display('test.tpl');

      test.tpl

      {$a -> meth1()}

    這樣就能輸出 hello 的字樣

6.函數的使用

  • php內置函數

    test.php

    $smarty -> assign('time',time());
    $smarty -> display('test.tpl');

    test.tpl

    {"Y-m-d"|data:$time}

前面"Y-m-d"是做爲函數data()的第一個參數,冒號後面時data()的第二個參數

打印出時間

  • 自定義函數

    • register

      $smarty -> registerPlugin('function','f_test','test);

7.function函數庫的定義和使用

步驟:

  • 1.函數庫自定義插件

  • 2.按照命名規範命名php文件

  • 3..按照命名規範命名自定義函數插件 smarty_function_插件名

    以下:(計算矩形面積的自定義函數插件)

  • 4.建立模板和展現模板

area.tpl模板內容

{test width=200 height=30}

目錄結構:

1541237846733

  • 5.調試結果

8.modifies變量調節器插件的定義和使用

  • 方法和自定義函數插件相似

    命名規範

模板的內容:調用modifier插件

9.block_function區塊函數插件的定義和使用

  • 自定義區塊函數插件

  • 建立模板

    1541302924497

  • 展現模板

  • 效果

相關文章
相關標籤/搜索