Exception beim Anlegen eines Artikel über Plugin (Resources) - Problem mit Prices

Guten Morgen,

Ich entwickle eine Schnittstelle und lege dazu die Artikel über die API Funktionen von Shopware an:

$resource = \Shopware\Components\Api\Manager::getResource('article');

$articleData = array(
    'name' => $line[2],
    'taxId' => $taxId,
    'mainDetail' => array(
        'number' => $line[0],
        'inStock' => $line[15],
        'prices' => array(
            array(
                'customerGroupKey' =>'EK',
                'from' => 1,
                'to' => 'beliebig',
                'price' => $line[10],
                'basePrice' => 0,
                'percent' => 0
            )
        ),
    ),
    'categories' => array(
        array(
            'id' => 3
        )
    ),
    'supplier' => 'TBD',
    'description' => 'description',
    'descriptionLong' => 'descriptionLong',
    'active' => true,
);

$article = $resource->create($articleData);

Das alles funktioniert wunderbar, solange der " prices" node nicht enthalten ist. Sobald ich die „prices“ wie oben zu sehen definieren, gibt es beim Ausführen nachfolgende Exception. Es handelt sich dabei nur um eine Notice aber ganz offensichtlich hat es hier ein Problem mit einem Array Index. Artikel und Preise werden dennoch angelegt.

PHP Notice: Undefined index: key in /data/www/www.dev/engine/Library/Doctrine/ORM/Persisters/Entity/BasicEntityPersister.php on line 671
PHP Stack trace:
PHP 1. {main}() /data/www/www.dev/bin/console:0
PHP 2. Symfony\Component\Console\Application->run() /data/www/www.dev/bin/console:38
PHP 3. Shopware\Components\Console\Application->doRun() /data/www/www.dev/vendor/symfony/console/Application.php:123
PHP 4. Symfony\Component\Console\Application->doRun() /data/www/www.dev/engine/Shopware/Components/Console/Application.php:132
PHP 5. Symfony\Component\Console\Application->doRunCommand() /data/www/www.dev/vendor/symfony/console/Application.php:192
PHP 6. Symfony\Component\Console\Command\Command->run() /data/www/www.dev/vendor/symfony/console/Application.php:844
PHP 7. PhaIdxInterface\Commands\ImportCommand->execute() /data/www/www.dev/vendor/symfony/console/Command/Command.php:259
PHP 8. PhaIdxInterface\Lib\Articles->importArticles() /data/www/www.dev/custom/plugins/PhaIdxInterface/Commands/ImportCommand.php:79
PHP 9. Shopware\Components\Api\Resource\Article->create() /data/www/www.dev/custom/plugins/PhaIdxInterface/Lib/Articles.php:171
PHP 10. Shopware\Components\Api\Resource\Resource->flush() /data/www/www.dev/engine/Shopware/Components/Api/Resource/Article.php:541
PHP 11. Doctrine\ORM\EntityManager->flush() /data/www/www.dev/engine/Shopware/Components/Api/Resource/Resource.php:260
PHP 12. Doctrine\ORM\UnitOfWork->commit() /data/www/www.dev/vendor/doctrine/orm/lib/Doctrine/ORM/EntityManager.php:356
PHP 13. Doctrine\ORM\UnitOfWork->executeInserts() /data/www/www.dev/vendor/doctrine/orm/lib/Doctrine/ORM/UnitOfWork.php:378
PHP 14. Doctrine\ORM\Persisters\Entity\BasicEntityPersister->executeInserts() /data/www/www.dev/vendor/doctrine/orm/lib/Doctrine/ORM/UnitOfWork.php:1018
PHP 15. Doctrine\ORM\Persisters\Entity\BasicEntityPersister->prepareInsertData() /data/www/www.dev/engine/Library/Doctrine/ORM/Persisters/Entity/BasicEntityPersister.php:271
PHP 16. Doctrine\ORM\Persisters\Entity\BasicEntityPersister->prepareUpdateData() /data/www/www.dev/engine/Library/Doctrine/ORM/Persisters/Entity/BasicEntityPersister.php:722

Habe ich hier vielleicht einen Fehler im Aufbau des Arrays?

Bin Euch für jeden Tipp dankbar,

Liebe Grüße,
Synonymous

Funktioniert es wenn du die Zeile

'baseprice' => 0,

auskommentierst? Hier gab es mal welche die ein Problem mit dem Baseprice hatten…

Ja, habe hier schon die unterschiedlichsten Varianten durch…
Irgendwo hakt es mit einem Key. Die Indizes stimmen aber mit denen der Price Klasse überein. Vielleicht hat der Mapper von ArrayToObject ein Problem!?

So, ich bin jetzt mal einen Schritt weiter. Ich habe mir den Fehler im Persister angesehen. Dort haut irgendetwas mit dem Mapping nicht hin. 

\engine\Library\Doctrine\ORM\Persisters\Entity\BasicEntityPersister.php
Zeile 668 habe ich folgende Informationen rausgezogen:

--------------------
OwningTable: s_articles_prices
SourceColumn: pricegroup
TargetColumn: groupkey
IdForColumn: key
--------------------
PHP Notice: Undefined index: key in /data/www/www.dev/engine/Library/Doctrine/ORM/Persisters/Entity/BasicEntityPersister.php on line 683

IdForColumn wird über 

$newValId[$targetClass->getFieldForColumn($targetColumn)]

ausgelesen. Dort wird „key“ zurückgeliefert - den gibt es im $newValId allerdings nicht:

array(1) {
  'id' =>
  int(1)
}

 

Überprüf mal die Model-Properties der Columns. Die heißen ja in der Datenbank „immer“ anders als im Model über das sie angesprochen werden.

1 „Gefällt mir“

Ja… “key” gibt es definitiv nicht…
Allerdings durchschaue ich die Funktion dieser Klasse hier noch nicht: shopware/BasicEntityPersister.php at 5.2 · shopware/shopware · GitHub

Ich habe das gleiche Problem. Ist da jemand weiter gekommen? Gibt es schon ein Bug-Ticket dazu?

Ich hab dazu ein Demo-Plugin geschrieben:
https://github.com/synonymous1984/TestKeyIssue

Ich sehe die Issue wurde bereits von Dir angelegt
http://issues.shopware.com/issues/SW-16685

Gibt es ggf. eine Verbindung zu dieser Issue?
http://issues.shopware.com/issues/SW-16364

Du bist ja schon tiefer drin, vielleicht siehst Du den Zusammenhang.

Dürfte sich um das selbe Thema handeln… Leider ist keine Exception angeführt. Werde den Fix mal ausprobieren - allerdings ist keines der Tickets bislang für einen der nächsten Bugfix-Releases gescheduled.

Ich habe alle abfragen an die fehlenden keys mit

isset($value) ? $value : null

ersetzt. hat mir jetzt erstmal gereicht… biusher keine probleme damit gehabt (aber auch nicht in prod)

Hallo,

ich habe diese Probleme behoben.

Github.

Viele Grüße,

Ahmad.

2 „Gefällt mir“