2016-11-17 4 views
1

Я использую zend framework3 в моем проекте. Я могу создать статическую навигацию, следуя документам linkсоздание динамической навигации в zf3

Теперь мне нужно получить данные меню из базы данных, а затем создать навигацию. Для этого я использую конфигурацию в файле 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', 
     ], 
    ], 
    ]; 

В Зенд framework2 мы просто передача навигации ключ с фабрики класса, как

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

В Зенд framework3 я делаю то же самое, как показано ниже

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

Я использую навигации \ AlbumNavigationFactory :: класс для вызова фабрики для извлечения данных. , но я не могу получить навигацию. Любая помощь будет оценена по достоинству.

ответ

0

Я не знаю, если это то, что вы ищете, но я рекомендую посмотреть на этой странице:

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

+0

@Andry Bueno Я проверил предоставленный URL. Мой вопрос - это массив, который мы передаем в навигационном ключе как 'navigation' => array ( 'default' => array (array ( 'label' => 'Home', 'route' => 'home' , 'icon' => 'glyphicon glyphicon-home' ), Я хочу, чтобы этот массив из базы данных. Вы знаете, как я могу получить этот массив из базы данных? –

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);  
        }, 

       ], 

Блог \ Просмотр \ Helper \ 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 Блог \ 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; 
} 

} 
+0

спасибо за комментарий. После реализации вышеуказанного кода i я получаю exeception «Uncaught exception» Zend \ ServiceManager \ Exception \ ServiceNotFoundException с сообщением «Невозможно разрешить службу« Zend \ Navigation \ Default »на фабрику;« У вас есть какие-либо идеи? –

+0

Zend \ Navigation \ Default - это имя моей навигации. Вы найдете это в файле module.config.php, например: 'navigation' => array ( 'default' => array ( – marcin

+0

Не могли бы вы предоставить это? Это будет очень полезно для меня, спасибо. –

0

cd.

В module.config.php

'navigation' => array(
'default' => array( 

    'blog' => array(
      'label' => 'Blog', 
      'route' => 'blog-front', 
      'controller' => 'blog', 
      'action' => 'index', 
     ) 
) 
) 
+0

Я добавил приведенный выше фрагмент кода в файлы module.config.php.Но я получаю Class 'Album \ view \ Helper \ AddItemsInNavigation' не найденную ошибку в файле Module.php, пока класс существует в соответствующем каталоге. Есть ли у вас какие-либо идеи? –

+0

класс AddItemsInNavigation.php это помощник. Я написал, как должен выглядеть класс AddItemsInNavigation.php Как я вижу, вы создаете другой проект, чем мой. Вы должны изменить в пространстве имен AddItemsInNavigation.php Blog \ View \ Helper; в пространстве имен Album \ View \ Helper; – marcin

+0

Я проверил, что это правильно в AddItemsInNavigation (пространство имен Album \ view \ Helper;). Я только что изменил View для просмотра папки, но, согласно вашему предложению, он также не работает. Я не знаю, почему класс не найден, так как я смог вызвать тот же путь в ZF2. –

Смежные вопросы