Config | Computed default

Moin,

ich benötige einen Hash im Plugin Formular. Dieser muss bei Installation generiert werden.
Eigentlich gar nicht so kompliziert. In der Plugin Base Class mittels install(…) Methode den Config Value des Input manipulieren.

Mein Ansatz funktioniert, fühlt sich aber total falsch und fehleranfällig an. Was wenn sich das Interface ändert etc.

container->get(Connection::class);
        $configRepository = $this->container->get('system_config.repository');
        $systemConfigService = new SystemConfigService($connection, $configRepository);

        $hash = md5((string)time());
        $systemConfigService->set('NordischMyPlugin.config.myHash', $hash);
    }
}

Ich würde ja gerne über den Container auf den Service zugreifen, dieser ist aber private und somit nicht erreichbar. Ich kann ihn zwar in einem eigenen Service über die service.xml reinreichen aber ich wüsste nicht, wie ich das in der Plugin Base Class erreichen könnte. 

$this->container->get(Shopware\Core\System\SystemConfig\SystemConfigService::class);

Irgendweile Vorschläge ? :slight_smile:

@Nordisch‍

Ich danke dir erstmal für diesen schönen Lösungsansatz, da ich schon am überlegen war, wie ich bei einer Plugin-Installation am besten Default-Werte für meine Config setze :wink:

Bei CustomFields ist es genau so ein “gefruckel” also würde mal deine Lösung als legit betrachten :stuck_out_tongue:

Ich habe auch in einem meiner Plugins einen md5() Hash erstellt und der Code Review von Shopware hat da wohl ein Problem mit… Alternative hier wäre Uuid() zu nutzen 

1 Like

Danke für dein Feedback @Moorleiche‍.

Super Tipp mit der Code Review. Wüsste zwar nicht warum die Funktion nicht gewünscht ist, hatte meine Implementierung aber auch schon auf die Uuid::randomHex() angepasst. Wenn sich die Shopware Entwickler da so viel Mühe machen, dann sollte man das auch nutzen :slight_smile:

@Moorleiche‍ die MD5 Warnung wird noch ausgebaut.

@Nordisch‍ leg es direkt via Repository an. Der Konstruktor wird nicht als “Public API” angesehn, und kann deshalb je releases abweichen, dann würde dein Code brechen :). 

1 Like

Hey @Shyim‍,

ich habe versucht es etwas generischer zu gestalten, damit man das vielleicht wiederverwenden kann:

    public function install(InstallContext $context): void
    {
        parent::install($context);

        $this->setDefaultConfigValue(
            'MeinPlugin.config.myField',
            Uuid::randomHex(),
            true
        );
    }

    private function setDefaultConfigValue($key, $value, $renew = false): void
    {
        $data = [
            'configurationKey' => $key,
            'configurationValue' => $value
        ];

        $defaultContext = Context::createDefaultContext();

        /** @var EntityRepository $repository */
        $repository = $this->container->get('system_config.repository');

        $criteria = new Criteria();
        $criteria->addFilter(
            new EqualsFilter('configurationKey', $key)
        );

        $config = $repository->search($criteria, $defaultContext);
        if ($config->getTotal() === 0) {
            $repository->create([$data], $defaultContext);
            return;
        }

        if ($config->getTotal() > 0 && $renew === true) {
            $data['id'] = $config->first()->getId();
            $repository->update([$data], $defaultContext);
        }
    }

 

Hallo,

so setzen wir z.B. in unserem PayPal Plugin die Default Config: SwagPayPal/InstallUninstall.php at master · shopwareLabs/SwagPayPal · GitHub

Viele Grüße aus Schöppingen

cool Michael Telgmann

[@Michael Telgmann](http://forum.shopware.com/profile/17553/Michael Telgmann „Michael Telgmann“)‍

Rocket Science

Wie wäre es, wenn man die Default Config auch über die config.xml anlegt? oO

Hallo,

Dafür gibt es bereits ein Ticket  Wink Shopware Issuetracker

Viele Grüße aus Schöppingen

cool Michael Telgmann