cancel
Showing results for 
Search instead for 
Did you mean: 

REST API extension_attributes setzen

REST API extension_attributes setzen

ich habe folgendes Problem mit Magento 2.1.7 und der REST Schnittstelle. Und zwar:

 

Anforderung: ein über die REST Schnittstelle lege ich ein Produkt in den Warenkorb. Dieses muss mit einem Flag markiert werden. Dazu habe ich im InstallSchema.php meines Moduls eine neues Element dem quote_item hinzugefügt. Das soll nun über die Schnittstelle gesetzt werden.

 

Problem: das Flag wird nie gesetzt. Ich kann es lediglich manuell setzen und über die REST Schnittstelle auslesen.

 

InstallSchema.php:

 

$setup->startSetup();
$setup->getConnection()
    ->addColumn(
         $setup->getTable('quote_item'),
             'flag',
             [
                 'type' => \Magento\Framework\DB\Ddl\Table::TYPE_INTEGER,
                 'default' => 0,
                 'comment' =>'flag'
             ]
     );
$setup->endSetup();

CartItemInterface.php

 

 

<?php
namespace Irgendware\Irgendwer\Plugin\Magento\Quote\Api\Data;
class CartItemInterface
{
    protected $_extensionFactory;
    protected $_quoteRepository;

    public function __construct(
        \Magento\Quote\Api\Data\CartItemExtensionFactory $extensionFactory,
        \Magento\Quote\Model\QuoteRepository $quoteRepository
    )
    {
        $this->_extensionFactory = $extensionFactory;
        $this->_quoteRepository = $quoteRepository;
    }

public function afterGetExtensionAttributes(
        \Magento\Quote\Api\Data\CartItemInterface $subject,
        $result
    ) {
        if ($result === null) {
            $result = $this->_extensionFactory->create();
        }

        $quoteItemId = $subject->getItemId();
        $quoteId = $subject->getQuoteId();
        $quote = $this->_quoteRepository->get($quoteId);
        $items = $quote->getAllItems();

        $flag = 0;
        foreach($items as $item) {
            if($item->getId() == $quoteItemId) {
                $flag = $item->getFlag();
                break;
            }
        }
        
        $result->setFlag($flag);
        return $result;
}

CartItemSave.php

 

 

<?php 
namespace Irgendwer\Irgendwas\Plugin;

use Magento\Quote\Api\Data\CartItemInterface;

class CartItemSave
{
    protected $productExtensionFactory;
    protected $productFactory;

    public function __construct(
        \Magento\Quote\Api\Data\ProductExtensionFactory $productExtensionFactory,
        \Magento\Catalog\Model\ProductFactory $productFactory
    )
    {
        $this->productFactory = $productFactory;
        $this->productExtensionFactory = $productExtensionFactory;
    }

    public function aroundSave(
        \Magento\Quote\Api\CartItemRepositoryInterface $subject,
        \Closure $proceed,
        \Magento\Quote\Api\Data\CartItemInterface $cartItem
    )
    {
        /*if ($cartItem->getExtensionAttributes() && $cartItem->getExtensionAttributes()->getFlag()) {
            return $cartItem;
        }*/

        $extensionAttributes = $cartItem->getExtensionAttributes();
        echo "Wert: "-$extensionAttributes->getFlag();die();
    }
}

 

Über Postman lege ich ein Produkt wie folgt in den Warenkorb:

{
  "cartItem": {
    "sku":"Testprodukt",
    "qty":1,
    "quoteId":5,
    "extension_attributes": {
        "flag":1
    }
  }
}

das klappt ganz normal nur mit der Ausnahme, dass das flag 0 ist.

 

setze ich in der Datenbank das Flag manuell auf 1, dann liefert mir die REST Schnittstelle auch den korrekten Wert:

[
    {
        "item_id": 24,
        "sku": "Testprodukt",
        "qty": 1,
        "name": "Testprodukt",
        "price": 10.99,
        "product_type": "simple",
        "quote_id": "5",
        "extension_attributes": {
            "flag": 1
        }
    }
]

Ich habe leider keine Idee mehr woran das liegt. Offenbar kann man das ExtensionAttributes Objekt nicht auslesen, sondern es wird bei dem Event immer neu erstellt und das Flag ist folglich immer mit 0 gesetzt.

 

Hat irgendwer schon mal so ein ähnliches Problem gesehen? Ist da ein Fehler im Code oder ein Magento Bug?

1 REPLY

Re: REST API extension_attributes setzen

Vielleicht mal mit afterSave probieren anstelle von aroundSave.

 

Irgendwie fehlt mir auch das:

 

$entity->setExtensionAttributes($extensionAttributes);

 

Schau dir das hier nochmal genau an:
http://devdocs.magento.com/guides/v2.0/extension-dev-guide/extension_attributes/adding-attributes.ht...

 

Hab deinen Code nur überflogen. Grüße.