Я хочу смочь показать или скрыть определенные элементы в представлении на основе ACL. Например, если пользователь смотрит на мое представление Users/index, я не хочу показывать, 'Удаляют Пользователя' элемент, если у него нет разрешения удалить пользователей. Если у него действительно есть разрешение отредактировать пользователей, я действительно хочу показать 'Пользовательскую ссылку' Редактирования.
Я могу взломать это вместе, но быть очень в новинку для Пирога, я надеюсь, что существует изящное решение. Лучшее, которое я сделал, вовлекает логику хранения в два места, таким образом, это - ад для поддержания.
Спасибо!
Не существует универсального "элегантного решения" :) Я тоже всегда хотел сделать такое. В любом случае, как вы могли бы это сделать:
Перезаписать Html Helper в каталоге вашего приложения - сделать копию из /cake/libs/views/helpers/html.php в /app/views/helpers/html.php и внести некоторые изменения в функции Html :: link.
Например, вы можете проверить, содержит ли URL действие «редактировать» или «удалить».
Другая часть - передать правильные параметры от контроллера. В AppController :: beforeFilter вы можете прочитать права пользователя (лучше кэшировать) и передать их в специальной переменной Auth в View.
Таким образом, если у вас есть права на просмотр, вы можете легко изменить ссылку. :)
Как я уже сказал, я не делал этого на реальном примере, но я бы сделал это так.
В этом есть 1 плохой момент - если исходный помощник Html будет изменен, ваш помощник останется прежним. Но я считаю, что помощник Html достаточно зрел, поэтому для меня это не большая проблема.
Я делаю это так в app_controller.php, хотя с таким же успехом можно сделать это в конкретных контроллерах. Переменные представления $usersIndexAllowed
и $configureAllowed
затем используются в условных операторах в представлении.
function beforeRender()
{
if($this->layout=='admin')
{
$usersIndexAllowed = $this->Acl->check($user,"users/index");
$configureAllowed = $this->Acl->check($user,"siteAdmins/configure");
}
$this->set(compact('usersIndexAllowed','configureAllowed'));
}