mhujer / breadcrumbs-bundle
Symfony 的面包屑组件
Requires
- php: ^8.1
- symfony/framework-bundle: ^5.4|^6.0|^7.0
- symfony/translation-contracts: ^1.1|^2.0|^3.0
- symfony/twig-bundle: ^5.4|^6.0|^7.0
- twig/twig: ^1.38.1|^2.7.1|^3.0
Requires (Dev)
- phpunit/phpunit: 10.5.5
- symfony/browser-kit: ^5.4|^6.0|^7.0
README
这是针对较新 Symfony 版本的 whiteoctober/BreadcrumbsBundle 的分支。请参阅 whiteoctober/BreadcrumbsBundle#106。
安装
-
使用 Composer 安装此组件
composer require mhujer/breadcrumbs-bundle
如果你使用 Symfony Flex,以下步骤将自动执行。
- 通过将组件添加到项目
config/bundles.php
文件中注册的组件列表中,启用组件
// config/bundles.php return [ // ... WhiteOctober\BreadcrumbsBundle\WhiteOctoberBreadcrumbsBundle::class => ['all' => true], ];
-
在
config/packages/white_october_breadcrumbs.yaml
中配置组件# config/packages/white_october_breadcrumbs.yaml white_october_breadcrumbs: ~
这是基本配置的全部内容。对于更多选项,请查看 配置 部分。
用法
在你的应用程序控制器方法中
public function yourAction(User $user) { $breadcrumbs = $this->get("white_october_breadcrumbs"); // Simple example $breadcrumbs->addItem("Home", $this->get("router")->generate("index")); // Example without URL $breadcrumbs->addItem("Some text without link"); // Example with parameter injected into translation "user.profile" $breadcrumbs->addItem($txt, $url, ["%user%" => $user->getName()]); }
最好不通过 get
获取服务。相反,请使用 依赖注入
use WhiteOctober\BreadcrumbsBundle\Model\Breadcrumbs; class YourController extends AbstractController { public function yourAction(Breadcrumbs $breadcrumbs) { // ... } }
然后,在你的模板中
{{ wo_render_breadcrumbs() }}
面包屑集合中的最后一个项目将自动以纯文本形式渲染,而不是 <a>...</a>
标签。
addItem()
方法将项目添加到面包屑集合的 末尾。您可以使用 prependItem()
方法将项目添加到面包屑集合的 开头。当与层次化数据(例如 Doctrine Nested-Set)一起使用时,这非常有用。此示例使用产品目录中的类别
public function yourAction(Category $category) { $breadcrumbs = $this->get("white_october_breadcrumbs"); $node = $category; while ($node) { $breadcrumbs->prependItem($node->getName(), "<category URL>"); $node = $node->getParent(); } }
如果您不想手动生成 URL,您可以通过使用 addRouteItem()
和 prependRouteItem()
方法仅传递路由名称和任何所需的参数来轻松添加面包屑项
public function yourAction() { $breadcrumbs = $this->get("white_october_breadcrumbs"); // Pass "_demo" route name without any parameters $breadcrumbs->addRouteItem("Demo", "_demo"); // Pass "_demo_hello" route name with route parameters $breadcrumbs->addRouteItem("Hello Breadcrumbs", "_demo_hello", [ 'name' => 'Breadcrumbs', ]); // Add "homepage" route link at the start of the breadcrumbs $breadcrumbs->prependRouteItem("Home", "homepage"); }
配置
以下 默认 参数可以在您的 config/packages/white_october_breadcrumbs.yaml
中覆盖
# config/packages/white_october_breadcrumbs.yaml white_october_breadcrumbs: separator: '/' separatorClass: 'separator' listId: 'wo-breadcrumbs' listClass: 'breadcrumb' itemClass: '' linkRel: '' locale: ~ # defaults to null, so the default locale is used translation_domain: ~ # defaults to null, so the default domain is used viewTemplate: '@WhiteOctoberBreadcrumbs/microdata.html.twig'
这些也可以在渲染面包屑时作为参数传递给视图 - 例如
{{ wo_render_breadcrumbs({separator: '>', listId: 'breadcrumbs'}) }}
注意: 如果您需要在同一页面上使用多个面包屑集合,您可以使用命名空间。默认情况下,面包屑使用
default
命名空间,但您可以添加更多。要向您的自定义命名空间添加面包屑,请使用addNamespaceItem
/prependNamespaceItem
或addNamespaceRouteItem
/prependNamespaceRouteItem
方法,例如
public function yourAction(User $user) { $breadcrumbs = $this->get("white_october_breadcrumbs"); // Simple example $breadcrumbs->prependNamespaceItem("subsection", "Home", $this->get("router")->generate("index")); // Example without URL $breadcrumbs->addNamespaceItem("subsection", "Some text without link"); // Example with parameter injected into translation "user.profile" $breadcrumbs->addNamespaceItem("subsection", $txt, $url, ["%user%" => $user->getName()]); // Example with route name with required parameters $breadcrumbs->addNamespaceRouteItem("subsection", $user->getName(), "user_show", ["id" => $user->getId()]); }
然后,为了在模板中渲染 subsection
面包屑,请在选项中指定此命名空间
{{ wo_render_breadcrumbs({namespace: "subsection"}) }}
高级用法
您可以一次添加整个对象数组
$breadcrumbs->addObjectArray(array $objects, $text, $url, $translationParameters);
objects: array of objects
text: name of object property or closure
url: name of URL property or closure
示例
$that = $this; $breadcrumbs->addObjectArray($selectedPath, "name", function($object) use ($that) { return $that->generateUrl('_object_index', ['slug' => $object->getSlug()]); });
您还可以添加树路径
$breadcrumbs->addObjectTree($object, $text, $url = "", $parent = 'parent', array $translationParameters = [], $firstPosition = -1)
object: object to start with
text: name of object property or closure
url: name of URL property or closure
parent: name of parent property or closure
firstPosition: position to start inserting items (-1 = determine automatically)
注意: 您可以使用
addNamespaceObjectArray
和addNamespaceObjectTree
分别处理同一页面上多个面包屑。
覆盖模板
有三种方法可以做到这一点。
-
您可以通过复制
Resources/views/microdata.html.twig
文件并将其放置到<your-project>/templates/bundles/WhiteOctoberBreadcrumbsBundle
中来覆盖组件使用的模板,然后根据需要进行自定义。有关更多信息,请参阅 覆盖组件模板 文档部分。 -
使用
viewTemplate
配置参数{{ wo_render_breadcrumbs({ viewTemplate: "@WhiteOctoberBreadcrumbs/yourBreadcrumbs.html.twig" }) }}
注意:如果您想使用 JSON-LD 格式,已存在一个模板在
@WhiteOctoberBreadcrumbs/json-ld.html.twig
。只需将此模板设置为viewTemplate
的值,无论是在您的 Twig 函数调用中(参见上面的步骤 2)还是在您的包 配置 中。
贡献
我们欢迎对这个项目做出贡献,包括拉取请求、问题和(对现有问题的讨论)。
如果您想贡献代码但不确定从哪里开始,可以查看 问题列表。如果您是首次作为代码贡献者,GitHub 的关于 项目分叉 的指南可能会有所帮助。
所有贡献者(无论是贡献代码、参与问题讨论还是以其他方式参与)都必须遵守我们的 行为准则。