rybakit / navigation-bundle
Symfony应用的导航组件
v0.2.0
2017-12-01 11:39 UTC
Requires
- php: ^7.0
- symfony/framework-bundle: ^3.0|^4.0
- symfony/twig-bundle: ^3.0|^4.0
This package is auto-updated.
Last update: 2024-09-05 18:23:22 UTC
README
安装
推荐通过Composer安装此组件
$ composer require rybakit/navigation-bundle:~1.0@dev
安装包之后,将RybakitNavigationBundle包含到您的内核类中
public function registerBundles() { $bundles = [ ... new Rybakit\Bundle\RybakitNavigationBundle(), ]; ... }
使用示例
要了解如何创建一个作为服务的主菜单并在应用程序的不同部分获取它,请点击链接:https://gist.github.com/rybakit/4491556。
构建导航树
<?php use Rybakit\Bundle\NavigationBundle\Navigation\Item; $root = new Item('root'); $child = new Item('child'); $root->add($child); $parent = $child->getParent(); // $root $has = $root->has($child); // true $root->remove($child);
从数组创建树
<?php use Rybakit\Bundle\NavigationBundle\Navigation\ItemFactory; use Rybakit\Bundle\NavigationBundle\Navigation\Filter\BindFilter; ... $array = [ 'label' => 'root', 'children' => [ ['label' => 'Item 1.1'], ['label' => 'Item 1.2', 'children' => [['label' => 'Item 1.2.1']]], ['label' => 'Item 1.3'], ], ]; $factory = new ItemFactory(new BindFilter()); $root = $factory->create($array);
匹配当前项
// Acme/DemoBundle/Navigation/NavigationBuilder.php <?php namespace Acme\DemoBundle\Navigation; use Rybakit\Bundle\NavigationBundle\Navigation\ItemFactory; use Rybakit\Bundle\NavigationBundle\Navigation\Filter\BindFilter; use Rybakit\Bundle\NavigationBundle\Navigation\Filter\FilterChain; use Rybakit\Bundle\NavigationBundle\Navigation\Filter\MatchFilter; use Rybakit\Bundle\NavigationBundle\Navigation\Filter\Matcher\RoutesMatcher; class NavigationBuilder { ... public function createNavigation() { $request = $this->requestStack->getMasterRequest(); $route = $request->attributes->get('_route'); $routeParams = $this->request->attributes->get('_route_params', []); $filter = new FilterChain([ $matchFilter = new MatchFilter(new RoutesMatcher($route, $routeParams)), new BindFilter(), ]); $factory = new ItemFactory($filter); $root = $factory->create([ 'label' => 'acme_demo.home', 'route' => 'acme_demo_home', 'children' => [ [ 'label' => 'acme_demo.user_new', 'route' => 'acme_demo_user_new', 'routes' => ['acme_demo_user_create'], ], ], ]); if (!$current = $matchFilter->getMatched()) { $current = $root; } $current->setActive(); return ['root' => $root, 'current' => $current]; } }
默认项属性
<?php use Rybakit\Bundle\NavigationBundle\Navigation\Item; use Rybakit\Bundle\NavigationBundle\Navigation\ItemFactory; use Rybakit\Bundle\NavigationBundle\Navigation\Filter\BindFilter; ... $item = new Item(); // set translation domain to "AcmeDemoBundle" by default for all tree items $item->transDomain = 'AcmeDemoBundle'; $factory = new ItemFactory(new BindFilter(), $item); $root = $factory->create($array);
Twig
{# simple render #} {{ nav(nav.root, "my_block_name", { "opt1": "val1", "opt2": "val2" }) }} {# render using tree filter #} {{ nav(nav.root|tree, "nav") }} {# render using tree filter with max depth = 1 #} {{ nav(nav.root|tree(1), "nav") }} {# render only visible items, max depth = 1 #} {{ nav(nav.root|tree(1)|visible, "nav") }} {# render only hidden items #} {{ nav(nav.root|tree|visible(false), "nav") }} {# render breadcrumbs #} {{ nav(nav.current|breadcrumbs, "breadcrumbs") }} {# render breadcrumbs with custom title at the end #} {{ nav(nav.current|breadcrumbs, "breadcrumbs", { "last": "Custom title" }) }} {# get root #} {{ nav.current|ancestor(0) }} {# get second level ancestor #} {{ nav.current|ancestor(2) }} {# get parent #} {{ nav.current|ancestor(-1) }} {# render submenu #} {{ nav(nav.current|ancestor(2)|tree(2)|visible, "navlist") }}
自定义导航模板
# app/config/config.yml rybakit_navigation: template: navigation.html.twig
# app/Resources/views/navigation.html.twig {% extends 'RybakitNavigationBundle::navigation.html.twig' %} # override the "nav" block {% block nav %} <ul class="nav navbar-nav">{{ block('nav_items') }}</ul> {% endblock %}
许可证
RybakitNavigationBundle遵循MIT许可证发布。有关详细信息,请参阅捆绑的LICENSE文件。