Search code examples
phpyii2smartytemplate-engine

How show smarty template from string in yii2?



I wanna use smarty template engine in yii2.
In my project, i need load view codes from database and render them from controller.

My question is this:

Is there any way to render a view code from string and control it like common render?

i need something like below:

$this->renderAsString($templateStr, ['param1'=>$val1, 'param2'=>$val2]);

this is important for me can access variable and function like as below code in index.tpl file.

$this->render('index.tpl'['param1'=>$val1, 'param2'=>$val2]);

I read this http://www.smarty.net/docs/en/resources.string.tpl but my answer is different, i think.


Solution

  • There is special separate extension called yii2-smarty for rendering views with Smarty. You need to install it via Composer, then configure like this for usage:

    return [
        //....
        'components' => [
            'view' => [
                'renderers' => [
                    'tpl' => [
                        'class' => 'yii\smarty\ViewRenderer',
                        //'cachePath' => '@runtime/Smarty/cache',
                    ],
                ],
            ],
        ],
    ];
    

    As for your specific problem, look at these two issues on Github:

    Core developer Klimov Paul recommends to use eval, but also in Smarty dedicated function exists exactly for these kind of situations.

    Example 8.4. Another {eval} example

    This outputs the server name (in uppercase) and IP. The assigned variable $str could be from a database query.

    <?php
    $str = 'The server name is {$smarty.server.SERVER_NAME|upper} '
           .'at {$smarty.server.SERVER_ADDR}';
    $smarty->assign('foo',$str);
    ?>
    

    Where the template is:

    {eval var=$foo}