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