Smarty3配置及入門語法


一.Smarty3配置

下載Smarty文件

在Smarty的官方網站下載Smarty文件,解壓下載到的Smarty文件,Smarty的庫文件就在libs文件夾中。

我使用的PHP調試環境的程序集成包是phpstudy,默認在D盤會有一個WWW的文件夾,在WWW文件夾中創建一個testSmarty的文件夾,testSmarty文件夾就是本次練習Smarty的項目根目錄。在testSmarty中創建一個smarty的文件夾,並將libs中的文件復制到這個smarty文件夾中。目錄結構如下:

Smarty配置

在testSmarty文件夾中創建一個test文件夾,在這個文件夾中創建一個config.php文件,內容如下:

<?php
header("content-type:text/html;charset=utf-8");
//引入核心文件並實例化
require ('/WWW/testSmarty/smarty/Smarty.class.php');
$smarty = new Smarty();

//配置
//模板文件的路徑
$smarty->template_dir = '/WWW/testSmarty/test/tpl';
//模板文件編譯后得到的文件的路徑
$smarty->compile_dir = '/WWW/testSmarty/test/template_c';
//緩沖文件的路徑
$smarty->cache_dir = '/WWW/testSmarty/test/cache';
//開啟緩沖,緩沖默認是關閉的
$smarty->caching = true;
//緩沖的保留時間
$smarty->cache_lifetime = 120;
?>

在設置路徑的時候我使用的是絕對路徑,也能使用相對路徑。依據設置的路徑,還要在test文件夾中創建tpl,template_c和cache文件夾。

目錄如下:

檢驗smarty是否配置成功:

在test文件夾下創建一個start.php文件,文件內容如下:

<?php
//引入配置文件
require ('config.php');
//向模板文件中傳遞值
$smarty->assign('text','hello Smarty');
//渲染模板
$smarty->display('start.tpl');
?>

在tpl文件中創建一個start.tpl文件,內容如下:

{$text}

模板文件的后綴並不是非得是tpl

在瀏覽器中輸入localhost:800/testSmarty/test/start.php

注意:在我這兒Apache是800端口

如果瀏覽器中能夠顯示出hello Smarty,則說明Smarty配置成功。

二.入門語法

界定符

Smarty的標簽是位於界定符之間,默認界定符是{和},界定符是可以改變的。在配置文件中對界定符進行修改,如下:

  //將左界定符改為#

$smarty->left_delimiter = '#';
//將右界定符改為#
$smarty->right_delimiter = '#';

當Smarty讀取到界定符之間的內容會試圖解析它,並輸出結果。在界定符之外的內容都是靜態。

注釋

注釋是以*開頭*結尾的,外面包着界定符,如下:

{* 這兒是注釋 *}

輸出變量

//向要渲染的模板傳遞值

$smarty->assign('變量名',值)

傳遞的值可以是字符串,數組也能是對象。

當變量是字符串時,{$變量名}表示輸出變量。

當變量是數組時,輸出變量的方式有兩種,分別為:

  a.{$arr.key}

  b.{$arr['key']}

當是一個對象時,可以直接通過obj->method(),調用對象的方法

條件判斷

條件判斷的基本句式如下:

{if $variable 條件修飾符 value1}
    //some
{elseif $variable 條件修飾符 value2}
    //some
{else}
    //some
{/if}

基本的條件修飾符有:eq(等於),neq(不等於),gt(大於),lt(小於),lte(小於等於),gte(大於等於)。修飾符前后要有空格

循環

Smarty中有兩種循環,分別是foreach,section,for和while

section循環

section不能循環遍歷關聯數組,它只能循環遍歷連續數字下標的數組,如果要循環關聯數組使用foreach

section可以接受name,loop,step,start,max,show,其中name和loop是必須的。name是每一次循環得到的下標,loop是垚循環的值,step循環的步長,默認為1,max是最大循環的次數,start開始循環的下標,默認為0,如果start為負數,就從數組末尾開始循環,show表示是否顯示循環的內容,默認是true

如下:

在test文件夾下創建section.php文件,內容如下:

<?php
require ('config.php');
$article = array(
    array(
        'title'=>'第一章',
        'name'=>'QxQstar',
        'content'=>'Smarty section循環第一章'
    ),
    array(
        'title'=>'第二章',
        'name'=>'QxQstar',
        'content'=>'Smarty section循環第二章'
    )
);
$smarty->assign('article',$article);
$smarty->display('section.tpl');
?>

在tpl文件夾下創建section.tpl文件,內容如下:

<ul>
    {section name=item loop=$article}
        <li>
            {$article[item].title}
            <p>作者:{$article[item].name}</p>
            <p>內容:{$article[item].content}</p>
        </li>
    {sectionelse}
        沒有文章
    {/section}
</ul>

 

foreach循環

foreach循環比section循環要簡單,foreach的語法與php中foreach的語法很像,foreach可以做到任何section做到的功能,並且foreach更簡單

{foreach $arrayvar as $itemvar}

