想要獲得$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變量以便操作