Как мне расширить помощник просмотра меню Zend?
Мне нужно изменить вывод Zend_View_Helper_Navigation_Menu
. Я нашел две функции, которые мне нужно будет изменить, и я знаю, как внести необходимые изменения. Я не знаю, как заставить объект Navigation использовать помощник представления вместо Zend.
Фрагмент кода, представляющий расширение моего класса:
// file /library/My/View/Helper/Navigation/Menu.php
class My_View_Helper_Navigation_Menu extends Zend_View_Helper_Navigation_Menu
{
protected function _renderDeepestMenu(Zend_Navigation_Container $container,
$ulClass,
$indent,
$minDepth,
$maxDepth)
{
// modified code here
}
protected function _renderMenu(Zend_Navigation_Container $container,
$ulClass,
$indent,
$minDepth,
$maxDepth,
$onlyActive)
{
// modified code here
}
}
Редактирование для уточнения
Я хочу изменить класс элементов <li>
и удалить EOL
и отступ. Нет никаких возможностей сделать это с видом меню script, поэтому я должен его продлить.
Инициализация объекта навигации в моем Bootstrap:
$navTable = new Default_Model_Site_DbTable_Navigation();
$view = $this->getResource('view');
$view->navigation(new Zend_Navigation($navTable->getNavigation()));
Отображение меню в моем макете:
echo $this->navigation()->menu();
Решение
Я получил его работу, переименовав вещи следующим образом, но я не понимаю, почему я не могу перегрузить/перезаписать класс _Menu
и menu()
.
- Измените имя класса на
My_View_Helper_Navigation_MyMenu
- Добавить функцию
myMenu
в класс (return parent::menu($container);
)
- Вызов
echo $this->navigation()->myMenu();
в макете
Каркас класса:
// file /library/My/View/Helper/Navigation/MyMenu.php
class My_View_Helper_Navigation_MyMenu extends Zend_View_Helper_Navigation_Menu
{
public function myMenu(Zend_Navigation_Container $container = null)
{
return parent::menu($container);
}
protected function _renderDeepestMenu(Zend_Navigation_Container $container,
$ulClass,
$indent,
$minDepth,
$maxDepth)
{
// modified code here
}
protected function _renderMenu(Zend_Navigation_Container $container,
$ulClass,
$indent,
$minDepth,
$maxDepth,
$onlyActive)
{
// modified code here
}
}
Ответы
Ответ 1
$view->addHelperPath(
APPLICATION_ROOT . '/library/MyApp/View/Helper/Navigation',
'MyApp_View_Helper_'
);
echo $this->navigation()->myMenu(); // name of your class
От: Получение меню Zend_Navigation для работы с fisheye jQuery
ИЗМЕНИТЬ
Извините, я не видел вашего решения, это именно то, что я опубликовал.
Но почему это не просто расширение класса меню?
Ответ 2
Для тех, кому может понадобиться ответ, я нашел лучший способ и, возможно, предполагаемый путь.
Единственное, что вам нужно сделать, это создать свой собственный настраиваемый помощник вида, который расширяет "Zend_View_Helper_Navigation_HelperAbstract" и задает прокси-сервер по умолчанию для помощника по навигации для вашего собственного.
например.
class Admin_View_Helper_NavigationMenu extends
Zend_View_Helper_Navigation_HelperAbstract {
public function render(\Zend_Navigation_Container $container = null) {
return "Hello world!!";
}
}
и
$this->view->navigation()->setDefaultProxy("navigationMenu");
(Я изменяю прокси-сервер по умолчанию в действии контроллера меню, поскольку он добавлен в стек действия)
Сделав это, можно будет использовать это в представлении
<?= $this->navigation()->render(); ?>
Примечание. Вам все равно нужно переименовать класс помощника вида, но то, как работают помощники справки в Zend (имена не должны сталкиваться).
Ответ 3
Вы отредактировали свой пост? Похоже, что мой ответ сейчас совершенно не имеет отношения к вашему вопросу?
Если вы скажете, что вам нужно изменить, это будет проще. На данный момент ваш вопрос немного запутан.
Я предположил, что вы хотите отредактировать представление ПОСЛЕ того, как уже создала навигацию. Если вы можете сделать это до, вы его создадите, а затем еще проще. Этот бит ниже немного запутан, потому что вы обычно меняете параметры перед рукой.
// Get the helper navigation
$navigation = $viewRenderer->
view->
getHelper( 'navigation' )
->menu()
->renderMenu(
$YOUR_NAVIGATION_OBJECT,
array( 'minDepth' => null,
'maxDepth' => null,
'onlyActiveBranch' => false,
'renderParents' => false,
// More options here
)
);
Извините отступ, было очень сложно получить его выровненным почти
Обратите внимание, что я использовал $YOUR_NAVIGATION_OBJECT выше. Вы используете это только в том случае, если на своей странице вы используете более одной навигации. В противном случае вы используете Render() вместо RenderMenu().