Yii2 渲染数据库内容

Yii2 render database content

有一个文本区域,用户可以在其中编辑一些模板并可以使用如下变量:

{{model.user.name}}

应用程序需要用数据替换此变量并显示 HTML 输出。

我们可以编写一个小函数,用数据替换模板中的变量,但我们需要使用像 Twig 或 Smarty 这样的模板引擎。

https://github.com/yiisoft/yii2-twig https://github.com/yiisoft/yii2-smarty

现在我们可以使用 Smarty 或 Twig 的 ViewRenderer。

$render = new ViewRenderer();
$content = $render->render($this->view,'template.twig',[
       'model' => $model,
]);

但是我看到这个错误:

Unable to find template "template.twig" (looked into: .).

如何在 Yii2 中使用 Smarty 或 Twig 渲染包含数据库内容的模板?

您无需手动创建渲染器,而是配置您的应用程序组件,如下所示:

[
    'components' => [
        'view' => [
            'class' => 'yii\web\View',
            'renderers' => [
                'twig' => [
                    'class' => 'yii\twig\ViewRenderer',
                    'cachePath' => '@runtime/Twig/cache',
                    // Array of twig options:
                    'options' => [
                        'auto_reload' => true,
                    ],
                    'globals' => ['html' => '\yii\helpers\Html'],
                    'uses' => ['yii\bootstrap'],
                ],
                // ...
            ],
        ],
    ],
]

您告诉 Yii 有一个渲染器可以处理扩展名为 .twig 的模板。

然后,您需要做的就是在控制器操作中调用渲染时添加 .twig扩展:

public function actionIndex()
{
        return $this->render('index.twig');

然后将您的树枝模板放入视图通常所在的视图文件夹中。

阅读 twig 扩展的文档:Twig Extension for Yii 2

如果您只想使用 twig 模板,您可以在设置默认扩展名的情况下避免指定扩展名 (.twig):

'components' => [
    'view' => [
        'defaultExtension' => 'twig',

我找到了 Mustache (https://github.com/bobthecow/mustache.php) 并且我是这样使用的:

$m = new \Mustache_Engine();
echo $m->render("Hello {{model.client.firma}}",['model' => $model]);

您应该创建一个 twig 组件,它将包围 Twig_Environment。如果需要,您可以添加 yii\twig\Extension 扩展名。那么你应该这样使用它:

$renderedTemplate = Yii::$app->twig->render($template, $context);

如果您确实需要从字符串变量呈现模板,您可以实现自己的 Twig_LoaderInterface。有一个 Twig_Loader_String,但它已被弃用,您不应该使用它。