Zend_Navigation, Zend_ACL + Роли неправильно фильтруются через Ajax-запрос - PullRequest
0 голосов
/ 21 декабря 2010

В настоящее время я использую вместе Zend_acl и Zend_Navigation в моем проекте, и, похоже, он работает правильно. Тем не менее, я использую на своем сайте большое количество ajax и сделал вход в систему с помощью jqModal и jQuery, которые регистрируют пользователей без перезагрузки текущей страницы и также нуждаются в перезагрузке навигации. Я до сих пор заставил это работать, но возвращаемая навигация - все ссылки с видимым полем как истина, которая является неправильной. Например, когда я вошел как пользователь, ссылка для входа не должна быть видна.

Любая помощь будет оценена. Мой код ниже для действий, функции JavaScript и Json вернулся.

=============================================== ======== текущая роль = администраторы

// ДЕЙСТВИЕ КОНТРОЛЛЕРА

публичная функция getnavigationjsonAction () { // $ view-> навигация ($ контейнер) -> SetACL ($ это -> _ ACL) -> setRole (Zend_Registry :: получить ( 'роль')); // echo $ this-> navigation () -> menu (); $ navigation = $ this-> getView () -> navigation () -> setAcl ($ this -> _ acl) -> setRole (Zend_Registry :: get ('role')); // умереть (Zend_Registry :: получить ( 'роль')); // матрица ($ это -> _ ACL); $ Это -> _ helper-> JSON ($ навигационно> ToArray ()); }

// ФУНКЦИЯ JAVASCRIPT

функция reloadNavigationMenu () { // alert ('перезагрузка навигации'); $ .ajax ({ url: "/ default / ajax / getnavigationjson", тип: "POST", кеш: ложь, асинхронный: ложный, данные: "формат = json", success: function (data) { var html = ''; console.log (данные);

$. Каждый (данные, функция (i) { if (data [i] .visible === true) { //console.log(data[i]); HTML + = '

'; HTML + = '' + данные [я] .label + ''; HTML + = ''; } }); HTML + = ''; . $ ( '# Zend_navigation_container') HTML (HTML); } });

}

// ВОЗВРАТ данных JSON с контроллера

[{"action": "index", «активный»: ложь, "класс": ноль, «контроллер»: «админ», "id": ноль, "label": "Административная секция", «модуль»: «админ», "заказ": ноль, "страницы": [], "params": [], "привилегия": "индекс", "rel": [], "reset_params": правда, "ресурс": "админ: админ", "rev": [], «маршрут»: ноль, «цель»: ноль, "title": ноль, "type": "Zend_Navigation_Page_Mvc", «видимый»: правда }, {"action": "index", «активный»: ложь, "класс": ноль, «контроллер»: «индекс», "id": ноль, "label": "Home", «модуль»: «по умолчанию», "заказ": ноль, "страницы": [], "params": [], «привилегия»: ноль, "rel": [], "reset_params": правда, «ресурс»: ноль, "rev": [], «маршрут»: ноль, «цель»: ноль, "title": ноль, "type": "Zend_Navigation_Page_Mvc", «видимый»: правда }, {"action": "index", «активный»: ложь, "класс": ноль, «контроллер»: «индекс», "id": ноль, «label»: «Новости», «модуль»: «новости», "заказ": ноль, "страницы": [], "params": [], "привилегия": "индекс", "rel": [], "reset_params": правда, "ресурс": "новости: индекс", "rev": [], «маршрут»: ноль, «цель»: ноль, "title": ноль, "type": "Zend_Navigation_Page_Mvc", «видимый»: правда }, {"action": "index", «активный»: ложь, "класс": ноль, «контроллер»: «индекс», "id": ноль, "label": "Tutorials", «модуль»: «учебники», "заказ": ноль, "страницы": [], "params": [], "привилегия": "индекс", "rel": [], "reset_params": правда, "resource": "tutorials: index", "rev": [], «маршрут»: ноль, «цель»: ноль, "title": ноль, "type": "Zend_Navigation_Page_Mvc", «видимый»: правда }, {"действие": "о", «активный»: ложь, "класс": ноль, «контроллер»: «индекс», "id": ноль, "label": "About", «модуль»: «по умолчанию», "заказ": ноль, "страницы": [], "params": [], «привилегия»: «о», "rel": [],"reset_params": true, "resource": "default: index", "rev": [], "route": null, "target": null, "title": null, "type": "Zend_Navigation_Page_Mvc", "visible ": true}, {" action ":" comments "," active ": false," class ": null," controller ":" index "," id ": null," label ":" Comments ","module ":" default "," order ": null," pages ": []," params ": []," privilege ":" comments "," rel ": []," reset_params ": true," resource":" default: index "," rev ": []," route ": null," target ": null," title ": null," type ":" Zend_Navigation_Page_Mvc "," visible ": true}, {"action ":" index "," active ": false," class ": null," controller ":" contact "," id ": null," label ":" Contact "," module ":" default ","order ": null," pages ": []," params ": []," privilege ":" index "," rel ": []," reset_params ": true," resource ":" default: contact ","rev": [], "route": null, "target": null, "title": null, "type": "Zend_Navigation_Page_Mvc", "visible": true}, {"action": "login", "активный ": false, "class": null, "controller": "auth", "id": null, "label": "Login", "module": "default", "order": null, "pages": [], "params": [], "privilege": "login", "rel": [], "reset_params": true, "resource": "default: auth", "rev": [], "route":null, "target": null, "title": null, "type": "Zend_Navigation_Page_Mvc", "visible": true}, {"action": "logout", "active": false, "class": null,"controller": "auth", "id": null, "label": "Logout", "module": "default", "order": null, "pages": [], "params": [],"privilege": "logout", "rel": [], "reset_params": true, "resource": "default: auth", "rev": [], "route": null, "target": null,"title": null, "type": "Zend_Navigation_Page_Mvc", "visible": true}]

Это когда я вошел в систему как администратор, и ссылки для входа должны быть скрыты, но это не так.Похоже, что ACL не назначен для навигации должным образом.

Ответы [ 2 ]

0 голосов
/ 16 августа 2013

Вам нужно будет заставить Zend_Navigation повторно визуализировать навигацию. Как было сказано ранее, он «фильтрует» рендеринг на основе acl. Кроме того, вы не знаете, как вы храните эту роль в Zend_Registry, но вы можете рассмотреть возможность возврата этой роли при запросе Zend_Auth для аутентификации пользователя, если эта роль не обновлена, это также может вызвать проблему. Я бы также предложил настроить ваш acl и т. Д. В помощнике действий вместо действия, чтобы он мог обрабатывать «любое» действие вместо только этого действия. Тот факт, что элементы присутствуют, должен указывать на то, что меню по какой-то причине не перерисовывается, или обновленная роль не передается в Acl, если бы пункты меню вообще не присутствовали в меню. Zend_Navigation не будет отображать элементы, которые были отфильтрованы с помощью acl, это выходит далеко за рамки простой установки элемента, чтобы он не отображался.

Кроме того, какая роль определяет привилегию для отображения вкладки входа в систему? Вы должны сказать ACL, чтобы отрицать это для обычного пользователя и выше, если ваши роли наследуются от обычной роли пользователя, если нет, то это может действительно работать так, как должно. Как пример:

//..//..//
$this->addResource(new Zend_Acl_Resource('login')); //<- Allows the hiding of the login navigation tab
$this->addResource(new Zend_Acl_Resource('logout')); //<- Allows the hiding of the logout navigation tab

$this->allow($guest, array('user'), array('user.login', 'user.register'));
$this->allow('user', array('user', 'useraccount'), array('user.view', 'user.logout',  'user.account-editown', 'user.edit-account', //<-end user privs
            ));

//..//..//
$this->deny('user', array('user'), array('user.login', 'user.register'));
0 голосов
/ 01 февраля 2011

Я думаю, что Zend_Navigation использует ACL для определения, должна ли страница быть видимой во время визуализации . Он не изменяет ваши навигационные объекты, когда вы передаете ему объект ACL.

Вам нужен другой подход, если вы хотите создать собственный контейнер навигации, уменьшенный на ACL - возможно, расширение классов Zend Navigation и добавление соответствующих методов.

...