问题描述
我创建了一个插件来扩展User插件,现在我想扩展其控制器的更新功能。
其实我想做的是在管理员时检查一些数据
单击“更新”按钮,然后根据数据,让管理员照常编辑用户表单或将其重定向到用户列表。
我正在尝试通过插件中的路由来做到这一点:
Route::get('backend/rainlab/user/users/update/{id}','\RainLab\User\Controllers\Users@check_update');
public function boot()
{
\RainLab\User\Controllers\Users::extend( function($controller) {
$controller->addDynamicmethod('check_update',function($recordId = null,$context = null) use ($controller) {
return $controller->asExtension('FormController')->update($recordId,$context);
});
});
}
解决方法
这将无法工作,因为它将break life-cycle of back-end
并直接指向call method of controller
。
作为其他解决方案,我们可以使用事件:)-backend.page.beforeDisplay
在插件的
plugin.php
文件的引导方法中
public function boot() {
\Event::listen('backend.page.beforeDisplay',function($controller,$action,$params) {
if($controller instanceof \RainLab\User\Controllers\Users) {
// for update action
if($action === 'update') {
// check data ($params) and make decision based on that
// allow user to edit or NOT
if(true) {
// just redirect him to somewhere else
\Flash::error('Please No.');
return \Redirect::to('/backend/rainlab/user/users');
}
// if all good don't return anything and it will work as normal
}
}
});
}
它将根据您可以允许用户进行编辑或不进行编辑的条件(将消息重定向到其他操作)进行操作。
如有任何疑问,请发表评论。