{foreach $arrayvar as $keyvar=>$itemvar}

例子如下:

在test文件夾中創建foreach.php文件,文件內容如下:

<?php

require ('config.php');
$articles = array(
    array(
        'title'=>'第一章',
        'name'=>'QxQstar',
        'content'=>'Smarty foreach循環第一章'
    ),
    array(
        'title'=>'第二章',
        'name'=>'QxQstar',
        'content'=>'Smarty foreach循環第二章'
    )
);
$smarty->assign('articles',$articles);
$smarty->display('foreach.tpl');
?>

在tpl文件夾中創建foreach.tpl文件,內容如下:

<ul>
    {foreach $articles as $article}
        <li>
            {$article.title}
            <p>{$article.name}</p>
            <p>{$article.content}</p>
        </li>
        {foreachelse}
        <p>沒有文章</p>
    {/foreach}
</ul>

for循環

for循環用於創建一個簡單的循環,語法如下:

{for $variable = $startValue to $entValue step $step}

{for $i = 0 to 10 step 2}
    {$i}
{foreach}
不能進行循環
{
/for}

 

step可以不指定,默認循環的步長是1。for還可以指定一個max屬性,max屬性用於指定循環的次數

與foreach循環類似,for循環也有一個forelse。{forelse}在循環不能遍歷的時候執行

while循環

Smarty的while循環與php中的while循環類似,語法如下:

{while $variable > 0}

//some

{/while}

 

在循環中使用{break}可以停止循環,{continue}退出當前循環進入下一次循環

插件

Smarty插件的實質是函數,插件的類型有三種,分別是function插件,modifier插件(變量調節插件),block插件

使用插件

function插件的使用:{funcName param1 = value...}

modifier插件的使用:{$variable | modifierName:param1...}

block插件的使用:

{blockName param1 = value...}

  {$content}

{/blockName}

如:

//function插件的使用
{include file='header.tpl'}
//modifier插件的使用
{'abc'|cat:'d'}
//block插件的使用
{textformat wrap = 10}
abc def
ghikj lmn
{/textformat}

制作插件

制作插件的方式有三種

1.使用registerPlugin函數注冊寫好的自定義函數

2.將寫好的插件放在smarty目錄中的Plugins目錄里

3.PHP內置函數可以自動的以修飾插件(變量調節插件)的形式在模板中使用

使用registerPlugin函數注冊自定義插件,例子如下

在test文件夾下創建defineFunc.php文件,內容如下:

<?php
require ('config.php');
function test($params){
    $p1 = $params['p1'];
    $p2 = $params['p2'];
    return $p1.$p2;
}
$smarty->registerPlugin('function','f_test','test');
$smarty->display('definedFunc.tpl');


?>

在tpl文件夾下創建一個defineFunc.tpl文件,內容如下:

{f_test p1='learn' p2=' Smarty'}

registerPlugin函數的第一個參數說明注冊的這段程序的類型,在這里是function說明注冊的是一個function插件,還可以取得值有block和modifier,第二個參數指注冊的Smarty function插件名,第三個參數指自定義函數名,第二個參數和第三個參數可以相同。

在Smarty中當執行到{f_test p1='learn' p2=' Smarty'}時,p1和p2會被打包成一個數組傳遞到我們定義的test函數中去。

 

通過網Plugins文件夾中添加文件的方式制作插件

1.制作function插件

在Plugins文件夾下創建一個function.test.php文件(function表示這個一個function插件,test表示插件名),內容如下:

function smarty_function_test($params){
    //$params是一個關聯數組
    $w = $params['w'];
    $h = $params['h'];
    return $w * $h;
}
?>

在模板中直接使用test function插件

{test h = 3 w = 5}

這兩個參數會被打包成一個數組傳遞到smarty_function_test函數中

2.制作modifier插件

在Plugins文件夾下創建一個modifier.test2.php文件(modifier表示這個一個modifier插件,test2表示插件名),內容如下:

function smarty_modifier_test2($utime,$formate){
    return date($formate,$utime);
}

在模板中使用test2 modifier插件

{$time|test2:'Y-m-d H-i-s'}

定義modifier插件和function插件有所不同,function插件的自定義函數只接收一個數組參數,modifier插件的自定義函數
將接收到的參數一一列舉出來

3.制作block插件

在Plugins文件夾下創建一個block.test3.php文件(block表示這個一個block插件,test3表示插件名),內容如下:

function smarty_block_test3($params ,$content){
    $replace = $params['replace'];
    $maxnum = $params['maxnum'];
    if($replace == 'true'){
        str_replace(',', ',', $content);
        str_replace('。', '.', $content);

    }
    $content = substr($content,0,$maxnum);

    return $content;
}

在模板中使用test3 block插件

{test3 replace='true' maxnum = 6}

abcdfedddderere

{/test3}

{test3}{/test3}之間的內容傳遞到smarty_block_test3中的第二個參數中,test3后跟着的參數打包成一個數組傳遞到smarty_block_test3中的第一個參數中。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM