我试图超越Smarty的基本用法,并使用默认的“大写”修饰符遇到一个小问题。我的假设是不需要显式调用来使用此运算符,所以在我的模板中我有以下内容:
{* Smarty Part: Add-ins *}
<div class="control-group form-inline">
<label class="control-label">Add-ins:</label>
<div class="controls ">
{foreach $add_ins as $add_in}
<label class="checkbox inline"><input type="checkbox" cf-change="toggle-field::#{$add_in}-add-in"> {$add_in|capitalize}</label>
{/foreach}
</div>
</div>
如果我要更换:
{$add_in|capitalize}
带
{$add_in}
它可以正常工作但添加修饰符会给我以下错误:
PHP致命错误:未捕获异常'SmartyCompilerException',消息'第7行模板中的语法错误[FILE_PATH]“&amp; lt; label class =&amp; quot; checkbox inline&amp; quot;&amp; gt;&amp; lt;输入类型=&amp; quot;复选框&amp; quot; cf-change =&amp; quot; toggle-field ::#{$ add_in} -add-in&amp; quot;&amp; gt; {$ add_in | capitalize}&amp; lt; /标签&安培; gt;”中未知修饰语“大写”'
非常感谢任何帮助。
答案 0 :(得分:1)
在你的Smarty目录中应该有一个包含所有默认插件的插件目录,包括常用的修饰符。
如果您无法解决该问题,请记住您可以将任何PHP函数用作修饰符。因此,在这种情况下,您可以使用ucfirst()
:
{$add_in|ucfirst}
然而,这取决于$security
的状态。有关详细信息,请参阅the docs。
答案 1 :(得分:0)
问题来自为自己的插件注册目录而不保留对默认目录的引用。因此,例如,我使用了类似这样的初始化smarty:
public static function init () {
$object = new Smarty();
$object->setTemplateDir ( LG_FE_DIR . '/templates/uncompiled' );
$object->setCompileDir ( LG_FE_DIR . '/templates/compiled' );
$object->setCacheDir ( LG_FE_DIR . '/templates/cache' );
$object->setConfigDir ( LG_FE_DIR . '/templates/configs' );
return $object;
}
此时我可以毫无问题地使用Smarty的默认修饰符。然后我决定我想要自己的插件目录,并将以下行添加到我的init()方法中:
$object->setPluginsDir ( LG_FE_DIR . '/templates/plugins_dir');
在我现在可以调用我自己的插件的意义上工作得很好,但它也打破了默认的插件(和修饰符)。为什么?我想只要您明确了解插件目录,默认目录就会超出范围,因此您需要同时指定这两个目录。幸运的是,这很容易......你只需将要包含的不同目录粘贴到数组中即可。对我来说,它看起来像这样:
$object->setPluginsDir ( array(LG_FE_DIR . '/templates/plugins_dir', LG_FE_DIR . '/externals/Smarty/libs/plugins') );
答案 2 :(得分:0)
使用ken上面的代码时,您还可以/更好地使用
$object->addPluginsDir(LG_FE_DIR . '/templates/plugins_dir');
然后你不必关心默认的东西。