如何向 smarty 扩展 yii2 添加自定义函数

How to add a custom function to smarty extension yii2

我对 yii2 的 smarty 扩展有点小问题。

我创建了一个新的 smarty 函数,并将代码添加到此文件中:

backend/vendor/yiisoft/yii2-smarty/src/Extension.php

 public function __construct($viewRenderer, $smarty)
    {
        //other code
        /* CUSTOM FUNCTION REGISTER */
        $smarty->registerPlugin('function', 'test', [$this, 'functionTest']);
    }
//this is the custom function
public function functionTest($params, $template){
        return "Test custom funcion";
    }

我可以像这样在我的模板中使用这个自定义函数 {test} 并且一切正常。

今天我把yii2更新到了2.0.20版本,显然Extension.php文件被替换了,所以我不能再访问自定义函数了。 我的问题是:如何在 yii2 中为 smarty 添加自定义函数?

我将这样设置配置数组:

//this is in backend/config/main.php
'view' => [

            'renderers' => [
                'tpl' => [
                    'class' => 'yii\smarty\ViewRenderer',
                    'pluginDirs' => ['@backend/saSmartyPlugin'],
                    'widgets' =>[
                                  'functions' => [['test' => 'test'], ],
                                ],
                    //'cachePath' => '@runtime/Smarty/cache',
                ],
            ],
        ],

然后将我的 test.php 文件插入到 saSmartyPlugin 文件夹中:

<?php
    class Test{
        function functionTest($params, $template){
           return "Test custom funcion";
        }
    }

但是我得到这个错误:

Smarty: Undefined class 'test' in register template class

我同意 Muhammad Omer Aslam 的观点,您应该从 backend/vendor/yiisoft/yii2-smarty/src/Extension.php 扩展,以便创建任何新方法并能够在更新后使用它们。之后,您只需将配置文件路径写入扩展 class.

我会根据@MuhammadOmerAslam 和@SergheiLeonenco 的建议找到解决方案。 我为遇到此问题的任何人写下此答案。

首先,我创建了 php 文件 Test.php 并扩展了 Smarty

的扩展 class
namespace common\components;

use yii\smarty\Extension;

class Test extends Extension{

    public function __construct($viewRenderer, $smarty){ 

        parent::__construct($viewRenderer, $smarty);// call parent construct
        $smarty->registerPlugin('function', 'bread', [$this, 'functionBreadcrumbs']);//register my custom function
    }
    //My custom function
    function functionTest($params, $template){
       return "Test custom funcion";
    }

然后我将这个文件保存到 common/components/

之后我修改了我的 config.php 文件

'view' => [

            'renderers' => [
                'tpl' => [
                    'class' => 'yii\smarty\ViewRenderer',
                    'extensionClass' => 'common\components\Test'
                ],
            ],
        ],

    ],