【问题标题】:Yii2 render database contentYii2 渲染数据库内容
【发布时间】:2016-02-14 07:46:53
【问题描述】:

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

{{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: .).

如何使用 Smarty 或 Twig 在 Yii2 中使用来自数据库的内容呈现模板?

【问题讨论】:

    标签: yii2 twig smarty render


    【解决方案1】:

    我找到了 Mustache (https://github.com/bobthecow/mustache.php),我正在这样使用:

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

    【讨论】:

    【解决方案2】:

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

    [
        '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 的模板。

    然后,您只需在控制器操作中调用渲染时添加.twigextension:

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

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

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

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

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

    【讨论】:

    • 最后我需要从数据库中渲染字符串内容,而不是文件。我找到了解决问题的方法,Mustache。
    • 很公平 - 你可以使用 Twig 或任何你喜欢的东西 - 我似乎误解了你的要求。 ;)
    【解决方案3】:

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

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

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

    【讨论】:

      猜你喜欢
      • 2019-09-29
      • 1970-01-01
      • 2020-08-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-06-03
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多