首页 > 代码库 > 我的PHP之旅--认识Smarty

我的PHP之旅--认识Smarty

什么是Smarty

smarty是模板引擎,它的作用是便于团队开发,PHP程序员负责PHP程序编写 提供数据,前端程序员负责编写静态页面,Smarty在中间负责一种类似于桥梁的作用。

其实模板引擎很多,但为什么要学习Smarty呢?

  • Smarty相对于其他的模板引擎 有速度上的优势。
  • 在重复使用模板引擎时直接访问编译文件 不需要再重新编译模板。
  • Smarty拥有缓存技术,可以将我们看到的HTML文件缓存成一个静态的HTML页面。
  • Smarty可以自定义一些插件。
  • Smarty的表现逻辑比较强。

 

使用Smarty

www.smarty.net/download下载后将libs文件夹导入到项目目录。

在项目中创建两个文件夹:1、templates(模板目录),2、templates_c(编译目录)

创建index.php(php人员的工作) 代码如下:

<?php
/**
 * Created by PhpStorm.
 * User: Alex
 * Date: 2017/1/10
 * Time: 12:46
 */

include "libs/Smarty.class.php";
// 实例化smarty对象
$smarty = new Smarty();
// 设置相关属性
$smarty->setTemplateDir(‘templates‘);   // 模板目录
$smarty->setCompileDir(‘templates_c‘);  // 编译目录
// 分配数据
$smarty->assign(‘title‘, ‘smarty模板引擎‘);
$smarty->assign(‘content‘, ‘smarty是一个很好的模板引擎‘);
// 载入视图
$smarty->display(‘index.html‘);

创建index.html(前端人员工作)   代码如下:

<!DOCTYPE html>
<html>
<head>
    <title></title>
</head>
<body>
<h1>{$title}</h1>
<p>{$content}</p>
</body>
</html>

上面只是简单的例子,下面我们来正式学习下smarty

 

定界符  

上面在index.html中使用的“{}”就是定界符,用户解析数据来显示。

注意点:

  • 任何在定界符之外的代码都是静态的,是不会被解析的,包括PHP代码。
  • so 如果.html中存在CSS代码和JS代码需要做处理,不然会有冲突
    • 1、更换定界符:
      // 重新定义定界符
      $smarty->left_delimiter = ‘<{‘;
      $smarty->right_delimiter = ‘}>‘;

       

    • 2、内嵌的js和css使用内置函数:{literal}这中间包含你不想让smarty解析的代码{/literal},尽量使用外部引用的js和css。(推荐)
      <!DOCTYPE html>
      <html>
      <head>
          <title></title>
          <style>
              {literal}
              h1{
                  color: red;
              }
              p{
                  font-size: 20px;
              }
              {/literal}
          </style>
      </head>
      <body>
      <h1>{$title}</h1>
      <p>{$content}{*这是注释*}</p>
      </body>
      </html>

       

 

注释

注释写法:左定界符+注释内容+右定界符,默认为 {*注释内容*}

 

变量

在smarty中变量有3种:

  • 通过PHP程序中的 assign函数分配过来。
  • 保留变量
  • 配置变量

 

assign变量

我们最常用的。其中分类有三种:

  • 标量变量:整形(int)、浮点型(float、double)、字符串(string)、布尔型(bool)。
  • 符合变量:数组(array)、对象(object)。
  • 特殊类型:资源、null。
  • 不适合做分配的:对象,资源,null。
<?php
/**
 * Created by PhpStorm.
 * User: Alex
 * Date: 2017/1/10
 * Time: 12:46
 */

include ‘libs/Smarty.class.php‘;

// 初始化smarty对象
$smarty = new Smarty();
// 配置
$smarty->setTemplateDir(‘templates‘);
$smarty->setCompileDir(‘templates_c‘);
// 分配变量
$smarty->assign(‘score‘,100);
$smarty->assign(‘is_show‘,false);

$user = array(‘alex‘,‘alice‘,‘sky‘);
$smarty->assign(‘user‘,$user);
$book = array(‘id‘=>1,‘name‘=>‘learn Smarty‘,‘author‘=>‘xxx‘);
$smarty->assign(‘book‘,$book);
// 载入
$smarty->display(‘index.html‘);
<!DOCTYPE html>
<html>
<head>
    <title></title>
</head>
<body>
<h1>标量变量</h1>
<p>{$score}</p>
<p>{$is_show}</p>

