Yii2 在Yi2中,如何在运行时将小部件添加到最终视图?

Yii2 在Yi2中,如何在运行时将小部件添加到最终视图?,yii2,Yii2,我正在寻找一种在不修改视图或布局文件的情况下将小部件添加到最终视图的方法。 假设您正在创建一个composer包,其中包含一个引导类(一个实现yii\base\BootstrapInterface的类)和一个负责显示简单计时器的简单小部件。 您想将此小部件添加到所有web响应中的所有视图中。您是如何做到这一点的? 我不喜欢触摸我的视图文件或布局文件,我只是尝试创建一个包,它必须自己完成这项工作。假设您在这里使用的是yii2,并且您不能触摸布局文件和视图文件 你可以 1。使用afterRender

我正在寻找一种在不修改视图或布局文件的情况下将小部件添加到最终视图的方法。
假设您正在创建一个composer包,其中包含一个引导类(一个实现yii\base\BootstrapInterface的类)和一个负责显示简单计时器的简单小部件。
您想将此小部件添加到所有web响应中的所有视图中。您是如何做到这一点的?
我不喜欢触摸我的视图文件或布局文件,我只是尝试创建一个包,它必须自己完成这项工作。

假设您在这里使用的是yii2,并且您不能触摸布局文件和视图文件

你可以

1。使用afterRender功能

为此,您需要覆盖视图类,添加自己的
afterRender
函数来处理页面,并根据自己定义的规则添加小部件。 然后你可以打电话

 $this->view->on('afterRender', ...);
在渲染后执行任何您想要的操作

由于控制器调用默认视图类,因此还需要重写yii\web\controller类并更改所使用的视图类

2。使用Javascript获取小部件并显示给用户

添加一个javascript,将小部件元素附加到正确的位置,使用ajax从单独的独立(部分)视图文件获取

3.如果开发扩展

您可以在引导函数中的“开始”或“结束”视图主体上触发函数

$app->on(Application::EVENT_BEFORE_REQUEST, function () use ($app) {
        $app->getView()->on(View::EVENT_END_PAGE, [$this, 'renderWidget']);
    });
并添加与以下类似的renderWidget函数:

    public function renderWidget($event){
        $view = $event->sender;
        echo "extra html at end of page";
    }

感谢您提供的详细信息和很好的回答,但问题是我正在创建一个包,我所拥有的只是一个引导类,它将在每个web请求的引导阶段调用。我无权访问项目的配置文件来更改视图类。而且我无法使用$app->View=new MyOwnView()设置视图;在我的引导中,因为$app->view是只读属性。当框架执行我的引导类的引导函数时,视图已经设置好了,我不能更改它。如何在引导函数中重写View类?我添加了另一个选项来满足您的要求。