Вопрос по dynamic, menu, php, zend-framework2, navigation – ZF2 Динамическое меню с Zend \ Navigation \ Navigation

5

Я хочу спросить вас об этой проблеме. Что мне нужно для создания динамического меню с помощью 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 \ 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();

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

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

Ваш Ответ

5   ответов
3

1:create a partial menu.phtml file and save it in layout folder or the module,eg 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>

Step 2 in your module.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'
                )
        );
    } 

in src/navigation folder in your module create YourNavigation.php and 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);
            }
        }

in your layout.phtml

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

to create dynamic sitemap from navigation

    $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);

to create breadcrumbs

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

I Hope it helps you to save your time

В общем, я создал свою собственную CMS с тремя слоями, такими как подкатегория category-> подкатегория-> подкатегория. Таким образом, дерево было создано так, и сверху вниз были ссылки. Так же, как я сделал запрос для извлечения данных и сделал цикл для создания структуры навигации. Пример можно найти на brightervisas.com. Напишите мне, если у вас есть вопрос с вашей проблемой, я могу помочь вам с решением
Пожалуйста, объясните, что находится в вашем приложении \ Model \ MenuTable
0

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

ура

1

у. В контроллере отредактируйте действие:

$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
0

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

$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() ?>

    
Кстати, это также не будет работать вообще, так как & quot; альбом & quot; Страница не содержит соответствия маршрута и никогда не будет помечена как активная. Маршрутизатор может быть установлен по умолчанию, маршрут не соответствует. Поэтому я голосую за ваш ответ.
Нет необходимости захватывать приложение, совпадение маршрутов и стек маршрутов доступны в событии контроллера.
2

этот ответ на другой, но похожий вопрос относительно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()?>

Похожие вопросы