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服务实现,步骤如下:
获取Translator服务
在自定义字段创建方法中,从容器获取translator服务,用于解析snippet内容。使用trans方法获取翻译值
调用translator的trans方法,传入完整的snippet键(包含插件命名空间)、参数、snippet域(即插件名)和目标语言ID。为多语言设置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
相关产品推荐
相关产品推荐

