wucdbm / menu-builder-bundle
一个简单的、独立的 Symfony 2 应用菜单构建器
Requires
- php: ~5.5|~7.0
- symfony/symfony: ~3.0
- wucdbm/wucdbm-bundle: ~3.1
README
一个简单的、独立的 Symfony 2 应用菜单构建器
即将到来 / TODO
- TODO: 引入缓存。使用 WucdbmBundle 或 Symfony 的缓存组件,如果它最终有原生的 Memcached 实现。
次要 TODO
- 将文档放在此包内,这是核心,仅面向开发者。客户端版本旨在作为你的基础客户端,如果它不能满足你的需求,你可以使用自己的用户体验来构建自己的客户端。
- TODO: 静态配置与系统路由 - 导入时,始终将这些全部设置为系统路由
用法
正确配置 uglifycss 和 uglifyjs 是生产环境的必要条件。
将此包添加到你的 AppKernel.php new \Wucdbm\Bundle\MenuBuilderBundle\WucdbmMenuBuilderBundle()
在你的 config.yml 中,将 WucdbmMenuBuilderBundle
添加到你的 assetic bundles,以及你的 doctrine 映射(如果非自动)
执行 app/console doctrine:schema:update --dump-sql
,然后在验证要执行的内容后,再次使用 --force 执行。或者,使用 DoctrineMigrationsBundle 的 doctrine 迁移。
执行 app/console wucdbm_menu_builder:import_routes
以将你的当前路由从你的 symfony 应用导入到由包创建的表中。
或者,将 Wucdbm\\Bundle\\MenuBuilderBundle\\Composer\\ScriptHandler::importRoutes
添加到你的 composer.json 的 post-install-cmd
或 post-update-cmd
命令列表中,这样每次安装或更新后都会执行。
完成这些后,你就可以开始使用此包了。只需在路由.yml 中注册它即可,如下所示
wucdbm_builder:
resource: "@WucdbmMenuBuilderBundle/Resources/config/routing.yml"
prefix: /admin/builder
假设 /admin 由防火墙保护,构建器应该是安全的,并对随机人员不可访问。
你可以使用 {{ path('wucdbm_menu_builder_dashboard') }}
创建到构建器的链接,或者像这样通过 iframe 将其嵌入到你的 admin UI 中 <iframe src="{{ path('wucdbm_menu_builder_dashboard') }}" style="border: 0; width: 100%; height: 100%;"></iframe>
用户界面相当简单,因为这个包只实现了核心功能和管理(面向开发者)功能。如果你想允许用户(非开发者)操作菜单,请查看 WucdbmMenuBuilderClientBundle()
。创建菜单后,你可以通过调用 getMenu
twig 函数来在应用中访问它,该函数将返回 Wucdbm\Bundle\MenuBuilderBundle\Entity\Menu
或 null
。一个菜单包含 Wucdbm\Bundle\MenuBuilderBundle\Entity\MenuItem
。菜单项可以嵌套,即它们有父项和子项。列出顶级菜单的好方法是只列出父项为 null 的项目。
{# New: You can use the menuTopLevelItems filter to get all top-level items: #}
{% for item in getMenu(1)|menuTopLevelItems %}
{% if getMenu(1) %} {# You could also use any constant with the constant() function or any other way of referencing the menu ID #}
{% for item in getMenu(1).items if item.parent is null %}
{# You can recursively include your templates to list the sub-menus #}
{% include '@Some/location/template.html.twig' with {items: item.children} %}
{% endfor %}
{% endif %}
{% if getMenu(1) %}
{% for item in getMenu(1).items if item.parent is null %}
<li>
<a href="{{ path('admin_menu_view', {menuId: item.menu.id, itemId: item.id}) }}">
{{ item.name }}
</a>
</li>
{% endfor %}
{% endif %}
打印菜单链接是通过 menuItemPath
twig 过滤器/函数完成的,如下所示
<a href="{{ item|menuItemPath }}">
{{ item.name }}
</a>
或对于绝对链接
<a href="{{ item|menuItemUrl }}">
{{ item.name }}
</a>
你还可以为 menuItemUrl
的第二个(可选)参数使用,并设置地址类型(Symfony\Component\Routing\Generator\UrlGeneratorInterface
常量之一)
动态默认参数
如果你想为你的某些路由设置动态默认参数,例如具有动态区域的路由
在 config.yml 中
parameters:
locale: en
framework:
default_locale: %locale%
在 routing.yml 中
some_resource:
resource: "@SomeBundle/Resources/config/routing.yml"
prefix: /{_locale}
schemes: [https]
requirements:
_locale: "en|de|ru"
defaults:
_locale: %locale%
通常情况下,您不需要defaults: {_locale: %locale%}
这部分,因为您已经在框架包配置中设置了默认的区域设置,但这只适用于_locale
。然而,采用这种方法,_locale
路由参数的默认值将在导入路由时对菜单构建器可用。在构建链接时,如果存在默认参数,您可以选择留空字段。这将允许您在稍后更改该参数的默认值,而无需更新菜单项。当您的应用程序部署期间更新路由时,该路由参数的默认值也会更新。无论如何,在编辑菜单项时,默认参数的当前值总会被保存,但菜单构建器总是会尝试使用该路由参数的当前默认值。如果任何参数的默认值已被移除,它将回退到最后一个菜单项保存时的路由默认参数。
不要与symfony内部参数如_locale
混淆,这些参数在当前上下文中可能有另一个默认值。
一个例子是一个默认语言为“en”的网站,但用户正在浏览“fr”版本。您希望您的链接始终指向当前的语言,而不是预先选择的一个或您网站的默认值。这是一个尚未开发的功能,但这将允许您完全忽略一个参数,并且如果它已在路由上下文中存在,则不提供它。待研究。有关更多信息,请参阅TODO。