<h1>索引数组</h1>
<ul>
    <li>{$user[0]}</li>
    <li>{$user.1}</li>
    <li>{$user[2]}</li>
</ul>

<h1>关联数组</h1>
<ul>
    <li>{$book[‘id‘]}</li>
    <li>{$book[‘name‘]}</li>
    <li>{$book.author}</li>
</ul>
</body>
</html>

 

保留变量

无需用assign分配,直接可以在模板页面中引用的变量。其中包括PHP的超全局变量($_GET , $_SERVER)还有一些Smarty自带的一些变量。

使用格式:{$smarty.变量名}

<?php
/**
 * Created by PhpStorm.
 * User: Alex
 * Date: 2017/1/10
 * Time: 12:46
 */

include ‘libs/Smarty.class.php‘;

// 初始化smarty对象
$smarty = new Smarty();
// 配置
$smarty->setTemplateDir(‘templates‘);
$smarty->setCompileDir(‘templates_c‘);
// 定义常量(无需调用assign)
define(‘ROOT‘,getcwd());
// 载入
$smarty->display(‘index.html‘);
<!DOCTYPE html>
<html>
<head>
    <title></title>
</head>
<body>
<h1>保留变量</h1>
<p>{$smarty.server.SERVER_NAME}</p>
<p>{$smarty.now}</p>
<p>{$smarty.version}</p>
{* 这是PHP中定义的常量 引用格式为:$smarty.const.常量名 *}
<p>{$smarty.const.ROOT}</p>
</body>
</html>

 

配置变量

无需assign分配,多为前端开发人员使用,首先在项目中创建一个configs文件夹,在configs文件夹下创建配置文件test.conf

