我正在寻找一种方法,可以在不修改视图或布局文件的情况下将小部件添加到最终视图。
想象一下,你正在创建一个包含Bootstrap类(一个实现yii \ base \ BootstrapInterface的类)和一个负责显示一个简单计时器的简单小部件的作曲家包。
您想要将此小部件添加到所有Web响应中的所有视图中。您是否这样做?
我不想触摸我的视图文件或布局文件,我只是尝试创建一个必须单独执行此操作的包。
答案 0 :(得分:1)
假设您在这里使用yii2,则不得触摸布局和查看文件。
你可以
<强> 1。使用afterRender功能
为此,您需要覆盖View类,添加自己的afterRender
函数来处理页面,并根据您自己定义的规则添加窗口小部件。
然后你可以打电话
$this->view->on('afterRender', ...);
在渲染后做任何你想做的事。
由于控制器调用默认视图类,您还需要覆盖yii \ web \ controller类并更改使用的视图类。
<强> 2。使用Javascript获取小部件并显示给用户
添加一个javascript,它将widget元素附加到正确的位置,使用来自单独的独立(部分)视图文件的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";
}