You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.22 16:39:45