Я знаю, что вы задали этот вопрос некоторое время назад, но я подумал, что было бы интересно поделиться своим кодом, поскольку я столкнулся с той же проблемой.
По сути, то, что я придумал, - это новый метод синтаксического анализа для файла Xml, поэтому я могу напрямую создавать экземпляры своих моделей в моем файле конфигурации навигации Xml, чтобы мои привилегии правильно добавлялись в мое дерево ACL.
Давайте сначала взглянем на мое Xml-меню:
<?xml version="1.0" encoding="UTF-8" ?>
<configdata>
<nav>
<dashboard>
<label>Dashboard</label>
<controller>index</controller>
<action>index</action>
<class>icon-dashboard</class>
<resource>Model_Dashboard_Dashboard</resource>
</dashboard>
<members>
<label>Members</label>
<controller>members</controller>
<action>index</action>
<resource>Model_Members_Members</resource>
<class>icon-members</class>
<pages>
<members-list>
<label>Members list</label>
<controller>members</controller>
<action>list</action>
<resource>Model_Members_List</resource>
<privilege>list</privilege>
</members-list>
</pages>
</members>
<charts>
<label>Charts</label>
<controller>charts</controller>
<action>index</action>
<resource>Model_Charts_Charts</resource>
<class>icon-charts</class>
</charts>
<documents>
<label>Documents</label>
<controller>documents</controller>
<action>index</action>
<resource>Model_Documents_Documents</resource>
<class>icon-documents</class>
</documents>
</nav>
</configdata>
Здесь интересны атрибуты ресурса, все они на самом деле являются классами, представляющими мои модели.
Вы, наверное, заметили в документации Zend:
Примечание. Тип возврата
Данные конфигурации, считанные в Zend_Config_Xml, всегда возвращаются в виде строк. Преобразование данных из строк в другие типы предоставляется разработчикам в соответствии с их конкретными потребностями.
а это значит, что мои модели будут скомпонованы в струны ... облом! Чтобы предотвратить такое поведение, я использовал эту функцию, которая преобразует строку ресурсов в объекты:
public static function convertNavigationAclToObject($config)
{
foreach ($config as $key => $value) {
if (is_string($value) AND $key === "resource") {
$config[$key] = new $value;
break;
} elseif (is_array($value)) {
$config[$key] = self::convertNavigationAclToObject($value);
}
}
return $config;
}
Эта функция позволяет мне рекурсивно преобразовывать все мои значения в объект и, следовательно, одновременно устанавливать права (разрешить, запретить ... в ваших моделях - setAcl()
).
Наконец, я создаю свою навигацию в три этапа:
- Получите конфигурацию из файла XML
- Преобразовать строку ресурса в объект
- Создать экземпляр Zend_Navigation
В вашем бутстрапе:
$config = new Zend_Config_Xml(APPLICATION_PATH . /modules/default/views/navigation/navigation.xml', 'nav');
$pages = My_Utils::convertNavigationAclToObject($config->toArray());
$container = new Zend_Navigation($pages);
Надеюсь, это поможет;)
person
Liyali
schedule
02.03.2012