trunda/smf-menu

将KnpMenu集成到Nette框架中

安装次数: 9,625

依赖项: 0

建议者: 0

安全性: 0

星标: 4

关注者: 5

分支: 3

开放问题: 1

类型:nette-addon

dev-master / 1.0.x-dev 2018-05-29 06:20 UTC

This package is not auto-updated.

Last update: 2024-09-14 14:31:43 UTC


README

SmfMenu只是KnpMenu的集成库。

安装

安装此扩展最简单的方法是通过composer

composer install trunda/smf-menu

然后在您的config.neon中注册该扩展

extensions:
    - Smf\Menu\Config\Extension

什么是KnpMenu?

KnpMenu库为PHP 5.3提供了面向对象的菜单,具有以下API。

<?php

use Knp\Menu\MenuFactory;
use Knp\Menu\Renderer\ListRenderer;

$factory = new MenuFactory();
$menu = $factory->createItem('My menu');
$menu->addChild('Home', array('uri' => '/'));
$menu->addChild('Comments', array('uri' => '#comments'));
$menu->addChild('Symfony2', array('uri' => 'http://symfony-reloaded.org/'));
$menu->addChild('Coming soon');

$renderer = new ListRenderer();
echo $renderer->render($menu);

上述菜单将渲染以下HTML

<ul>
  <li class="first">
    <a href="/">Home</a>
  </li>
  <li class="current">
    <a href="#comments">Comments</a>
  </li>
  <li>
    <a href="http://symfony-reloaded.org/">Symfony2</a>
  </li>
  <li class="last">
    <span>Coming soon</span>
  </li>
</ul>

这样,您最终可以避免编写丑陋的模板来显示选定的项、第一个和最后一个项、子菜单等。

用法

扩展添加了菜单控制的工厂,因此可以在presenter中使用,如下所示

abstract class BasePresenter extends Presenter
{
    /** @var Menu\Control\Factory */
    private $menuFactory;

    public function injectMenuFactory(Menu\Control\Factory $factory)
    {
        $this->menuFactory = $factory;
    }

    protected function createComponentMenu()
    {
        $menu = $this->menuFactory->createControl();
        $root = $menu->getRoot();

        $root->addChild('catalog', array(
           'label' => 'Katalog',
           'icon'  => 'book'
        ));

        $root['catalog']->addChild('categories', array(
            'label' => 'Categories',
            'link'  => 'Category:list',
            'icon'  => 'table',
        ));

        $root['catalog']->addChild('new', array(
            'label' => 'Product',
            'link'  => 'Product:list',
            'icon'  => 'gift',
        ));
         
        // ....

        return $menu;
    }
    // ...
}

然后在您的模板中,您可以使用必需的control

{control menu}

渲染器

您可以注册任意多的渲染器。一些默认渲染器已默认注册

list          => Smf\Menu\Renderer\ListRenderer
bootstrapNav  => Smf\Menu\Renderer\BootstrapNavRenderer

您可以在模板中使用它们

{control menu:list}
{control menu:bootstrapNav}

新渲染器的注册与在配置中添加带有menuRenderer标签的新服务一样简单

services:
    myRenderer: 
         class: My\Super\Renderer
         tags: 
             menuRenderer: mySuperRenderer

然后您可以使用它

{control menu:mySuperRenderer}

致谢

致谢归功于KnpMenu库的原始作者以及KnpMenuBundle的作者。