Я знаю, что вы задавали этот вопрос некоторое время назад, но я подумал, что было бы интересно поделиться своим кодом, поскольку я столкнулся с той же проблемой.
По сути, то, что я придумал, - это новыйметод синтаксического анализа для файла 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>
Здесь интересны атрибуты resource , все они на самом деле являются классами, представляющими мои модели.
Теперь вы, наверное, заметилив документации 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);
Надеюсь, что это поможет;)