在smarty模板中使用class

时间:2015-08-04 08:15:47

标签: php smarty

我正在从干净的php视图迁移到smarty,我在将以下模板转换为smarty时遇到了问题:

<?php
   use \framework\core;
?>

<h1><?= Core::translate('some string to translate'); ?></h1>

所以我想使用一些通过自动加载器加载的类,然后使用它的translate方法。我怎么能聪明地做到这一点?

2 个答案:

答案 0 :(得分:1)

这就是我在一个使用Smarty API扩展的旧项目中执行相同任务的方式:

// register additional smarty modifiers for I18N 
$this->smarty->register_block("translate", array($this, "smarty_i18n_translate"));
// better alias
$this->smarty->register_block("_", array($this, "smarty_i18n_translate"));


// translation function
public function smarty_i18n_translate($params, $content, &$smarty, &$repeat)
{
    if (isset($content))
    {
        if (isset($params['resourceID']))
        {
            $resourceID = $params['resourceID'];
            unset($params['resourceID']);
        }
        else
            $resourceID = NULL;

        // setting context vars if specified
        foreach ($params as $key => $val)
        {
            $this->setContextVar($key, $val);
        }

        // Core::translate($content); ?
        return $this->translate($content, $resourceID);
    }

    return '';
}

这允许在视图中写入(我使用{?作为智能标记分隔符):

<span class="label">{?_?}Operation type{?/_?}:</span>

一个注意事项:这是针对一些非常古老的Smarty版本,他们可能已经更改了API的细节,但似乎register方法仍然存在。

在文档中,有同样的问题,例如:http://www.smarty.net/docsv2/en/api.register.block.tpl

答案 1 :(得分:0)

尝试这种逻辑/方式,希望你可能会有所了解......

<?php
   $my_obj = new MyClass();

   $smarty->left_delimeter('{{');
   $smarty->right_delimeter('}}');

   $smarty->assign('my_obj', $my_obj);
   $smarty->display('your.html');
?>

然后在你的HTML上

<h1>{{ $my_obj->translate('some string to translate'); }}</h1>