forci/menu-builder-bundle

一个简单的、独立的 Menu Builder,用于 Symfony 2 应用程序

安装数: 5,622

依赖关系: 2

建议者: 0

安全性: 0

星标: 0

关注者: 3

分支: 0

开放性问题: 0

类型:symfony-bundle

v0.5.1 2020-01-19 03:09 UTC

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\Menunull。一个菜单包含 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。