首页 文章

在zf3中创建动态导航

提问于
浏览
2

我在我的项目中使用zend framework3 . 我可以按照文档link创建静态导航

现在我必须从数据库中获取菜单数据然后创建导航 . 为此我正在使用我已经将配置提供到module.config.php中,这是相册模块的配置文件 .

<?php
  namespace Album;

  use Zend\Router\Http\Literal;
  use Zend\Router\Http\Segment;
  use Zend\ServiceManager\Factory\InvokableFactory;
  use Zend\Navigation\Service\DefaultNavigationFactory;
  use Album\Navigation\AlbumNavigationFactory;

  return [
    'controllers' => [
      'factories' => [
         Controller\AlbumController::class => Factory\AlbumControllerFactory::class,
        Controller\IndexController::class => InvokableFactory::class,
          ],
       ],

     // Add this section:
    'service_manager' => [
        'factories' => [
           'navigation' => Navigation\AlbumNavigationFactory::class,
            Model\AlbumTable::class => Factory\AlbumTableFactory::class,
         ],
       ],
     // The following section is new and should be added to your file:
     'router' => [
        'routes' => [
        'album' => [
            'type'    => Segment::class,
            'options' => [
                'route' => '/album[/:action[/:id]]',
                'constraints' => [
                    'action' => '[a-zA-Z][a-zA-Z0-9_-]*',
                    'id'     => '[0-9]+',
                ],
                'defaults' => [
                    'controller' => Controller\AlbumController::class,
                    'action'     => 'index',
                ],
            ],
        ],
        'index' => [
            'type'    => Segment::class,
            'options' => [
                'route' => '/index[/:action[/:id]]',
                'constraints' => [
                    'action' => '[a-zA-Z][a-zA-Z0-9_-]*',
                    'id'     => '[0-9]+',
                ],
                'defaults' => [
                    'controller' => Controller\IndexController::class,
                    'action'     => 'index',
                ],
              ],
            ],
         ],
      ],

     'view_manager' => [
        'template_path_stack' => [
          'album' => __DIR__ . '/../view',
       ],
    ],
  ];

在zend framework2中,我们简单地传递一个带有工厂类的导航键

return array(
        'factories' => array(
            'Navigation' => 'Album\Navigation\AlbumNavigationFactory'
         ),
    );

在zend framework3中,我正在做同样的事情

'service_manager' => [
       'factories' => [
         'navigation' => Navigation\AlbumNavigationFactory::class,
          Model\AlbumTable::class => Factory\AlbumTableFactory::class,
        ],
    ],

我使用Navigation \ AlbumNavigationFactory :: class来调用工厂来获取数据 . 但我无法获得导航 . 任何帮助,将不胜感激 .

3 回答

  • 0

    这是我的代码的一部分 . 我认为会有所帮助 . 工作完美 .

    在Module.php中

    public function getServiceConfig()
     { 
        return array( 
          'factories' => array(
              'ItemsFromDatabase::class => Navigation\BlogNavigationFactory::class,
           )
                );
    }
    
    public function getViewHelperConfig() {  
          return[
            'factories' => [
                'AddItemsInNavigation' => function($helpers) {
                   $navigation = $helpers->get('Application')->getServiceManager()->get('Zend\Navigation\Default')->findOneByLabel('Blog');
                   $newItems = $helpers->get(ItemsFromDatabase::class);
                 return new View\Helper\AddItemsInNavigation($navigation, $newItems);    
                        },
    
                    ],
    

    博客\查看\助手\ AddItemsInNavigation.php

    <?php
    namespace Blog\View\Helper;
    
    use Zend\View\Helper\AbstractHelper;
    
    class AddItemsInNavigation extends AbstractHelper {
    
    protected $navigation;
    protected $newItems;
    
    public function __construct($navigation, $newItems) {
        $this->navigation = $navigation;
        $this->newItems = $newItems; 
    }
    
    public function addItems() {
       return $this->navigation->addPages($this->newItems);
    
    }
    
    }
    

    在布局中

    <?php
          $this->AddItemsInNavigation()->addItems(); //plugin
    
          $nawDef = $this->navigation('Zend\Navigation\Default')->menu();
    
          echo $nawDef->setMinDepth(0)->setMaxDepth(4)->setUlClass('nav navbar-nav');
    
                    ?>
    

    W Blog \ Navigation \ BlogNavigationFactory.php

    <?php
    namespace Blog\Navigation;
    
    use Interop\Container\ContainerInterface;
    use Zend\Navigation\Navigation;
    use Zend\Navigation\Service\DefaultNavigationFactory;
    
    class BlogNavigationFactory extends DefaultNavigationFactory {
    
    protected $pages;
    
    public function __invoke(ContainerInterface $container, $requestedName, array $options = null) {
        return new Navigation($this->getPages($container));
    }
    
    protected function getPages(ContainerInterface $container) {
    
        $navigation = array();
    
        if (null === $this->pages) {
    
            $navigation[] = array ( //for exemple 
                'label' => 'Jaapsblog.nl',
                'uri'   => 'http://www.jaapsblog.nl'
            );
    
            $mvcEvent = $container->get('Application')
                    ->getMvcEvent();
    
            $routeMatch = $mvcEvent->getRouteMatch();
            $router = $mvcEvent->getRouter();
            $pages = $this->getPagesFromConfig($navigation);
    
            $this->pages = $this->injectComponents(
                    $pages, $routeMatch, $router
            );
        }
    
        return $this->pages;
    }
    
    }
    
  • 1

    光盘 .

    在module.config.php中

    'navigation' => array(
    'default' => array(  
    
        'blog' => array(
                'label' => 'Blog',
                'route' => 'blog-front',
                'controller' => 'blog',
                'action' => 'index',
            )
      )
    )
    
  • 1

    我不知道你是否正在寻找,但我建议你看看这个页面:

    https://github.com/fabiopaiva/zf2-navigation-bootstrap3

相关问题