注册View-Helper理解问题

问题描述 投票:0回答:1

我尝试注册一个View Helper进行导航,这是olegkrivtsov的一个例子,我选择这个来了解更多关于这个主题的内容。我也阅读了有关它的帖子。我认为它一定很容易,但它不起作用,可能一些更有经验的Zend开发人员会立即看到问题。

首先我使用的文件夹,这是正确的文件夹,例如,模块导入中的文件夹助手有什么区别?

where I have placed the class

这是menu.php的内容

    <?php
namespace Application\View\Helper;

use Zend\View\Helper\AbstractHelper;

// This view helper class displays a menu bar.
class Menu extends AbstractHelper
{
    // Menu items array.
    protected $items = [];

// Active item's ID.
protected $activeItemId = '';

// Constructor.
public function __construct($items=[])
{
    $this->items = $items;
}

// Sets menu items.
public function setItems($items)
{
    $this->items = $items;
}

// Sets ID of the active items.
public function setActiveItemId($activeItemId)
{
    $this->activeItemId = $activeItemId;
}

// Renders the menu.
public function render()
{
    if (count($this->items)==0)
        return ''; // Do nothing if there are no items.

        $result = '<nav class="navbar navbar-default" role="navigation">';
        $result .= '<div class="navbar-header">';
        $result .= '<button type="button" class="navbar-toggle" ';
        $result .= 'data-toggle="collapse" data-target=".navbar-ex1-collapse">';
        $result .= '<span class="sr-only">Toggle navigation</span>';
        $result .= '<span class="icon-bar"></span>';
        $result .= '<span class="icon-bar"></span>';
        $result .= '<span class="icon-bar"></span>';
        $result .= '</button>';
        $result .= '</div>';

        $result .= '<div class="collapse navbar-collapse navbar-ex1-collapse">';
        $result .= '<ul class="nav navbar-nav">';

        // Render items
        foreach ($this->items as $item) {
            $result .= $this->renderItem($item);
        }

        $result .= '</ul>';
        $result .= '</div>';
        $result .= '</nav>';

        return $result;
}

// Renders an item.
protected function renderItem($item)
{
    $id = isset($item['id']) ? $item['id'] : '';
    $isActive = ($id==$this->activeItemId);
    $label = isset($item['label']) ? $item['label'] : '';

    $result = '';

    if(isset($item['dropdown'])) {

        $dropdownItems = $item['dropdown'];

        $result .= '<li class="dropdown ' . ($isActive?'active':'') . '">';
        $result .= '<a href="#" class="dropdown-toggle" data-toggle="dropdown">';
        $result .= $label . ' <b class="caret"></b>';
        $result .= '</a>';

        $result .= '<ul class="dropdown-menu">';

        foreach ($dropdownItems as $item) {
            $link = isset($item['link']) ? $item['link'] : '#';
            $label = isset($item['label']) ? $item['label'] : '';

            $result .= '<li>';
            $result .= '<a href="'.$link.'">'.$label.'</a>';
            $result .= '</li>';
        }

        $result .= '</ul>';
        $result .= '</a>';
        $result .= '</li>';

    } else {
        $link = isset($item['link']) ? $item['link'] : '#';

        $result .= $isActive?'<li class="active">':'<li>';
        $result .= '<a href="'.$link.'">'.$label.'</a>';
        $result .= '</li>';
    }

    return $result;
}

}

我为那些也想使用它的人发布了这个漏洞示例。

我在这里尝试在module.config.php中注册

  'view_helpers' => [
    'factories' => [
        View\Helper\Menu::class => InvokableFactory::class,
    ],
    'aliases' => [
        'mainMenu' => View\Helper\Menu::class
    ]
], 

我把它放在layout.phtml中

<div class="collapse navbar-collapse">
                <?php      
                  $this->mainMenu()->setItems([
                    [
                      'id' => 'home',
                      'label' => 'Dashboard',
                      'link' => $this->url('home')
                    ],
                    [
                      'id' => 'project',
                      'label' => 'Project',
                      'link' => $this->url("project", ['action'=>'index'])
                    ],
                    [
                      'id' => 'unit',
                      'label' => 'Unit',
                      'dropdown' => [
                        [
                          'id' => 'add',
                          'label' => 'add Unit',
                         // 'link' => $this->url('unit', ['page'=>'contents'])
                            'link' => $this->url('unit', ['action'=>'add'])
                        ],
                        [
                          'id' => 'help',
                          'label' => 'Help',
                          'link' => $this->url('home')
                        ]
                      ]                        
                    ],

                  ]);

                  echo $this->mainMenu()->render(); 
                ?>
            </div>

使用此代码,我替换了以前来自骨架的部分:

 <div class="collapse navbar-collapse">
                <?= $this->navigation('navigation')
                ->menu()
                ->setMinDepth(0)
                ->setMaxDepth(0)
                ->setUlClass('nav navbar-nav') ?>

我通过浏览器收到此错误消息:

致命错误:未捕获错误:在C:\ wamp64 \ www \ xyz \ vendor \ zendframework \ zend-servicemanager \ src \ Factory \ InvokableFactory.php中找不到类'Application \ view \ helper \ Menu'

我真的很想理解这一点,因为它可能在将来真的有用,所以任何建议都值得赞赏。

zend-framework zend-framework3 zend-view
1个回答
1
投票

将文件Menu.php移动到Application / src / Application / View / Helper文件夹

© www.soinside.com 2019 - 2024. All rights reserved.