文档章节

Smarty自定义block标签

csensix
 csensix
发布于 2017/02/28 14:49
字数 411
阅读 61
收藏 0
点赞 0
评论 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 - the compiling PHP template engine 点这里收藏此教程 本教材网址: http://www.hbcms.com/main/smarty/ Copyright © by ispi of......

晨曦之光
2012/03/09
426
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. unli......

manbudezhu
2016/06/08
178
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
Freemarker 中截取字符串 必须先用if判断其长度?

Freemarker 中截取字符串 必须先用if判断其长度?有没有像自定义标签一样?或者像PHP的smarty的truncate一样的方法?

lifer
2012/11/07
14.4K
4
smarty 快速入门

smarty 快速入门 smarty 定义:一个开源的模板引擎 模板引擎是为了使用户界面与业务数据分离而产生的,它可以生成特定格式的文档,用于网站的模板引擎就会生成一个标准的HTML文档。 功能 将网...

haibo3434358
2017/06/30
0
0
MyfCMS_Beta20130126 版支持主题管理了

-----------------------2013-01-26日--------------------------------------- 1、增加了主题模板管理,可以很方便的导入导出主题模板。 2、修复了分页出错问题。 3、增加了自定义文章路径设...

feiyue
2013/01/26
388
5
Django 模板语言(译)

声明:转载请注明出处http://www.jianshu.com/p/1664dcfd840c 最近在折腾Django,看到官网的Django模板文章写得挺详细的,就想着翻译下以加深自己的学习印象,如果能帮助到大家我也会感到很欣...

蛇发女妖
2017/10/25
0
0
DotLiquid-Asp.net模板引擎

以前用过一段时间的PHP,感觉非常不错,其中最让我难忘的就是Smarty模板引擎,当时就微微地想Asp.net里有没有像这样的模板引擎呢?不过由于之后的工作内容都用不到,或者说没有想到用模板,这...

李朝强
2015/12/11
58
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

知识点总结

jq如何拿到data-info的自定义属性 1.1 原生可以获取到所有属性el.attrbutes 1.2 jq的$(el).attr('属性名称') 继承的几种方式,原型链 2.1 扩展原型对象实现继承 2.2 替换原型对象实现继承 2....

litCabbage
1分钟前
0
0
python语言规范

http://zh-google-styleguide.readthedocs.io/en/latest/google-python-styleguide/python_style_rules/...

ghou-靠墙哭
5分钟前
0
0
istio 监控,遥测 (理论)

Istio提供了一种灵活的模型来强制执行授权策略并收集网格中服务的遥测。 基础架构后端旨在提供用于构建服务的支持功能。它们包括诸如访问控制系统,遥测捕获系统,配额执行系统,计费系统等之...

xiaomin0322
7分钟前
0
0
阿里资深专家面试问题收集

corejava hashcode相等的两个对象一定相等吗?equals呢?反过来相等吗? 介绍一下集合框架? hashtable,hashmap底层实现是什么?hashtable和concurrenthashmap底层实现的区别? hashmap和treemap的...

undefine
8分钟前
4
0
alpine安装软件指定安装源

linux-alpine安装软件指定安装源 一、永久修改apk下载源地址 vi etc/apk/repositories 替换成阿里源 http://mirrors.aliyun.com/alpine/v3.8/main/http://mirrors.aliyun.com/alpine/v3...

我心中有猛狗
9分钟前
0
0
Centos7通过yum安装nginx

添加源地址(直接install可能不是最新版本的) sudo rpm -Uvh http://nginx.org/packages/centos/7/noarch/RPMS/nginx-release-centos-7-0.el7.ngx.noarch.rpm 安装 sudo yum install -y ng......

iplusx
11分钟前
0
0
ef .core Dapper Helper

using System; using System.Collections.Generic; using System.Configuration; using System.Data; using System.Data.SqlClient; using System.Threading.Tasks; using Dapper; using Dap......

Lytf
12分钟前
0
0
iOS 小笔记

1.以下代码打印什么     __block int val = 10;    void (^blk)(void) = ^{        printf("val=%d\n",val);        };       val = 2;    blk(); /...

风了个1
14分钟前
0
0
【Spring Boot 系列 Spring Boot示例程序】

入门程序步骤,创建一个Maven项目。继承Spring Boot官方提供的父工程。再引入一个Web的应用启动器。 1、选择一个合适的IDEA工具 创建一个Maven工程,并添加如下配置 <parent> <...

HansonReal
16分钟前
0
0
217. Contains Duplicate - LeetCode

Question 217. Contains Duplicate Solution 题目大意:判断数组中是否有重复元素 思路:构造一个set,不重复就加进去,重复返回true,如果数据量大的话,可以用布隆过滤器 Java实现: publ...

yysue
20分钟前
0
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部