tomole
tomole

Reputation: 1006

Access translator in Shopware 6 Plugin

I am developing my first Shopware 6 plugin and was wondering how to access snippets in the Plugin class. I checked the Developer Guide but could not make it work.
I want to use the plugin translation as label in customField select options.

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',
                                    // Access my_custom_field_option_1 of snippet myfirstplugin.en-GB.json 
                                    'label' => 'my_custom_field_option_1', 
                                ],
                                [
                                    'value' => '1ce5abe719a04346930c7e43514ed4f1',
                                    // Access my_custom_field_option_2 of snippet myfirstplugin.en-GB.json 
                                    'label' => 'my_custom_field_option_2',
                                ],
                            ],
                            'customFieldType' => 'select',
                            'componentName' => 'sw-single-select',
                            'customFieldPosition' => 1,
                        ],
                    ],
                ]
            ],
        ], $context);
    }

}

Upvotes: 2

Views: 1127

Answers (3)

Carsten Harnisch
Carsten Harnisch

Reputation: 56

You can inject an argument of type Translator to your service

in services.xml

<argument type="service" id="translator"/>

in your service

use Shopware\Core\Framework\Adapter\Translation\Translator;

/**
 * @var Translator
 */
private $translator;
public function __construct($translator)
{
    $this->translator = $translator;
}

then down the way you can use this pretty much the same as in a twig template:

$translated = $this->translator
    ->trans(
         'myfirstplugin.product.detail.294865e5c81b434d8349db9ea6b4e487');

Upvotes: 2

dneustadt
dneustadt

Reputation: 13211

When you create the custom field you don't have to reference a translation snippet. Instead you can just provide the translations in the payload directly.

'config' => [
    'label' => ['en-GB' => 'Label english', 'de-DE' => 'Label german'],
    'type' => CustomFieldTypes::SELECT,
    'options' => [
        [
            'value' => '294865e5c81b434d8349db9ea6b4e487',
            'label' => ['en-GB' => 'Option english', 'de-DE' => 'Option german'], 
        ],
        [
            'value' => '1ce5abe719a04346930c7e43514ed4f1',
            'label' => ['en-GB' => 'Option english', 'de-DE' => 'Option german'], 
        ],
    ],
],

Upvotes: 0

Stone Vo
Stone Vo

Reputation: 119

I think you can use the snippet repository and search the label as you want in the Plugin class like

$sRepo = $this->container->get('snippet.repository');
$labels = $sRepo->search((new Criteria())
        ->addFilter(
            new MultiFilter(
                MultiFilter::CONNECTION_OR,
                [
                    new ContainsFilter('translationKey', 'my_custom_field_option_1'),
                    new ContainsFilter('translationKey', 'my_custom_field_option_2')
                ]
            )
        ), $context)->getElements();

Upvotes: 0

Related Questions