Динамическое меню ZF2 с Zend \ Navigation \ Navigation

Я хочу спросить вас об этой проблеме. Что мне нужно для создания динамического меню с помощью Zend \ Navigation \ Navigation?

В ZF1 я сделал следующее:

$container = new Zend_Navigation(); $pages = array( array( 'label' => 'Save', 'action' => 'save', ), array( 'label' => 'Delete', 'action' => 'delete', ), ); // add two pages $container->addPages($pages); 

а затем:

 $this->navigation()->menu(); 

Но на ZF2 страницы берутся из config. Теперь я создаю \ config \ autoload \ nav.global.php и создаю массив страниц. Но мне нужно сделать массив страниц в методе и отправить его в помощник навигации, но я не знаю, как ((

Я попытался сделать это в своем контроллере:

 use Zend\Navigation\Navigation; $pages =array( // All navigation-related configuration is collected in the 'navigation' key 'navigation' => array( // The DefaultNavigationFactory we configured in (1) uses 'default' as the sitemap key 'default' => array( // And finally, here is where we define our page hierarchy 'account' => array( 'label' => 'faq', 'route' => 'faq', 'pages' => array( 'news' => array( 'label' => 'news', 'route' => 'news', ), 'manual' => array( 'label' => 'manual', 'route' => 'manual', ), ), ), ), ), ); $Menu = new Navigation($pages); 

а затем это:

 $this->Menu()->menu(); 

но у меня много ошибок …

Я думаю, вы понимаете мою проблему. пожалуйста помоги. Извините за мой английский.

Следуйте этим простым шагам, чтобы динамически создать многоуровневое меню. Шаг 1: создайте частичный файл menu.phtml и сохраните его в папке макета или в модуле, например application / view / layout / menu.phtml

  <ul id="menu" > <?php foreach ($this->container as $page): ?> <li <?= $page->isActive()? 'class="active"' : 'class="drop"' ?>> <?php echo $this->navigation()->menu()->htmlify($page). PHP_EOL ?> <div class="dropdown_2columns" > <?php foreach ($page as $catpage) :?> <div class="col_1" > <h3 <?= $page->isActive()? 'class="active"' : 'class="drop"' ?> > <?= $this->navigation()->menu()->htmlify($catpage). PHP_EOL ?> </h3> <ul > <?php foreach ($catpage as $subpage) :?> <li <?= $subpage->isActive()? 'class="active"' : 'class="drop"' ?>> <?= $this->navigation()->menu()->htmlify($subpage). PHP_EOL ?> <?php endforeach; ?> </ul> </div> <?php endforeach; ?> </div><!-- End dropdown container --> </li> <?php endforeach; ?> </ul> 

Шаг 2 в вашем модуле.php

 public function getServiceConfig() { return array( 'initializers' => array( function ($instance, $sm) { if ($instance instanceof \Zend\Db\Adapter\AdapterAwareInterface) { $instance->setDbAdapter($sm->get('Zend\Db\Adapter\Adapter')); } } ), 'invokables' => array( 'menu' => 'Application\Model\MenuTable', ), 'factories' => array( 'Navigation' => 'Application\Navigation\YourNavigationFactory' ) ); } 

в папке src / navigation в вашем модуле создайте YourNavigation.php и YourNavigationFactory.php

 namespace Application\Navigation; use Zend\ServiceManager\ServiceLocatorInterface; use Zend\Navigation\Service\DefaultNavigationFactory; use Admin\Model\Entity\Tablepages; class YourNavigation extends DefaultNavigationFactory { protected function getPages(ServiceLocatorInterface $serviceLocator) { if (null === $this->pages) { $fetchMenu = $serviceLocator->get('menu')->fetchAll(); $configuration['navigation'][$this->getName()] = array(); foreach($fetchMenu as $key=>$row) { $subMenu = $serviceLocator->get('menu')->fetchAllSubMenus($row['id']); if($subMenu){ $pages = array(); foreach($subMenu as $k=>$v) { foreach($v as $field=>$value){ $page['label'] =$value['heading']; $page['route'] = 'visas'; if ($value['path'] == $row['path']){ $page['params'] = array('action'=>'index', 'category'=> $this->$row['path'], ); } $subCatMenu = $serviceLocator->get('menu')->fetchAllSubCatMenus($value['id']); $subcatpages = array(); $subcatgroup = array(); $group = array(); if($subCatMenu>0){ foreach($subCatMenu as $k=>$v) { foreach($v as $field=>$value1){ $subpage['label'] =$value1['heading']; $subpage['route'] = 'visas'; if ($value['path'] ==$row['path']){ $subpage['params'] = array('action'=>'index', 'category'=> $row['path'], 'sub_category'=> $value1['path']); }elseif($row['id'] ==76){ $subpage['params'] = array('action'=>'index', 'category'=>$value['path'], 'sub_category'=>$value1['path']); }else{ $subpage['params'] = array('action'=>'index', 'category'=> $row['path'], 'sub_category'=> $value['path'], 'id'=> $value1['path']); } } $group[] =$subpage; } $page['pages'] =$group; $pages[] =$page; } } } } $configuration['navigation'][$this->getName()][$row['name']] = array( 'label' => $row['name'], 'route' => 'visas', 'params' => array( 'action' => 'index', 'category' => $row['path'], ), 'pages' => $pages, ); } if (!isset($configuration['navigation'])) { throw new Exception\InvalidArgumentException('Could not find navigation configuration key'); } if (!isset($configuration['navigation'][$this->getName()])) { throw new Exception\InvalidArgumentException(sprintf( 'Failed to find a navigation container by the name "%s"', $this->getName() )); } $application = $serviceLocator->get('Application'); $routeMatch = $application->getMvcEvent()->getRouteMatch(); $router = $application->getMvcEvent()->getRouter(); $pages = $this->getPagesFromConfig($configuration['navigation'][$this->getName()]); $this->pages = $this->injectComponents($pages, $routeMatch, $router); } return $this->pages; } } 

YourNavigationFactory.php

  namespace Application\Navigation; use Zend\ServiceManager\FactoryInterface; use Zend\ServiceManager\ServiceLocatorInterface; class YourNavigationFactory implements FactoryInterface { public function createService(ServiceLocatorInterface $serviceLocator) { $navigation = new MyNavigation(); return $navigation->createService($serviceLocator); } } 

в вашем layout.phtml

  <?php echo $this->navigation('navigation')->menu()->setPartial('menu')->render(); ?> 

создать динамическую карту сайта из навигации

  $this->navigation('navigation') ->sitemap() ->setUseXmlDeclaration(false) ->setServerUrl('http://www.yourdomain.com') ->setFormatOutput(true);?> echo $this->navigation()->menu()->setMinDepth(null)->setMaxDepth(null)->setOnlyActiveBranch(false)->setRenderInvisible(true); 

создавать панировочные сухари

 echo $this->navigation() ->breadcrumbs() ->setLinkLast(true) ->setMaxDepth(1) ->setSeparator(' ▶' . PHP_EOL); 

Я надеюсь, что это поможет вам сэкономить ваше время

На каком-то фоне вы можете прочитать этот ответ на другом, но похожий вопрос относительно Zend\Navigation . Дело в том, что вы хотите, чтобы страницы MVC и страницы MVC в Zend Framework 2 нуждались в способе собрать URL-адрес и найти наш, если URL-адрес активен или нет.

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

Аналогично для сборки URL. Если вы хотите преобразовать имя маршрута в URL-адрес, вам понадобится стек маршрута («маршрутизатор»). Вставьте маршрутизатор в свое приложение, и вы сможете его собрать.

Вкратце:

 use Zend\Navigation\Service\ConstructedNavigationFactory; class MyController extends AbstractActionController { public function indexAction() { $config = array( // your config here ); $factory = new ConstructedNavigationFactory($config); $navigation = $factory->createService($this->getServiceLocator()); return new ViewModel(array( 'navigation' => $navigation; )); } } 

И похоже, как указано выше, на ваш взгляд:

 <?php echo $this->navigation($navigation)->menu()?> 

Мой предыдущий ответ неправильный. Следующий код работает. Для одной страницы. В контроллере отредактируйте действие:

 $page = new \Zend\Navigation\Page\Mvc(array( 'route' => 'application/default', 'controller' => 'album', 'action' => 'edit', 'use_route_match' => true, )); $r = $this->getEvent()->getRouter(); $rm = $this->getEvent()->getRouteMatch(); $page->setRouter($r); $page->setRouteMatch($rm); echo $page->isActive() ? 'true' : 'false'; // true echo $page->getHref(); // /test_app/public/application/album/edit/id1 

Вы должны это сделать

В контроллере

 $pages = new \Zend\Navigation\Page\Mvc(array( 'pages'=> array( 'album' => array( 'label' => 'Album3', 'controller' => 'album', 'action' => 'edit', 'params' => array('id'=>2), 'route' => 'album/default', ) ) )); $navigation = new \Zend\Navigation\Navigation(); $serviceLocator = $this->getServiceLocator()->get('Application'); $routeMatch = $serviceLocator->getMvcEvent()->getRouteMatch(); $router = $serviceLocator->getMvcEvent()->getRouter(); $pages->setRouteMatch($routeMatch); $pages->setDefaultRouter($router); $navigation->addPage($pages); 

Ввиду

 <?php echo $this->navigation($this->navigation)->menu() ?> 

Eremite ответ на самом деле не так. Я проверил все рекомендации, приведенные здесь, и на самом деле, когда по умолчанию маршрут имеет по умолчанию несколько символов child_routes, меню не отмечают правильный флаг. Поэтому необходимо передать согласованный маршрут в качестве параметра. Но, возможно, я делаю что-то неправильно.

ура