目錄
{$title}
首頁 php教程 php手册 模板引擎smarty工作原理以及使用示例

模板引擎smarty工作原理以及使用示例

Jun 13, 2016 am 09:34 AM
php smarty

模板引擎是用于把模板文件和数据内容合并在一起的程序,便于网站开发有利于代码分离和维护,了解一个模板最好知道其工作原理,以便于实现一通万通。

模板文件一般是HTML xml js等类型文件,如果不用模板引擎若要把数据显示在网页上,我们需要在php中输出HTML,而使用模板则只要把数据交给模板引擎程序即可,然后告诉它用哪个模板文件,自然就会把数据和页面结合以后返回或输出,模板至少有以下功能1.把数据提供给模板引擎的功能。2.指定模板的功能。3.输出结果的功能。一般来说为了方便程序员们使用模板引擎,开发者都会把它的功能在一定程度上封装起来,封装成一个类,实例化之后得到一个对象,即模板引擎对象,一个对象有其属性和方法,smarty对象的属性和方法在smarty手册上查找,首先说说其方法,assign 把数据提交给模板的方法。没有单独的指定模板文件的方法已经合并到输出的方法中,输出的方法有两个 display 直接输出  fetch 返回合并好的HTML代码,对于输出我们主要用到的是assign 因为我们显示的数据往往是多样性的,可能是一个量,可能是一个数组量也可能是多维数组,在不同的情况下应该如何正确提交给smarty是一个问题,提交后如何对应显示也是个问题,smarty引擎使用的解释方法是先把HTML文件转化为php文件,然后在赋值各个量,并且执行这个php文件,对应不同的数据格式,它有一套固定的书写方式,需要我们用这种书写方式在模板文件上做对应的标记,smarty默认使用的模板标记符是一对{},比如{$a}这个标记等效于echo $a;在php中我们需要有对应的赋值过程,$smarty->assign("a","值");如果我们有多个量进行赋值,一个个这样写就很麻烦,smarty为我们考虑了这一点,例如我们从数据库里读出一个文章,要显示在页面的内容有标题内容作者时间,数据结构大体是这样的

复制代码 代码如下:


array([id]=>1,['title']=>"标题",…);

我们的模板需要有几个对应的标记,例如

复制代码 代码如下:


{$title}


{$content}

一个个赋值太麻烦,assign方法支持数组直接赋值,$rows = 从数据库读出的据,

$smarty->assign($rows);smarty就会取数据索引自动一一赋值,但是这个时候为了避免引起变量冲突,我们希望还是直接以数组形式赋值呢,例如

复制代码 代码如下:


$rows = 从数据库读出的据,
$smarty->assign("rows",$rows);

如果此时我们在模板的标记是{$rows} 那输出的时候我们只能看到array 正如php里面直接echo数组一样,在php输出具体量是echo $rows['title'];smarty规定的符号是一个点号,{$rows.title},用这种方式类似于

复制代码 代码如下:


echo $rows['title']

每种模板有其对应的书写规则,接下来如果要显示的是一个文章列表呢,假设mysql给我们返回了10条数据,10条数据都要显示出来,而且他们的索引肯定完全相同,根据编程思路知道结果求过程,假设显示如下

复制代码 代码如下:



  • 1111

  • 222

  • 333

  • 4444


如果这是我们希望输出的样子

首先这是多个量当然用的是数组了,

复制代码 代码如下:


$list=array();
While($rows=数据){
$list[]=$rows;
}
$smarty->assign("list",$list);

先把数据放到一个数组中再一次性交给smarty,这样一来list变量里面是一个二维数组,如果是我们得到一个这样的二维数组,要把里面所有值显示出来,最好的方法是循环输出,同样smarty为我们提供了循环用的标记,section和 foreach

section标记格式

复制代码 代码如下:


{section name=这次循环的名字 loop=数据量名}
...
{/section}


