Предоставление Zend страниц навигации нескольких привилегий ACL - PullRequest
3 голосов
/ 15 марта 2010

Я использую Zend_Navigation и пытаюсь интегрировать его с Zend_Acl.Каждая страница в навигации имеет атрибут privilege.Что я не могу определить, так это как определить несколько привилегий для одной страницы.

Вариант использования: Страница, предназначенная для управления пользователями.Я хочу отобразить эту страницу (в навигации), если текущая вошедшая в систему роль пользователя имеет права add, edit или delete для ресурса Users.

Пример записи в XML навигации:

<admin_users>
    <label>Users</label>
    <route>default</route>
    <controller>admin</controller>
    <action>users</action>
    <resource>Users</resource>
    <privilege>add,edit,delete</privilege>
</admin_users>

Использование списка, разделенного запятыми, как указано выше, не дает желаемого поведения.


ОБНОВЛЕНИЕ

После копанияс помощью кода я обнаружил, что Zend_Navigation_Page допускает только одно строковое значение.Кто-нибудь расширил этот класс или нашел другой способ обойти это ограничение?

/**
 * Sets ACL privilege associated with this page
 *
 * @param  string|null $privilege  [optional] ACL privilege to associate
 *                                 with this page. Default is null, which
 *                                 sets no privilege.
 * @return Zend_Navigation_Page    fluent interface, returns self
 */
public function setPrivilege($privilege = null)
{
    $this->_privilege = is_string($privilege) ? $privilege : null;
    return $this;
}

Ответы [ 3 ]

2 голосов
/ 30 апреля 2010

Я понял, что моей проблемой было отсутствие разрешения типа «просмотр». Когда я загружаю привилегии ресурса, я теперь предоставляю привилегию 'admin' для ресурса, если у пользователя есть какие-либо привилегии для этого ресурса. Затем я использую привилегию 'admin' на странице.

<admin_users>
    <label>Users</label>
    <route>default</route>
    <controller>admin</controller>
    <action>users</action>
    <resource>Users</resource>
    <privilege>admin</privilege>
</admin_users>
0 голосов
/ 29 апреля 2010

Вероятно, для передачи привилегий в виде массива требуется некоторая вложенность:

<admin_users>
    <label>Users</label>
    <route>default</route>
    <controller>admin</controller>
    <action>users</action>
    <resource>Users</resource>
    <privilege>
        <add>add</add>
        <edit>edit</edit>
    </privilege>
</admin_users>

Edit:

Здравый смысл говорит, что одна ссылка должна указывать на одно действие. Вы можете добавить <params> узлов в меню.

<admin_users_edit>
    <label>Users edit</label>
    <route>default</route>
    <controller>admin</controller>
    <action>users</action>
    <resource>Users</resource>
    <params>
       <do>edit</do>
    </params>
    <privilege>
        <edit>edit</edit>
    </privilege>
</admin_users_edit>


<admin_users_delete>
    <label>Users delete</label>
    <route>default</route>
    <controller>admin</controller>
    <action>users</action>
    <resource>Users</resource>
    <params>
       <do>delete</do>
    </params>
    <privilege>
        <edit>delete</edit>
    </privilege>
</admin_users_delete>
0 голосов
/ 16 марта 2010

Вы пробовали следующее? Я не уверен, что это сработает, но я чувствую, что это сработает.

<admin_users>
<label>Users</label>
<route>default</route>
<controller>admin</controller>
<action>users</action>
<resource>Users</resource>
<privilege>add</privilege>
<privilege>edit</privilege>
<privilege>delete</privilege>

...