Cronjob / Subshop

Hallo,

ich stehe im Moment auf dem Schlauch. Ich habe einen Cronjob über ein Plugin, welcher regelmässig ausgeführt wird.
Über $this->Config() greife ich auf die Konfig zu.

Jetzt müsste ich den Vorgabe aber X mal machen, pro Subshop. Wie kann ich herausfinden wie viele Shops angelegt sind (außer s_core_shops abzufragen) und jeweils deren Config laden?

Danke für die Info.

Gruß Ottscho

Erledigt

$repository = Shopware()->Container()->get('models')->getRepository('Shopware\Models\Shop\Shop');
$shop = $repository->getActiveById($shopId);
$shop->registerResources();
$config = $this->Config();

 

Scheinbar gibt es hier Probleme mit SW < 5.2

Kann das sein?

Es kommt die Meldung:  Fatal error : Call to a member function registerResource() on null in /var/www/clients/client1/web2/web/engine/Shopware/Models/Shop/Shop.php on line 681

Anhand Github kann ich jetzt nicht umbedingt erkennen, dass es da eine Änderung gab.

hat mir hierzu jemand einen Tipp?

 

“Call to a member function registerResource() on null”. Also ist bei “$shop = $repository->getActiveById($shopId);” bereits etwas schiefgelaufen. Es wird dir ja eindeutig null statt einem Shop Model zurückgegeben. Prüfe doch mal was für eine $shopId du dort übergeben hast und ob ein  aktiver  Shop mit dieser ID überhaupt existiert. ( getActiveById gibt dir nämlich nur Shops zurück, die aktiv gesetzt sind!)

Danke für die Rückmeldung.
Das habe ich bereits gemacht. Die id ist die 1 (in meinem Test).

Diese werden per Query emittelt:

 SELECT id FROM s\_core\_shops WHERE main\_id is NULL AND active = 1

Der Code klappt unter SW5.2x aber bei SW 5.1x kommt dieser Fehler.

Ich glaube eher, dass es an deiner SW 5.1. Installation liegt. Wenn dir $repository->getActiveById($shopId) null zurückliefert gibt es den Shop nicht oder er ist nicht aktiv. Diese Funktion hat sich von 5.1 auf 5.2 nicht verändert. Du kannst ja mal folgendes probieren:

getActiveById($shopId);
if ($shop === null) {
   Shopware()->Debuglogger()->info("shopid",["shopid" => $shopId]);
}

und prüfen was die eingegebene Shop ID war, die null zurück lieferte. Danach mal in der Datenbank prüfen, was mit dem Shop los ist.

Da ist soweit alles in Ordnung. 1 steht in der Variable.

Ich denke es liegt am Umfeld. Ich verwende den Code im Cronjob (Shopware_Components_Cron_CronJob) um an die Plugin Config alle Shops zu gelangen.
Evtl. geht dies hier erst am SW 5.2?

 

Oh man. Mich hat die Zeile in deinem Codeausschnitt ( $shop->registerResources(); ) verwirrt.  Grin . Der Fehler wird ja in der Shop.php selbst geworfen und nicht dort.

Es stimmt in Shopware 5.1. muss in der registerResources noch als Argument die Shopware Bootstrap ( Shopware()->Bootstrap() ) mitgegeben werden.
Ob dies allerdings einfach so in einem Cronjob funktioniert weiß ich auch nicht. 

Du kannst folgendes nutzen um auf die Pluginkonfiguration der jeweiligen Subshops zuzugreifen:

getId(); // $this hier deine Plugin Bootstrap ggf. anpassen!

    $repository = $this->em->getRepository('Shopware\Models\Config\Form');
    $quB = $repository->createQueryBuilder('form');
    // Abfrage des Plugin Forms
    $quB->select(['form','elements', 'values'])
        ->leftJoin('form.elements','elements')
        // nur Werte abholen wenn sie dem entsprechenden Subshop zugewiesen sind!
        ->leftJoin('elements.values','values','WITH','values.shop = :shop')
        // wir wollen nur das Pluginformular
        ->andWhere('form.pluginId = :pluginId')
        ->setParameter('shop',$shopId)
        ->setParameter('pluginId',$pluginId);
    $query = $quB->getQuery();
    $form = $query->getOneOrNullResult(\Doctrine\ORM\Query::HYDRATE_ARRAY);
    
    // optional: Wir bauen uns ein schönes Key->Value Array
    $config = [];
    foreach($form['elements'] as $element) {
        $key = $element['name'];
        // zunächst benutzen wir den Defaultwert
        $value = $element['value'];

        // wenn es für den Subshop entsprechende Werte gibt wird dieser genommen
        if (!empty($element['values'])) {
            $value = $element['values'][0]['value'];
        }
        $config[$key] = $value;
    }
    return $config
}

Code nicht getestet!

Ich glaube, dass es eh nicht eine gute Idee im Cronjob mit Shop->registerResource aufzurufen nur um an die Konfiguration zu gelangen.

Danke dir, werde ich testen.

Eine genrelle Info von Shopware zu dem Thema gibt es leider nicht. Oder ich habe es nicht gefunden.
Meinen Code habe ich ebenfalls im Forum gefunden, als Lösung um an die Config pro Subshop zu kommen.

 

Ok das hatte mich jetzt auch interessiert. Und da hab ich mal im Quellcode nachgesehen:

Collection()->getConfig($this->getName(), $shop);

Es kann doch so einfach sein. Allerdings habe ich das nicht ausprobiert. Es wäre cool du @ottscho‍ das mal ausprobierst und uns hier Feedback gibst.  Wink

hi @simkli,

also unter SW 5.2.6 funktioniert es bestens. Ich teste es morgen noch unter SW 5.1.x und 5.0.x.
Wenn es klappt ist das der kürzeste Weg um an die Config zu kommen.

Perfekt…

Könnte man ruhig beim Shopware Developer Bereich mit aufführen.
 

SW 5.1 klappt es auch wunderbar :slight_smile:

Besten Dank

@ottscho schrieb:

Könnte man ruhig beim Shopware Developer Bereich mit aufführen.

Der Developer Bereich für Shopware 5 ist komplett auf Github und kann von jedem ergänzt/korrigiert werden. Statt es hier irgendwo im Forum zu erwähnen wo es wieder untergeht einfach mal eintragen wenn dir irgendwas in der Doku fehlt. Der nächste der vor dem Problem steht wird sich freuen.

ist eingefügt bzw warten auf den merge.

Danke