forci / menu-builder-bundle
一个简单的、独立的 Menu Builder,用于 Symfony 2 应用程序
Requires
- php: >=7.1.3
- doctrine/orm: ~2.5
- symfony/framework-bundle: ~4.4|~5.0
- twig/twig: ~2.0|~3.0
- wucdbm/quick-ui-bundle: ~0.2
Requires (Dev)
- friendsofphp/php-cs-fixer: ^2.8
- wucdbm/php-cs-fixers: ~0.2
README
一个简单的、独立的 Menu Builder,用于 Symfony 2 应用程序
即将到来 / TODO
- TODO: 引入缓存。
次要 TODO
- 将文档放在此捆绑包内,这是核心,仅针对开发者。客户端捆绑包旨在成为你的基础客户端,如果它不满足你的需求,你可以根据自己的用户体验构建自己的捆绑包。
- TODO: 使用系统路由的静态配置 - 在导入时,始终将这些系统配置为系统路由。
用法
在生产环境中,正确配置 uglifycss 和 uglifyjs 是必需的。
将此捆绑包添加到 AppKernel.php 中 new \Forci\Bundle\MenuBuilder\ForciMenuBuilderBundle()
。将 wucdbm 的 QuickUIBundle 添加到 AppKernel.php 中 new \Wucdbm\Bundle\QuickUIBundle\WucdbmQuickUIBundle()
执行 app/console doctrine:schema:update --dump-sql
,并在验证要执行的内容后,再次使用 --force 执行。或者,使用 DoctrineMigrations捆绑包通过 Doctrine 迁移。
执行 app/console forci_menu_builder:import_routes
以将你的当前路由从 Symfony 应用程序导入到捆绑包创建的表中。
完成此操作后,你可以开始使用此捆绑包。只需在 routing.yml 中注册它,如下所示
wucdbm_builder:
resource: "@ForciMenuBuilderBundle/Resources/config/routing.yml"
prefix: /admin/builder
假设 /admin 被防火墙保护,则构建器应该是安全的,并且对随机人员不可访问。
你可以使用 {{ path('forci_menu_builder_dashboard') }}
创建指向构建器的链接,或者通过 iframe 将其嵌入到你的管理界面中,如下所示 <iframe src="{{ path('forci_menu_builder_dashboard') }}" style="border: 0; width: 100%; height: 100%;"></iframe>
用户界面相当简单,因为这个捆绑包只实现了核心功能和行政(针对开发者)功能。如果你想允许用户(非开发者)操作菜单,请查看 ForciMenuBuilderClientBundle()
。一旦创建了菜单,你可以在应用程序中通过调用 getMenu
twig 函数来访问它,该函数将返回 Forci\Bundle\MenuBuilder\Entity\Menu
或 null
。一个菜单包含 Forci\Bundle\MenuBuilder\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 中
framework:
default_locale: en
在 routing.yml 中
some_resource:
resource: "@SomeBundle/Resources/config/routing.yml"
prefix: /{_locale}
schemes: [https]
requirements:
_locale: "en|de|ru"
defaults:
_locale: %kernel.default_locale%
通常情况下,您不需要使用 defaults: {_locale: %kernel.default_locale%}
部分,因为您已经在框架包配置中配置了默认语言环境,但这只对 _locale
有效。然而,使用这种方法,当导入路由时,_locale
路由参数的默认值将可用给菜单构建器。当构建链接时,如果存在默认参数,您可以选择留该字段为空。这将允许您在以后更改该参数的默认值,而无需更新菜单项。当在应用程序部署过程中更新路由时,该路由参数的默认值也会更新。无论如何,在编辑菜单项时,默认参数的当前值总会被保存,但菜单构建器总会尝试使用该路由参数的当前默认值。如果任何参数的默认值已删除,它将回退到最后一个菜单项保存时的路由默认参数。
不要与如 _locale
之类的 symfony 内部参数混淆,这些参数在当前上下文中可能具有另一个默认值。
例如,一个默认语言环境为 "en" 的网站,但用户正在浏览 "fr" 版本。您希望您的链接始终指向当前语言环境,而不是预先选择的或您网站的默认语言环境。这是一个尚未开发的功能,但它将允许您完全忽略一个参数,如果它已经存在于路由上下文中则不提供它?需要进一步研究。有关更多信息,请参阅 TODOs。