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?
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.
“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!)
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. . 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.
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.
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.
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.