格式:{#配置变量#}或{$smarty.config.配置变量}

配置文件(test.conf):

number = ‘a2589‘
lang = ‘en‘

[style1]
color = #ff00ff

[style2]
color = red

用法:

<!DOCTYPE html>
<html>
<head>
    <title></title>
</head>
<body>
<h1>配置变量</h1>
<p>首先需要引入配置文件后使用</p>
{config_load file = ‘test.conf‘ section=‘style1‘}
<p>{$smarty.config.number}</p>
<p>{#number#}</p>
<p>{#color#}</p>
</body>
</html>

配置文件可以分段载入,只需要设置section参数即可。

 

内置函数

可分为三大类:

  • 内置函数。
  • 变量修饰器。
  • 函数插件(自定义函数)

1、if/else

和php完全一样,实现选择分支,可用数学运算。

<?php
/**
 * Created by PhpStorm.
 * User: Alex
 * Date: 2017/1/10
 * Time: 12:46
 */

include ‘libs/Smarty.class.php‘;

// 初始化smarty对象
$smarty = new Smarty();
// 配置
$smarty->setTemplateDir(‘templates‘);
$smarty->setCompileDir(‘templates_c‘);
// 分配变量
$smarty->assign(‘iq‘,60);
// 载入
$smarty->display(‘if.tpl‘);
<html>
<head>

</head>

<body>
<h1>if/else使用</h1>
<p>已读取您的IQ:{$iq}</p>
<p>您的潜力分析:
    {if $iq >= 130}
        您的潜力很高,天生的天才。
    {elseif $iq >= 110 && $iq < 130}
        您的天资较高,如果付出相应的努力肯定会成为一个人才。
    {elseif $iq >= 90 && $iq < 110}
        您的天资一般,但是如果能够比别人付出更多些,肯定会得到相应的回报。
    {else}
        。。。早点休息吧
    {/if}
</p>
</body>
</html>

 2、foreach

和PHP一样 foreach是循环遍历用的,格式:{foreach $array as $item} 或 {foreach $array as $key => $item}

例子:

<?php
/**
 * Created by PhpStorm.
 * User: Alex
 * Date: 2017/1/10
 * Time: 12:46
 */

include ‘libs/Smarty.class.php‘;

// 初始化smarty对象
$smarty = new Smarty();
// 配置
$smarty->setTemplateDir(‘templates‘);
$smarty->setCompileDir(‘templates_c‘);
// 分配变量
$user = array(‘alex‘,‘alice‘,‘alisa‘);
$child = array(‘id‘ => 5, ‘name‘ => ‘Ben‘, ‘age‘ => 4);
$class = array(
    array(‘id‘ => 0, ‘name‘ => ‘Crystal‘, ‘age‘ => 6),
    array(‘id‘ => 1, ‘name‘ => ‘Candy‘, ‘age‘ => 5),
    array(‘id‘ => 2, ‘name‘ => ‘Gina‘, ‘age‘ => 7),
    array(‘id‘ => 3, ‘name‘ => ‘Zoe‘, ‘age‘ => 6)
);
$smarty->assign(‘user‘, $user);
$smarty->assign(‘child‘, $child);
$smarty->assign(‘class‘, $class);
// 载入
$smarty->display(‘if.tpl‘);
<!DOCTYPE html>
<html>
<head>
    <title></title>
</head>
<body>
<h1>枚举数组</h1>
<ul>
    {foreach $user as $name}
        <li>{$name}</li>
    {/foreach}
</ul>

<h1>关联数组</h1>
<ul>
    {foreach $child as $key => $item}
        <li>{$key} ------ {$item}</li>
    {/foreach}
</ul>

<h1>二维数组</h1>
<table width="500" border="1">
    <tr>
        <td>id</td>
        <td>name</td>
        <td>age</td>
    </tr>
    {foreach $class as $childs}
    <tr>
        {foreach $childs as $item}
        <td>{$item}</td>
        {/foreach}
    </tr>
    {/foreach}
</table>

<h1>二维数组(第二种写法)</h1>
<table width="500" border="1">
    <tr>
        <td>id</td>
        <td>name</td>
        <td>age</td>
    </tr>
    {foreach $class as $childs}
    <tr>
        <td>{$childs.id}</td>
        <td>{$childs.name}</td>
        <td>{$childs.age}</td>
    </tr>
    {/foreach}
</table>
</body>
</html>

foreach还有一些属性 非常有用:

  • @index:当前数组的索引,从0开始。
  • @iteration:当前循环的次数,从1开始。
  • @first:首次循环时,这个值为true。
  • @last:循环到最后一次时,这个值是false。
  • @total:循环的总次数。
  • @show:在循环完之后,检测数据是否显示。
<table width="500" border="1">
    <tr>
        <td>id</td>
        <td>name</td>
        <td>age</td>
    </tr>
    {foreach $class as $childs}
    <tr class = "{if $childs@first}first{elseif $childs@last}last{/if}">
        <td>{$childs.id}</td>
        <td>{$childs.name}</td>
        <td>{$childs.age}</td>
    </tr>
    {/foreach}
</table>

foreach拓展:可以使用{foreachelse}分支,当数组没有内容时会分配到此分支。

 

3、section

section也是用于循环的,只不过它只适用于枚举数组,关联数组不能使用,介绍下section的参数:

  • name:字符串类型 必须设置 section的名称。
  • loop:必须设置 用于循环的值,也就是要循环的次数,通常是一个整形,也可以是一个数组,如果是数组的话就会自动调用count函数对数组进行统计,循环数组count的值得次数。
  • start:整形 不是必须设置 设置开始循环的下标,如果是负数,那么就从总循环次数开始计算,比如:总循环7次 设置start为-2 那么这次循环就会从下标为5的位置开始。
  • step:整形 不是必须设置 设置每次循环的步长,如:step=2 那么循环下标为:0,2,4,6,8.....
  • max:整形 不是必须设置 设置循环的最大次数,
  • show:布尔型 不是必须设置 是否显示循环内容。

 例子:

<?php
/**
 * Created by PhpStorm.
 * User: Alex
 * Date: 2017/1/10
 * Time: 12:46
 */

include ‘libs/Smarty.class.php‘;

// 初始化smarty对象
$smarty = new Smarty();
// 配置
$smarty->setTemplateDir(‘templates‘);
$smarty->setCompileDir(‘templates_c‘);
// 分配变量
$user = array(‘alex‘,‘alice‘,‘alisa‘,‘ben‘);
$smarty->assign(‘user‘,$user);
// 载入
$smarty->display(‘index.html‘);
<!DOCTYPE html>
<html>
<head>
    <title></title>
</head>
<body>
<h1>section</h1>
<ul>
    {section name = ‘index‘ loop = $user}
    <li>{$user[index]}</li>
    {/section}
</ul>
</body>
</html>

section也可以使用:total、first、last、iteration、index等属性

 

我的PHP之旅--认识Smarty