Quantcast
Channel: Programming - Shopware Community Forum
Viewing all articles
Browse latest Browse all 118

Neue unit wird per API nicht angelegt (4.2/4.3)

$
0
0
Hallo!

Ich habe einen nachvollziehbaren Fehler in 4.2.3 und 4.3 lokalisiert, und zwar kracht es, wenn Artikel über die API-Resource mit einer im System noch nicht vorhandenen Unit importiert werden.

Laut API-Wiki sollte das aber funktionieren:
'mainDetail' => array(
'number' => 'turn33',
'prices' => array(
array(
'customerGroupKey' => 'EK',
'price' => 999,
),
),
'unit' => array(
'unit' => 'xyz',
'name' => 'Neue Einheit'
)
)
Wenn die Unit mit "unit" und "name" angegeben wird, wird laut Doku ein vorhandener Datensatz gesucht - wenn nicht vorhanden - wird er angelegt.

Wenn diese Unit bereits existiert klappt der Import auch - bei neuen aber nachvollziehbar nicht!

Um der Sache auf den Grund zu gehen ... in der Variant Resource gibt es ...
//new unit data send? create new unit for this variant
        } elseif (!empty($data['unit'])) {
            $data['unit'] = $this->updateUnitReference($data['unit']);
        }
Da geht er auch rein, und versucht in der Folgemethode diese Unit auch zu erstellen:
//to create a new unit, the unit name and unit is required. Otherwise we throw an exception
        if (!$unit && isset($unitData['name']) && isset($unitData['unit'])) {
            $unit = new Unit();
            $this->getManager()->persist($unit);
        } elseif (!$unit) {
            throw new ApiException\CustomValidationException(sprintf('To create a unit you need to pass `name` and `unit`'));
        }

        $unit->fromArray($unitData);
        return $unit;
Es kommt nur leider nichts in der Datenbank an.
Das $unit des returns beinhaltet auch keine ID oder so, scheint da zu kneifen.

Als Exception kracht das create der Resource mit einer neuen und noch nicht vorhandenen Preiseinheit:
Fehler: Artikel #CL-001 konnte nicht erfolgreich angelegt werden!: An exception occurred while executing 'INSERT INTO s_articles_details (articleID, unitID, ordernumber, suppliernumber, kind, additionaltext, active, instock, stockmin, weight, width, length, height, ean, position, minpurchase, purchasesteps, maxpurchase, purchaseunit, referenceunit, packunit, shippingfree, releasedate, shippingtime) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)' with params [null, 15, "CL-001", "", 1, "", true, 2053, null, 0.167, null, null, null, "4260037369143", 0, null, null, null, 1, 1, 6, 0, null, null]: SQLSTATE[23000]: Integrity constraint violation: 1048 Column 'articleID' cannot be null
In dieser Exception erscheint eine unitID, die aber offensichtlich per Transaktion am Ende nicht persistent gehalten wird.

Wenn die Preiseinheit weggelassen wird bei genau dieser Erstellung klappt das create ohne Probleme. Das Problem lässt sich also ganz definiert nur auf die Angabe von "unit" und "name" des Blocks "unit" im "MainDetail" beziehen.

EDIT: In einer kleinen (und einfachen) eigenen Hilfsfunktion umgehe ich das Problem, indem ich selbst nach der Einheit suche (über das Feld "unit"), wenn gefunden setze ich die "unitId" unter den "mainDetail". Wenn die Unit nicht gefunden werden kann, erstelle ich die über das Model selbst, was funktioniert:
$unitModel = new Unit();

            $unitModel->setName($unitName);

            $unitModel->setUnit($unitName);

            try {

                Shopware()->Models()->persist($unitModel);

                Shopware()->Models()->flush();

                return $unitModel->getId();

            } catch (\Exception $e) { ...

Mir fällt nur auf, dass in der updateUnitReference($unitData) kein flush durchgeführt wird - kann das die Ursache sein? ...

Freue mich über Feedback!

Schöne Grüße,
Niklas

Viewing all articles
Browse latest Browse all 118

Trending Articles



<script src="https://jsc.adskeeper.com/r/s/rssing.com.1596347.js" async> </script>