文档章节

Smarty自定义block标签

csensix
 csensix
发布于 2017/02/28 14:49
字数 411
阅读 73
收藏 0

工作原因,需要用到smarty模板引擎。使用中发现有一个不太方便的地方,就是模板里的所有动态数据都要通过相应的php文件传递过来,每次调整都需要修改多个地方。而且,对于变化较多的前端数据要求,后端人员不太容易把所有数据形式都提前准备好,只能不断修改,这样就造成很高的后期维护成本。

后来就想看看smarty能不能实现一些自定义标签,通过传递不同参数,直接调取相关数据。这样一来,只要后端人员编写好调用方法,前端只需要使用相应标签即可,无需改动程序。具体实现方法如下:

1 在plugins目录下新建文件,比如 block.vendor.php

2 函数实现

// $smarty 变量的地址引用很关键,否则标签读取不到相关数据,$smarty是你实例化Smarty类时定义的变量名,可能会与此不一致
function smarty_block_vendor($params, $content, &$smarty, &$repeat)
{
    global $db;
    extract($params);
    if (! isset ( $as ))
        $as = 'v'; // 返回的变量数组名,
    
    $dataindex = md5 ( __FUNCTION__ . md5 ( serialize ( $params ) ) );
    $dataindex = substr ( $dataindex, 0, 16 );

    $results = array();
    
    // $GLOBALS['__SMARTY_PROD'][$dataindex] 全局变量用于存储数据,可多次执行,循环输出
    if (!$GLOBALS['__SMARTY_PROD'][$dataindex]) {
        $results = $db->get_results("SELECT * FROM vendor", ARRAY_A);
        
        $GLOBALS['__SMARTY_PROD'][$dataindex] = $results;
    }
    if (!is_array($GLOBALS['__SMARTY_PROD'][$dataindex])) {
        $repeat = false;
        return '';
    }
    
    if (list($key, $item) = each($GLOBALS['__SMARTY_PROD'][$dataindex])) {
        $smarty->assign($as, $item);
        $repeat = true;
    } else {
        $repeat = false;
    }
       
    echo $content;
}

至于为何这样写,可参考 smarty 手册的 块函数

###3 标签调用

{vendor as="vendor"}
供应商名称:{$vendor.name}
供应商地址:{$vendor.address}
{/vendor}

© 著作权归作者所有

共有 人打赏支持
csensix
粉丝 2
博文 26
码字总数 9357
作品 0
南昌
高级程序员
私信 提问
Smarty中文手册,Smarty教程,Smarty模板的入门教材

Smarty中文手册,Smarty教程,Smarty模板的入门教材 首先,这份Smarty中文手册的翻译工作是由喜悦国际村村民自发组织的,不代表任何人的意见和观点。对他们的无私奉献精神,我们表示感谢,他们...

晨曦之光
2012/03/09
528
0
Smarty前端模板引擎 - 我看过的PHP开源框架

Smarty Smarty可以说是我接触PHP这门语言用到的第一个开源框架,当时在Smarty的帮助下,很好地完成了项目的开发,也很好地遵循了MVC的模式。但是到了后来,慢慢地发现,很多人都很熟悉Smart...

暗夜在火星
2014/12/25
0
0
关于smarty的自定义函数使用

{strip}.....{/strip}去除包含内容部分的空白和回车 模板文件:注释 换行 回车,这样编译模板文件看起来可读性好 编译文件:模板文件的换行,和回车在文件中也会体现出来,可以使用此标签将其...

PHer
2014/06/18
0
0
自定义框架 使用smarty的一个问题

自己写一个小框架, 每次在Indexcontroller.php中使用$this->display()是,都会报错 unlink(Storage/Compile/Home/Index\%%33^33F^33FC67E8%%Login.html.php): No such file or directory. unl......

manbudezhu
2016/06/08
230
1
Smarty 3.1.7 发布

Smarty 3.1.7 改进记录: ===== Smarty-3.1.7 ===== 18.12.2011 - bugfix strings ending with " in multiline strings of config files failed to compile (isse #67) - added chaining to......

kevinG
2011/12/22
5.2K
0

没有更多内容

加载失败,请刷新页面

加载更多

CSS 选择器参考手册

CSS 选择器参考手册 选择器 描述 [attribute] 用于选取带有指定属性的元素。 [attribute=value] 用于选取带有指定属性和值的元素。 [attribute~=value] 用于选取属性值中包含指定词汇的元素。...

Jack088
今天
1
0
数据库篇一

数据库篇 第1章 数据库介绍 1.1 数据库概述  什么是数据库(DB:DataBase) 数据库就是存储数据的仓库,其本质是一个文件系统,数据按照特定的格式将数据存储起来,用户可以对数据库中的数据...

stars永恒
今天
2
0
Intellij IDEA中设置了jsp页面,但是在访问页面时却提示404

在Intellij IDEA中设置了spring boot的jsp页面,但是在访问时,却出现404,Not Found,经过查找资料后解决,步骤如下: 在Run/Debug Configurations面板中设置该程序的Working Directory选项...

uknow8692
昨天
3
0
day24:文档第五行增内容|每月1号压缩/etc/目录|过滤文本重复次数多的10个单词|人员分组|

1、在文本文档1.txt里第五行下面增加如下内容;两个方法; # This is a test file.# Test insert line into this file. 分析:给文档后增加内容,可以用sed 来搞定;也可以用while do done...

芬野de博客
昨天
3
0
深入理解JVM—JVM内存模型

深入理解JVM—JVM内存模型 我们知道,计算机CPU和内存的交互是最频繁的,内存是我们的高速缓存区,用户磁盘和CPU的交互,而CPU运转速度越来越快,磁盘远远跟不上CPU的读写速度,才设计了内存...

onedotdot
昨天
3
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部