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

Shopware 6插件开发:如何在Plugin类中访问Snippet?

在Shopware 6插件的Plugin类中访问Snippet并用于自定义字段选项

问题背景

开发首个Shopware 6插件时,需要将插件的翻译内容(Snippet)作为自定义字段下拉选择框选项的label使用,但查阅官方文档后未能实现。现有snippet文件和自定义字段创建代码如下:

myfirstplugin.en-GB.json(路径:插件目录/Resources/snippet/en-GB/myfirstplugin.en-GB.json)

{
    "myfirstplugin": {
        "my_custom_field_option_1": "Option 1",
        "my_custom_field_option_2": "Option 2"
    }
}

原MyFirstPlugin.php片段

class MyFirstPlugin extends Plugin
{
    // ....

    private function createCustomFields(Context $context): void
    {
        if ($this->customFieldSetExists($context)) {
            return;
        }

        $customFieldSetRepository = $this->container->get('custom_field_set.repository');
        $customFieldSetRepository->create([
            [
                'id' => '294865e5c81b434d8349db9ea6b4e135',
                'name' => 'my_custom_field_set',
                'customFields' => [
                    [
                        'name' => 'my_custom_field',
                        'type' => CustomFieldTypes::SELECT,
                        'config' => [
                            'label' => [ 'en-GB' => 'My custom field'],
                            'options' => [
                                [
                                    'value' => '294865e5c81b434d8349db9ea6b4e487',
                                    // 需要访问snippet中的my_custom_field_option_1
                                    'label' => 'my_custom_field_option_1', 
                                ],
                                [
                                    'value' => '1ce5abe719a04346930c7e43514ed4f1',
                                    // 需要访问snippet中的my_custom_field_option_2
                                    'label' => 'my_custom_field_option_2',
                                ],
                            ],
                            'customFieldType' => 'select',
                            'componentName' => 'sw-single-select',
                            'customFieldPosition' => 1,
                        ],
                    ],
                ]
            ],
        ], $context);
    }
}

解决方案

要在Plugin类中正确获取Snippet,需通过Shopware的Translator服务实现,步骤如下:

  1. 获取Translator服务
    在自定义字段创建方法中,从容器获取translator服务,用于解析snippet内容。

  2. 使用trans方法获取翻译值
    调用translator的trans方法,传入完整的snippet键(包含插件命名空间)、参数、snippet域(即插件名)和目标语言ID。

  3. 为多语言设置label数组(可选)
    如果插件支持多语言,可以为不同语言分别获取对应的翻译值,组装成多语言label数组。

修改后的代码示例

use Symfony\Component\Translation\TranslatorInterface;

class MyFirstPlugin extends Plugin
{
    // ....

    private function createCustomFields(Context $context): void
    {
        if ($this->customFieldSetExists($context)) {
            return;
        }

        // 获取Translator服务
        /** @var TranslatorInterface $translator */
        $translator = $this->container->get('translator');
        $currentLangId = $context->getLanguageId();

        $customFieldSetRepository = $this->container->get('custom_field_set.repository');
        $customFieldSetRepository->create([
            [
                'id' => '294865e5c81b434d8349db9ea6b4e135',
                'name' => 'my_custom_field_set',
                'customFields' => [
                    [
                        'name' => 'my_custom_field',
                        'type' => CustomFieldTypes::SELECT,
                        'config' => [
                            // 也可以用snippet设置自定义字段的label
                            'label' => [
                                'en-GB' => $translator->trans('myfirstplugin.my_custom_field_label', [], 'myfirstplugin', 'en-GB'),
                                'de-DE' => $translator->trans('myfirstplugin.my_custom_field_label', [], 'myfirstplugin', 'de-DE')
                            ],
                            'options' => [
                                [
                                    'value' => '294865e5c81b434d8349db9ea6b4e487',
                                    // 根据当前上下文语言获取snippet值
                                    'label' => $translator->trans('myfirstplugin.my_custom_field_option_1', [], 'myfirstplugin', $currentLangId),
                                    // 如果要支持多语言,可设置数组形式
                                    // 'label' => [
                                    //     'en-GB' => $translator->trans('myfirstplugin.my_custom_field_option_1', [], 'myfirstplugin', 'en-GB'),
                                    //     'de-DE' => $translator->trans('myfirstplugin.my_custom_field_option_1', [], 'myfirstplugin', 'de-DE')
                                    // ]
                                ],
                                [
                                    'value' => '1ce5abe719a04346930c7e43514ed4f1',
                                    'label' => $translator->trans('myfirstplugin.my_custom_field_option_2', [], 'myfirstplugin', $currentLangId),
                                ],
                            ],
                            'customFieldType' => 'select',
                            'componentName' => 'sw-single-select',
                            'customFieldPosition' => 1,
                        ],
                    ],
                ]
            ],
        ], $context);
    }
}

关键注意事项

  • Snippet文件路径:确保snippet文件放在插件的Resources/snippet/[语言代码]/目录下,比如en-GB语言的文件路径为src/Resources/snippet/en-GB/myfirstplugin.en-GB.json,Shopware会自动加载这些文件。
  • 完整Snippet键:调用trans方法时,必须使用完整的键名,格式为[插件命名空间].[snippet键],比如myfirstplugin.my_custom_field_option_1。
  • 多语言支持:如果需要为不同语言设置不同的label,直接将label设为包含语言代码和对应翻译值的数组即可,Translator会根据语言ID解析对应的值。

内容的提问来源于stack exchange,提问作者tomole

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.10 12:05:22