{section name=i loop=$list}

  • {$list[i].title}

  • {/section}

    上面的代码看起来很像for循环,但这里的i不是for循环里面的$i 只是这个循环的名字,$list[循环名]这个写法可以每次从数组里得到一个量,正如刚才说的,$list是一个二维数组,$list[i]得到的还是数组。

    还有一个写法就是foreach 其语法如下:

    复制代码 代码如下:


    {foreach key=索引 item=值 from=赋值变量}

    {$key}:{$item}

    {/foreach}

    {foreach  item=v from=$list}

  • {$v.title}
  • {/foreach}

    循环list变量每个量赋值到v里,然后从变量v里面指定要显示的索引,除了循环标记外,它还给我们提供了一些常用的语法标记,例如包含文件,条件判断,我们知道HTML不能包含文件,比如网页头部,但smarty提供了{include}的标记,可以像php一样包含文件,例如{include file="文件路径"} 这个标记格式是固定的,而且这个路径必须在模板引擎指定的路径下,而条件判断的语法和php一样是if条件判断,语法如下

    复制代码 代码如下:


    {if变量==值或量}
    为真时显示的值
    {else}
    为假是显示的值
    {/if}

    也可以不写else只有为真时显示的内容,例如常见的一种情况是网页上有一个登陆口登录前显示的是表单登录后显示的是用户信息,假设一个量已经赋值给模板了比如 $username 用户登录这个量就有用户名没有登录这个量就是空的,我们可以这样写

    复制代码 代码如下:


    {if $username !=""}
    欢迎{$username}
    {else}
    请先登录
    {/if}

    我们只要在php把这个变量准备好,并赋值给smarty即可除了这些标记外还有的标记自行参考手册,

    其次就是变量调节器了,很多时候我们从数据库中得到的数据,都要小小的处理下才输出的,比如日期格式,只显示年月日即可再如输出的内容里的换行要换成
    才能在页面显示对应的样子,这个时候我们可以使用smarty自带的变量调节器,格式如下

    复制代码 代码如下:


    {要输出的变量|调节器名:参数}

    假如内容部分在显示的时候把所有的换行显示为
    只需要如下写法

    复制代码 代码如下:


    {$content|nl2br}

    日期的格式化可以用date_format 例如手册上

    复制代码 代码如下:


    index.php:

    $smarty = new Smarty;
    $smarty->assign('yesterday', strtotime('-1 day'));
    $smarty->display('index.tpl');

    index.tpl:

    {$smarty.now|date_format}
    {$smarty.now|date_format:"%A, %B %e, %Y"}
    {$smarty.now|date_format:"%H:%M:%S"}
    {$yesterday|date_format}
    {$yesterday|date_format:"%A, %B %e, %Y"}
    {$yesterday|date_format:"%H:%M:%S"}

    OUTPUT:

    Feb 6, 2001
    Tuesday, February 6, 2001
    14:33:00
    Feb 5, 2001
    Monday, February 5, 2001
    14:33:00

    实在不行我们可以用php处理好之后再进行赋值。

    下面写上配置

    复制代码 代码如下:


    define("ROOT",str_replace('\\','/',dirname(__FILE__)).'/');//定义根路径
    //加载smarty类
    require ROOT.'lib/smarty.class.php';
    $samrty = new smarty();//实例化一个smarty类
    //配置各种目录
    $smarty ->setTemplateDir(ROOT.'templates/')
            ->setCompileDir(ROOT.'templates_c')
            ->setPluginsDir(ROOT.'plugins/')
            ->setCacheDir(ROOT.'cache/')
            ->setConfigDir(ROOT.'configs/');
    $smarty->caching = false;//是否开启缓存
    $smarty->left_delimiter = '$smarty->right_delimiter = '}>';
    ?>

    本網站聲明
    本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn

    熱AI工具

    Undresser.AI Undress

    Undresser.AI Undress

    人工智慧驅動的應用程序,用於創建逼真的裸體照片

    AI Clothes Remover

    AI Clothes Remover

    用於從照片中去除衣服的線上人工智慧工具。

    Undress AI Tool

    Undress AI Tool

    免費脫衣圖片

    Clothoff.io

    Clothoff.io

    AI脫衣器

    Video Face Swap

    Video Face Swap

    使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

    熱工具

    記事本++7.3.1

    記事本++7.3.1

    好用且免費的程式碼編輯器

    SublimeText3漢化版

    SublimeText3漢化版

    中文版,非常好用

    禪工作室 13.0.1

    禪工作室 13.0.1

    強大的PHP整合開發環境

    Dreamweaver CS6

    Dreamweaver CS6

    視覺化網頁開發工具

    SublimeText3 Mac版

    SublimeText3 Mac版

    神級程式碼編輯軟體(SublimeText3)

    適用於 Ubuntu 和 Debian 的 PHP 8.4 安裝和升級指南 適用於 Ubuntu 和 Debian 的 PHP 8.4 安裝和升級指南 Dec 24, 2024 pm 04:42 PM

    PHP 8.4 帶來了多項新功能、安全性改進和效能改進,同時棄用和刪除了大量功能。 本指南介紹如何在 Ubuntu、Debian 或其衍生版本上安裝 PHP 8.4 或升級到 PHP 8.4

    我後悔之前不知道的 7 個 PHP 函數 我後悔之前不知道的 7 個 PHP 函數 Nov 13, 2024 am 09:42 AM

    如果您是經驗豐富的PHP 開發人員,您可能會感覺您已經在那裡並且已經完成了。操作

    如何設定 Visual Studio Code (VS Code) 進行 PHP 開發 如何設定 Visual Studio Code (VS Code) 進行 PHP 開發 Dec 20, 2024 am 11:31 AM

    Visual Studio Code,也稱為 VS Code,是一個免費的原始碼編輯器 - 或整合開發環境 (IDE) - 可用於所有主要作業系統。 VS Code 擁有大量針對多種程式語言的擴展,可以輕鬆編寫

    在PHP API中說明JSON Web令牌(JWT)及其用例。 在PHP API中說明JSON Web令牌(JWT)及其用例。 Apr 05, 2025 am 12:04 AM

    JWT是一種基於JSON的開放標準,用於在各方之間安全地傳輸信息,主要用於身份驗證和信息交換。 1.JWT由Header、Payload和Signature三部分組成。 2.JWT的工作原理包括生成JWT、驗證JWT和解析Payload三個步驟。 3.在PHP中使用JWT進行身份驗證時,可以生成和驗證JWT,並在高級用法中包含用戶角色和權限信息。 4.常見錯誤包括簽名驗證失敗、令牌過期和Payload過大,調試技巧包括使用調試工具和日誌記錄。 5.性能優化和最佳實踐包括使用合適的簽名算法、合理設置有效期、

    php程序在字符串中計數元音 php程序在字符串中計數元音 Feb 07, 2025 pm 12:12 PM

    字符串是由字符組成的序列,包括字母、數字和符號。本教程將學習如何使用不同的方法在PHP中計算給定字符串中元音的數量。英語中的元音是a、e、i、o、u,它們可以是大寫或小寫。 什麼是元音? 元音是代表特定語音的字母字符。英語中共有五個元音,包括大寫和小寫: a, e, i, o, u 示例 1 輸入:字符串 = "Tutorialspoint" 輸出:6 解釋 字符串 "Tutorialspoint" 中的元音是 u、o、i、a、o、i。總共有 6 個元

    您如何在PHP中解析和處理HTML/XML? 您如何在PHP中解析和處理HTML/XML? Feb 07, 2025 am 11:57 AM

    本教程演示瞭如何使用PHP有效地處理XML文檔。 XML(可擴展的標記語言)是一種用於人類可讀性和機器解析的多功能文本標記語言。它通常用於數據存儲

    解釋PHP中的晚期靜態綁定(靜態::)。 解釋PHP中的晚期靜態綁定(靜態::)。 Apr 03, 2025 am 12:04 AM

    靜態綁定(static::)在PHP中實現晚期靜態綁定(LSB),允許在靜態上下文中引用調用類而非定義類。 1)解析過程在運行時進行,2)在繼承關係中向上查找調用類,3)可能帶來性能開銷。

    什麼是PHP魔術方法(__ -construct,__destruct,__call,__get,__ set等)並提供用例? 什麼是PHP魔術方法(__ -construct,__destruct,__call,__get,__ set等)並提供用例? Apr 03, 2025 am 12:03 AM

    PHP的魔法方法有哪些? PHP的魔法方法包括:1.\_\_construct,用於初始化對象;2.\_\_destruct,用於清理資源;3.\_\_call,處理不存在的方法調用;4.\_\_get,實現動態屬性訪問;5.\_\_set,實現動態屬性設置。這些方法在特定情況下自動調用,提升代碼的靈活性和效率。

    See all articles