0

我试图超越 Smarty 的基本用法,并在使用默认的“capitalize”修饰符时遇到了一个小问题。我的操作假设不需要进行显式调用来使用此运算符,因此在我的模板中我有以下内容:

{* 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] 中的消息“语法错误”“<label class=”checkbox inline”><input type=”checkbox”cf-change=” toggle-field::#{$add_in}-add-in"> {$add_in|capitalize}</label>" 未知修饰符“大写”'

任何帮助将不胜感激。

4

3 回答 3

1

在您的 Smarty 目录中应该有一个 plugins 目录,其中包含所有默认插件,包括常用的修饰符。

如果您无法解决该问题,请记住您可以使用任何 PHP 函数作为修饰符。所以在这种情况下,您可以使用ucfirst()

{$add_in|ucfirst}

然而,这受制于 的状态$security。有关详细信息,请参阅文档

于 2012-10-30T23:02:07.543 回答
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') );
于 2012-11-06T16:28:45.093 回答
0

当使用来自 ken 的上述代码时,您还可以/更好地使用

$object->addPluginsDir(LG_FE_DIR . '/templates/plugins_dir');

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

于 2014-01-09T10:38:25.210 回答