Shopware 6 自定义产品标签功能开发技术问询
Shopware 6 高级标签功能开发实战解答
1. 配置自定义路由实现 /tag/{slug} 格式URL
要替代UUID实现友好的slug路由,按以下步骤操作:
- 定义前端路由:在插件的
src/Resources/config/routes/frontend.xml中配置路由,使用{slug}作为路径参数:
<?xml version="1.0" encoding="UTF-8" ?> <routes xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="https://raw.githubusercontent.com/shopware/platform/trunk/src/Core/Framework/Routing/Resources/schema/routes.xsd"> <route id="frontend.product.tag.list" path="/tag/{slug}" methods="GET"> <default key="_controller">YourPluginName\Controller\Frontend\ProductTagController::listAction</default> </route> </routes>
- 为实体添加slug字段:在自定义
ProductTag实体中新增slug字段,确保字段唯一,可通过DataPersister或EntityWrittenEvent事件自动生成slug:
// src/Entity/ProductTagEntity.php use Shopware\Core\Framework\DataAbstractionLayer\Entity; use Shopware\Core\Framework\DataAbstractionLayer\EntityIdTrait; class ProductTagEntity extends Entity { use EntityIdTrait; protected string $slug; public function getSlug(): string { return $this->slug; } public function setSlug(string $slug): void { $this->slug = $slug; } }
- 控制器通过slug查询实体:在
ProductTagController的列表方法中,根据slug查询标签实体,再关联获取对应产品列表:
public function listAction(Request $request, ProductTagRepository $tagRepository, ProductRepository $productRepository): Response { $slug = $request->get('slug'); $tag = $tagRepository->search(new Criteria([], ['slug' => $slug]), $request->attributes->get('context'))->first(); if (!$tag) { throw new NotFoundHttpException('标签不存在'); } $products = $productRepository->search(new Criteria(), $request->attributes->get('context')); return $this->render('@YourPluginName/storefront/page/tag/list.html.twig', [ 'tag' => $tag, 'products' => $products ]); }
2. 搭建标签后台管理模块
后台管理模块需覆盖核心功能,同时配套必要的配置项:
核心内容
- 后台菜单配置:在
src/Resources/config/admin/menu.xml中添加标签管理入口,挂载到产品菜单下:
<?xml version="1.0" encoding="UTF-8" ?> <menu xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="https://raw.githubusercontent.com/shopware/platform/trunk/src/Administration/Resources/config/menu.xsd"> <item> <name>product-tag</name> <label>产品标签</label> <parent>sw-product</parent> <link>sw.product.tag.list</link> <icon>default-icon-tag</icon> <privilege>product_tag.view</privilege> </item> </menu>
- 数据网格定义:在
src/Resources/config/admin/datagrid.xml中配置标签列表的列、筛选器和排序规则:
<?xml version="1.0" encoding="UTF-8" ?> <datagrids xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="https://raw.githubusercontent.com/shopware/platform/trunk/src/Administration/Resources/config/datagrid.xsd"> <datagrid name="sw-product-tag-list"> <columns> <column name="name" position="10"> <label>标签名称</label> <sorting>name</sorting> </column> <column name="slug" position="20"> <label>URL别名</label> <sorting>slug</sorting> </column> <column name="createdAt" position="30"> <label>创建时间</label> <sorting>createdAt</sorting> </column> </columns> <filters> <filter name="name" type="text"> <label>标签名称</label> </filter> </filters> </datagrid>
- CRUD控制器:继承
AbstractCrudController快速实现标签的增删改查:
// src/Controller/Admin/ProductTagController.php use Shopware\Core\Framework\Routing\Annotation\RouteScope; use Shopware\Core\Framework\Routing\Annotation\Admin; use Shopware\Administration\Controller\AbstractCrudController; /** * @RouteScope(scopes={"admin"}) */ class ProductTagController extends AbstractCrudController { protected string $repositoryClass = ProductTagRepository::class; protected string $entityName = 'product_tag'; /** * @Admin(path="/api/product-tag", name="api.product_tag.list", methods={"GET"}) */ public function listAction(Request $request): Response { return parent::listAction($request); } }
- 表单配置:在
src/Resources/config/admin/form.xml中定义标签的创建/编辑表单,包含基础字段和SEO字段:
<?xml version="1.0" encoding="UTF-8" ?> <form xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="https://raw.githubusercontent.com/shopware/platform/trunk/src/Administration/Resources/config/form.xsd"> <component name="sw-product-tag-detail"> <name>product_tag</name> <label>产品标签</label> <tabs> <tab name="general" label="基础设置"> <component name="sw-field" type="text" label="URL别名" property="slug"> <validation> <rule name="required"/> <rule name="unique" entity="product_tag" field="slug"/> </validation> </component> </tab> <tab name="seo" label="SEO设置"> <component name="sw-field" type="text" label="SEO标题" property="seoTitle" translatable="true"/> <component name="sw-field" type="textarea" label="SEO描述" property="seoDescription" translatable="true"/> </tab> </tabs> </component> </form>
额外需要创建的部分
- 权限配置:在
src/Resources/config/admin/permissions.xml中定义标签管理的权限组,控制后台用户的访问权限:
<?xml version="1.0" encoding="UTF-8" ?> <permissions xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="https://raw.githubusercontent.com/shopware/platform/trunk/src/Administration/Resources/config/permissions.xsd"> <permission> <name>product_tag</name> <label>产品标签</label> <children> <permission> <name>view</name> <label>查看</label> </permission> <permission> <name>edit</name> <label>编辑</label> </permission> <permission> <name>create</name> <label>创建</label> </permission> <permission> <name>delete</name> <label>删除</label> </permission> </children> </permission> </permissions>
- 实体关联配置:建立
ProductTag与Product的多对多关联,方便在产品编辑页快速关联标签。
3. 实现标签名称的多语言翻译
基于Shopware 6的实体翻译机制,按以下步骤实现:
- 创建翻译实体:新增
ProductTagTranslationEntity,存放需要多语言翻译的字段:
// src/Entity/ProductTagTranslationEntity.php use Shopware\Core\Framework\DataAbstractionLayer\TranslationEntity; use Shopware\Core\Framework\DataAbstractionLayer\EntityIdTrait; class ProductTagTranslationEntity extends TranslationEntity { use EntityIdTrait; protected string $productTagId; protected string $name; protected ?string $seoTitle = null; protected ?string $seoDescription = null; protected ?ProductTagEntity $productTag = null; // 对应字段的getter和setter方法 }
- 配置实体翻译关联:在
ProductTagEntity中添加翻译集合,并在实体定义xml中配置关联:
// src/Entity/ProductTagEntity.php protected ?ProductTagTranslationCollection $translations = null; public function getTranslations(): ?ProductTagTranslationCollection { return $this->translations; } public function setTranslations(?ProductTagTranslationCollection $translations): void { $this->translations = $translations; }
在src/Resources/config/product_tag.entity.xml中添加翻译配置:
<?xml version="1.0" encoding="UTF-8" ?> <entity xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="https://raw.githubusercontent.com/shopware/platform/trunk/src/Core/Framework/DataAbstractionLayer/Resources/schema/entity.xsd"> <name>product_tag</name> <table>product_tag</table> <translations> <translation entity="product_tag_translation"/> </translations> <fields> <string name="slug" nullable="false" unique="true"/> </fields> </entity>
- 后台表单启用多语言编辑:在
form.xml中将需要翻译的字段设置为translatable="true",后台会自动显示语言切换控件:
<component name="sw-field" type="text" label="标签名称" property="name" translatable="true"> <validation> <rule name="required"/> </validation> </component>
- 前端模板获取翻译内容:在店铺前端通过
translated属性获取当前语言的翻译值:
<h1>{{ tag.translated.name }}</h1> <meta name="description" content="{{ tag.translated.seoDescription }}">
内容的提问来源于stack exchange,提问作者Niyabi
相关产品推荐
相关产品推荐

