Проблема: Попробуйте получить текущего аутентифицированного пользователя в бэкенде (администратор с некоторыми разрешениями), платформа OctoberCMS. Я расширил плагин с помощью специального плагина (в методе boot()) и хочу удалить sideMenuItem из меню, когда у пользователя нет разрешения на доступ к нему. (Я успешно сделал это - пользователь не может получить доступ к этому элементу (доступ запрещен) - но я хочу удалить этот элемент из sideMenu).
Следующий код находится в MyPlugin, поскольку я хочу расширить плагин OtherAuthor.
public function boot()
{
/** Extends plugin */
$this->otherAuthorPluginExtend();
}
public function registerPermissions()
{
return [
/** Permissions for accessing sidemenuItems from OtherAuthor plugin */
'author.plugin.plugin_access' => [
'roles' => ['Developer'],
],
];
}
public function otherAuthorPluginExtend(){
//>>>THIS NOT WORK
$user = \Backend\Facades\BackendAuth::getUser();
var_dump($user);
/*this hide sideMenu item based on permission level*/
if (array_key_exists('author.plugin.plugin_access', $user->permissions)) {
//>>>THIS WORKS FINE, but for all backend users
Event::listen('backend.menu.extendItems', function ($manager) {
$manager->removeSideMenuItem('OtherAuthor.Plugin', 'Plugin', 'sideMenuItem');
});
}
//>>>THIS WORKS FINE
/*this restrict access to that page from sideMenu*/
\OtherAuthor\Plugin\Controllers\SideMenuItemController::extend(function ($controller){
$controller->requiredPermissions = ['author.plugin.plugin_access'];
});
}
Почему $user получает NULL? Есть ли другой способ получить к нему доступ?
Заранее спасибо!
Дело в том, что event
вызывается после регистрации всех плагинов и начала сеанса пользователя, поэтому вам нужно нажать your conditional check code inside event callback
.
Таким образом, вы можете получить текущего вошедшего в систему пользователя. `если вы попытаетесь поместить текущий код пользователя снаружи, возможно, сеанс еще не инициализирован.
Ваш код должен выглядеть так.
public function boot()
{
/** Extends plugin */
$this->otherAuthorPluginExtend();
}
public function otherAuthorPluginExtend(){
// here you can not get user
// $user = \Backend\Facades\BackendAuth::getUser();
\Event::listen('backend.menu.extendItems', function ($manager) {
/*this hide sideMenu item based on permission level*/
// inside event callback you can retrieve user
$user = \Backend\Facades\BackendAuth::getUser();
if (array_key_exists('author.plugin.plugin_access', $user->permissions)) {
$manager->removeSideMenuItem('OtherAuthor.Plugin', 'Plugin', 'sideMenuItem');
}
});
/*this restrict access to that page from sideMenu*/
\OtherAuthor\Plugin\Controllers\SideMenuItemController::extend(function ($controller){
$controller->requiredPermissions = ['author.plugin.plugin_access'];
});
}
Теперь все должно работать как положено :)
если есть сомнения, пожалуйста, прокомментируйте.
хм, может быть, поделитесь примером кода, тогда я смогу вам помочь :)
Попробуйте добавить пользовательскую выборку в событие backend.menu.extendItems.
Это должен быть самый короткий ответ, но пример/детали не были предложены. Спасибо, но г-н Сатасия очень хорошо ответил выше.
Это очень хороший ответ. Спасибо. Работает как шарм.
\Event::listen("backend.menu.extendItems", function ($manager) { $user = \Backend\Facades\BackendAuth::getUser(); //now the user can be managed // rest of code }