Hallo Community,
ich nutze seit Längerem bereits den CrudService zur Anlage von Freitextfeldern / Attributen über ein Plugin. Dabei ist es letztens bei zwei Kunden zu einem Fehler gekommen, welchen ich jedoch nicht nachvollziehen kann:
You're trying to decode an invalid JSON String: Fatal error: [...]
(*Leider kann ich die genaue Fehlermeldung gerade nicht mehr wiedergeben. Auch ist diese von Shop zu Shop bisher unterschiedlich gewesen… Jedenfalls führt dies zu einem 500 Fehler und verweist auf irgendwelche php-Dateien im Enginge-Order wie zum Beispiel die …\engine\Shopware\Models\Customer\Billing.php)
Es kommt zu dem Fehler und das Plugin kann weder installiert noch deinstalliert werden, wenn:
- beim Installieren die Freitextfelder bereits existieren
- beim Update wenn die Freitextfelder bereits existieren
- beim D einstallieren , wenn die Freitextfelder nicht existieren
Wie kann das sein? In Fall 1 und 2 dürfte gar kein Fehler kommen, weil die Attribute geupdatet werden. Und in Fall 3 fange ich das mit try catch ab und lasse die Deinstallation weiter laufen.
Ich konnte das bei mir in der Entwicklungsumgebung nicht nachstellen. Das Problem trat bei 5.2.2 und bei 5.3.3 zweier Kunden auf.
Hier der Code für die Felder:
assertMinimumVersion('5.2')) {
$this->createAttributes();
}
return true;
}
/**
* The Plugin update method
*
* @param string $oldVersion
* @throws Exception
* @return array
*/
public function update($oldVersion)
{
if ($this->assertMinimumVersion('5.2')) {
$this->createAttributes();
}
return [
'success' => true,
'invalidateCache' => $this->getInvalidateCache()
];
}
/* Plugin Deinstallation */
public function uninstall()
{
$this->secureUninstall();
$this->removeAttributes();
return ['success' => true, 'invalidateCache' => $this->getInvalidateCache()];
}
/**
* @return array
*/
public function secureUninstall()
{
return ['success' => true, 'invalidateCache' => $this->getInvalidateCache()];
}
/**
* Helper method to return all the caches, that need to be cleared after uninstalling/enabling/disabling a plugin
*
* @return array
*/
private function getInvalidateCache()
{
return ['frontend', 'backend', 'theme'];
}
private function createAttributes()
{
/** @var CrudService $Service */
$service = Shopware()->Container()->get('shopware_attribute.crud_service');
$service->update('s_articles_attributes', 'prefix_foo_attr', 'boolean', [
'label' => 'Label',
'supportText' => 'supportText',
'helpText' => 'helpText',
'translatable' => true,
'displayInBackend' => true,
'position' => 100
]);
$service->update('s_articles_attributes', 'prefix_foobar_attr', 'boolean', [
'label' => 'Label',
'supportText' => 'supportText',
'helpText' => 'helpText',
'translatable' => true,
'displayInBackend' => true,
'position' => 110
]);
$metaDataCache = Shopware()->Models()->getConfiguration()->getMetadataCacheImpl();
$metaDataCache->deleteAll();
Shopware()->Models()->generateAttributeModels(['s_articles_attributes']);
}
private function removeAttributes()
{
/** @var CrudService $Service */
$service = Shopware()->Container()->get('shopware_attribute.crud_service');
try {
$service->delete('s_articles_attributes', 'prefix_foo_attr');
$service->delete('s_articles_attributes', 'prefix_foobar_attr');
} catch (Exception $e) {
// ignore Exception
}
Shopware()->Models()->generateAttributeModels(['s_articles_attributes']);
}
}