2013-04-15 18 views
0

我有我的CMS創建自定義函數智者:Smarty的函數返回一個智者標籤至極沒有解釋

{$page->title|inter} 

所以,這個標籤時,它的解釋,叫我的自定義函數smarty_modifier_inter,檢索HTML代碼,做一些動作然後返回它。

在這個html中,我可以有其他聰明的標籤。但是,我只是看到,如果功能smarty返回smarty代碼,這個smarty代碼不會被解釋...

因此,我在我的頁面上有一個標籤,如{$page->title|inter}未解釋。

你有什麼想法嗎?謝謝 !

+0

你能澄清一下這個問題嗎?或者添加一個簡單的例子來說明它顯示什麼和應該顯示什麼? – Borgtex

回答

1

我想你的意思是smarty_modifier_inter()返回smarty代碼,你希望這個smarty代碼自己被解析? Smarty只會爲每個修飾符解析模板一次,所以它不會解析返回的smarty標籤(實際上我假設它會在原始模板體中運行所有函數,所以它不會解析任何返回的smarty標籤)。

實現你要找的東西的一種方法是在你的修改器中實現遞歸。說,例如,你的修改如下:

function smarty_modifier_inter($string) 
{ 
    $html = some_function($string); //This may contain a smarty tag, such as {$page->title|inter} 
    return $html; 
} 

你可以改變它的東西,如:

function smarty_modifier_inter($string) 
{ 
    $html = some_function($string); //This may contain a smarty tag, such as {$page->title|inter} 
    if (preg_match("/".preg_quote("{$")."/", $html)) {  //A very quick and dirty way to see if there are any smarty variables within your template 
     $html = smarty_modifier_inter($html); //This may contain a smarty tag, such as {$page->title|inter} 
    } 

    return $html; 
} 

這將反覆運行smarty_modifier_inter到您的字符串,直到它不再含有Smarty的變量。顯然,這是非常容易無休止的循環,所以謹慎使用!

如果你確信那裏將是遞歸的一個級別,那麼你可以簡單地在你的數據上運行最多一次你的函數

0

Smarty的功能是從輸入要去的手段(一Smarty模板)到輸出(通常是HTML);它們不是生成進一步呈現的Smarty代碼的方式。

您可以做你想做一個pre-filter,這它由Smarty的自身處理之前運行在Smarty模板源什麼,但是這並不像編寫自定義函數一樣簡單。

更有希望的是,Smarty3包含一個string: resource,它允許您呈現字符串,就像它是模板的內容一樣。

在您的自定義功能

所以,你可以有這樣的事情:

function smarty_function_get_more_smarty($params, $smarty_instance) 
{ 
    $code = get_code_from_somewhere($params['foo'], $params['bar']); 
    // $code might be something like '<h1>My Awesome Site - {$title}</h1>' 
    return $smarty_instance->fetch('string:' . $code); 
} 

請注意,我沒有測試此代碼或使用過這一功能,因此,請閱讀手冊逃避的選擇,和區別string:eval:

此外,雖然這並不是明確遞歸的,但如果$code以另一個調用相同的自定義函數結束,您將最終回到相同的函數中,因此請確保您抵禦無限遞歸不知何故!

相關問題