PHP中获得$Smarty.capture.name截获的输出

想要获得$smarty->display后的输出,并作为字符串赋给php变量有两种方法:

  1、ob_start

  ob_start();

  $smarty->display("StockNews/getLeft.tpl");

  $string = ob_get_contents();

  ob_end_clean();

  2、$smarty->_smarty_vars['capture']['captureName'];

  $smarty->display("StockNews/getLeft.tpl");

  $string = $smarty->_smarty_vars['capture']['captureName'];

  //captureName为{capture name=banner}中的name;

  //方法需在tpl中使用capture捕获输出

  //和第一种原理是一样的,查看编译的php的到:

  //php $this->_smarty_vars['capture']['captureName'] = ob_get_contents(); ob_end_clean(); ?>

  //不难看出smarty的capture正是使用了php的ob_start方法

  总结:这个技巧在部分静态化页面中很有用处。也就是说,当使用了smarty,而且某页面需一部分静态,一部分动态输出时,可以利用上述方法。

  我在smarty中静态页面时,采用这种方法:

  --static.html

  --index.php

  --includeStatic.tpl

  --index.tpl

  --needStatic.tpl

  index.php //主页,此页中分需静态部分及动态输出部分

<?PHP
if(file_exists('static.html')){
//存在静态页输出静态页
//使用capture截获包含静态页后的输出
$smarty->assign('filename','static.html');
$smarty->display('includeStatic.tpl');
//动态输出部分
$num = rand(1,9);
$smarty->assign('num',$num );
//再次display,输出index
$smarty->display('index.tpl');
}else{
//不存在静态页往下继续运行,并生成静态页
//这里使用上述方法,动态获得需静态部分的输出,这里使用的方法一,同样也可以使用方法二
ob_start();
//假如要静态数组$array在display后的输出
$smarty->assign('array',$array);
$smarty->display("needStatic.tpl");
//将动态输出内容存至$string变量
$string = ob_get_contents();
ob_end_clean();
//生成静态页
$handle = fopen('static.html','wb');
fwrite($handle,$string);
fclose($handle);
//动态输出部分
$num = rand(1,9);
$smarty->assign('num',$num );
//输出index
$smarty->display('index.tpl');
}
?>
static.html //此页是主页中静态部分产生的静态页

  我是静态页!

  includeStatic.tpl //假如存在静态页,则通过display此页截获一个输出(用在index中的)

  {capture name=staticed}

  {include file=$filename}

  {/capture}

  needStatic.tpl //没有已静态好的页面时,动态生成静态页,此处为主页静态部分的tpl

  {capture name=staticed}

  {section name=a loop=$array}

  {$array[a]}

  {/section}

  {/capture}

  index.tpl //首页输出,包括静态及动态部分。注:无论静态html是否存在,都会通过capture截获输出,用在此页。

  我是首页

  这里是静态部分:

  {$smarty.capture.staticed}

  这里是动态部分:

  {$num}

  当不愿在php中使用界定符或直接输出html标记时(这样显得代码很乱=.=!),可以通过上述两种方法将display后的html赋给一个php变量以便操作

时间: 2024-09-15 13:12:42

PHP中获得$Smarty.capture.name截获的输出的相关文章

Codeigniter中集成smarty和adodb的方法_php实例

本文实例讲述了Codeigniter中集成smarty和adodb的方法.分享给大家供大家参考,具体如下: 在CodeIgniter中要写自己的库,就需要写两个文件,一个是在application/init下面的init_myclass.php文件(如果没有init目录,自己创建).另外一个就是在application/libraries目录下创建myclass.php文件. 这里myclass是你的类名.一些规则大家看手册就好了,我这里直接就说步骤了. 1)在application/libra

c语言中 如何让7/3的结果输出2.3

问题描述 c语言中 如何让7/3的结果输出2.3 c语言中 如何让7/3的结果输出2.3.初学者求教 在线等 解决方案 #include <stdio.h> int main() { printf("%.1f",7/(float)3); } 解决方案二: printf("%.1f", 1.0 * 7 / 3); 解决方案三: printf("%f",((float)7/3)); 解决方案四: printf("%.2f&quo

c++-为什么这段代码中对象rectangle的各个成员函数输出的值是对的,而box的却都是错的

问题描述 为什么这段代码中对象rectangle的各个成员函数输出的值是对的,而box的却都是错的 #include using namespace std; class rectangle { protected: double length,width,l,w; public: void setlength(); void getlength(); void setwidth(); void getwidth(); double area(); double perimeter(); dou

c语言-C语言中如何让几百个字符串输出的时候排列整齐,像表格一样?

问题描述 C语言中如何让几百个字符串输出的时候排列整齐,像表格一样? 解决方案 你说的是右边对齐?还是说每个字符上下对齐? 解决方案二: 得到这些文本中最长的一行的字符数,然后每一行根据计算平均把差的字符分摊到空格中

求教大神,刚接触smarty,出现内容重复输出情况

问题描述 求教大神,刚接触smarty,出现内容重复输出情况 本人在使用smarty时,出现内容重复输出情况!代码截图.结果截图.编译文件截图.缓存文件截图如下,还请大神赐教!!!

mysql-新手求教 java中使用MYsql后查询结果怎么输出到别的地方

问题描述 新手求教 java中使用MYsql后查询结果怎么输出到别的地方 按钮点击事件做完了能连接到数据库可惜输入条件后点击查询只在Eclipse中显示数据库连接成功 而查询并没有显示查询结果 求解 解决方案 在后台找执行的sql,在 数据库中查询,看有没有数据 解决方案二: 参考 http://zhidao.baidu.com/question/559756306057754404.html 解决方案三: 数据库查询结果,可以直接用System.out.print打印到控制台界面: 也可以创建

java 中char 类型可以以%d的输出?为什么?获取字符的方式只有用字符串吗

问题描述 java 中char 类型可以以%d的输出?为什么?获取字符的方式只有用字符串吗 java 中char 类型可以以%d的输出?为什么?获取字符的方式只有用字符串吗 解决方案 在ascii码表中,字符和数字是一一对应的,可以相互转换使用 解决方案二: 不光是java,c也可以,每一个字符都对应一个ascii码,你把char强转成int也可以输出,"获取字符的方式只有用字符串吗"没懂你啥意思. 解决方案三:

link中是不是单链表不能逆序输出?只有双向链表才可以,这么说正确么?

问题描述 link中是不是单链表不能逆序输出?只有双向链表才可以,这么说正确么? link中是不是单链表不能逆序输出?只有双向链表才可以,这么说正确么? 解决方案 也可以啊,再定义一个堆栈,遍历链表,将值放进去,然后再输出堆栈.

char to-vs2008中怎么把一字符串通过对话框输出,我的字符串是Ascll码的

问题描述 vs2008中怎么把一字符串通过对话框输出,我的字符串是Ascll码的 我尝试用messagebox函数,MessageBox(ch);但会有错误: error C2664: "CWnd::MessageBoxW": 不能将参数 1 从"char [100]"转换为"LPCTSTR" 解决方案 ch 的定义从错误上来看应该是 char 型的数组,所以有两个方法:1) 如果你的工程可能是 Unicode 的,所以默认调用了 Unicode