NordischNordisch MemberComments: 7 Received thanks: 1 Member since: August 2015

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.

<?php declare(strict_types=1);

namespace Nordisch\MyPlugin;

use Doctrine\DBAL\Connection;
use Shopware\Core\Framework\Plugin;
use Shopware\Core\Framework\Plugin\Context\InstallContext;
use Shopware\Core\System\SystemConfig\SystemConfigService;

class NordischMyPlugin extends Plugin
{
    public function install(InstallContext $context): void
    {
        $connection = $this->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 ? :)

Thanked by 1Moorleiche

Answers

  • MoorleicheMoorleiche MemberComments: 35 Received thanks: 2 Member since: August 3

    @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 ;)

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

    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 

    Thanked by 1Nordisch
  • NordischNordisch MemberComments: 7 Received thanks: 1 Member since: August 2015

    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 :)

  • ShyimShyim MemberComments: 839 Received thanks: 338 Member since: May 2015

    @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 :)

    Thanked by 1Nordisch
  • NordischNordisch MemberComments: 7 Received thanks: 1 Member since: August 2015

    Hey @Moorleiche‍, @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);
            }
        }

     

  • Michael TelgmannMichael Telgmann ModeratorComments: 987 Received thanks: 281 Member since: June 2014

    Hallo,

    so setzen wir z.B. in unserem PayPal Plugin die Default Config: https://github.com/shopwareLabs/SwagPayPal/blob/master/src/Util/Lifecycle/InstallUninstall.php#L98

    Viele Grüße aus Schöppingen

    cool Michael Telgmann

  • MoorleicheMoorleiche MemberComments: 35 Received thanks: 2 Member since: August 3

    @Michael Telgmann

    Rocket Science

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

  • Michael TelgmannMichael Telgmann ModeratorComments: 987 Received thanks: 281 Member since: June 2014

    Hallo,

    Dafür gibt es bereits ein Ticket Wink https://issues.shopware.com/issues/NEXT-3647

    Viele Grüße aus Schöppingen

    cool Michael Telgmann

Sign In or Register to comment.