trunda / smf-menu
将KnpMenu集成到Nette框架中
dev-master / 1.0.x-dev
2018-05-29 06:20 UTC
Requires
- php: >= 5.3.0
- knplabs/knp-menu: 2.0.*
- nette/nette: 2.*
Requires (Dev)
- nette/tester: @dev
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的作者。