使用默认修饰符

时间:2012-10-22 12:19:32

标签: smarty smarty3

我试图超越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;”中未知修饰语“大写”'

非常感谢任何帮助。

3 个答案:

答案 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');

然后你不必关心默认的东西。