1

I want to add custom attribute to>http://{{magento2}}/rest/V1/carts/mine/totals

API response.

I have done follwing way but it not working.

>extension_attributes.xml
<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:framework:Api/etc/extension_attributes.xsd">
 <extension_attributes for="Magento\Quote\Api\Data\CartItemInterface">
 <attribute code="product_option" type="float" />
 </extension_attributes>
</config>
>di.xml
<type name="Magento\Quote\Model\Quote\Item">
 <plugin name="cs_product_opt" type="Namespace\Product\Plugin\Model\Cart\CartTotalRepositoryPlugin" />
</type>
>Plugin file 
<?php
/**
* Copyright 2016 aheadWorks. All rights reserved.
* See LICENSE.txt for license details.
*/
namespace Namespace\Product\Plugin\Model\Cart;
use Magento\Quote\Api\Data\TotalsExtensionInterface;
use Magento\Quote\Api\Data\TotalsExtensionFactory;
use Magento\Quote\Api\Data\CartItemExtensionFactory;
use Magento\Quote\Api\Data\TotalsInterface;
use Magento\Quote\Api\CartRepositoryInterface;
use Magento\Quote\Model\Cart\CartTotalRepository as TotalRepository;
use Magento\Quote\Model\Quote;
/**
 * Class Aheadworks\StoreCredit\Plugin\Model\Cart\CartTotalRepositoryPlugin
 */
class CartTotalRepositoryPlugin
{
 /**
 * @var CartRepositoryInterface
 */
 private $quoteRepository;
 /**
 * @var CartItemExtensionFactory
 */
 private $totalsExtensionFactory;
 /**
 * @param CartRepositoryInterface $quoteRepository
 * @param CartItemExtensionFactory $totalsExtensionFactory
 */
 public function __construct(
 CartRepositoryInterface $quoteRepository,
 CartItemExtensionFactory $totalsExtensionFactory
 ) {
 $this->quoteRepository = $quoteRepository;
 $this->totalsExtensionFactory = $totalsExtensionFactory;
 }
 /**
 * Apply extension attributes to totals
 *
 * @param TotalRepository $subject
 * @param \Closure $proceed
 * @param int $cartId
 * @return TotalsInterface
 * @SuppressWarnings(PHPMD.UnusedFormalParameter)
 */
 public function aroundGet(TotalRepository $subject, \Closure $proceed, $cartId)
 {
 /** @var TotalsInterface $totals */
 $totals = $proceed($cartId);
 /** @var \Magento\Quote\Api\Data\TotalsExtensionInterface $extensionAttributes */
 $extensionAttributes = $totals->getExtensionAttributes()
 ? $totals->getExtensionAttributes()
 : $this->totalsExtensionFactory->create();
 /** @var Quote $quote */
 $quote = $this->quoteRepository->getActive($cartId);
 $extensionAttributes->setProductOption(1.11);
 $totals->setExtensionAttributes($extensionAttributes);
 return $totals;
 }
}

anyone have idea how to add custom attribute to Quote Item Rest API.

Niket
1675 silver badges20 bronze badges
asked Nov 21, 2018 at 6:01

1 Answer 1

0

To add new attribute on cart item. you need to consume V1/carts/mine service.

CartRepositoryPlugin.php

<?php
/**
* Copyright 2016 aheadWorks. All rights reserved.
* See LICENSE.txt for license details.
*/
namespace Namespace\Product\Plugin\Model\Cart;
use Magento\Quote\Api;
use Magento\Quote\Api\CartRepositoryInterface;
use Magento\Quote\Api\CartTotalRepositoryInterface;
use Magento\Catalog\Helper\Product\ConfigurationPool;
use Magento\Framework\Api\DataObjectHelper;
use Magento\Framework\Api\ExtensibleDataInterface;
use Magento\Quote\Model\Cart\Totals\ItemConverter;
use Magento\Quote\Api\CouponManagementInterface;
use Magento\Quote\Model\Cart\TotalsConverter;
use Magento\Quote\Api\Data\CartItemExtensionFactory;
use Magento\Quote\Model\Cart\CartTotalRepository as TotalRepository;
/**
 * Class Aheadworks\StoreCredit\Plugin\Model\Cart\CartTotalRepositoryPlugin
 */
class CartRepositoryPlugin
{
/**
 * Cart totals factory.
 *
 * @var Api\Data\TotalsInterfaceFactory
 */
private $totalsFactory;
/**
 * Quote repository.
 *
 * @var \Magento\Quote\Api\CartRepositoryInterface
 */
private $quoteRepository;
/**
 * @var \Magento\Framework\Api\DataObjectHelper
 */
private $dataObjectHelper;
/**
 * @var ConfigurationPool
 */
private $itemConverter;
/**
 * @var CouponManagementInterface
 */
protected $couponService;
/**
 * @var TotalsConverter
 */
protected $totalsConverter;
/**
 * @param Api\Data\TotalsInterfaceFactory $totalsFactory
 * @param CartRepositoryInterface $quoteRepository
 * @param DataObjectHelper $dataObjectHelper
 * @param CouponManagementInterface $couponService
 * @param TotalsConverter $totalsConverter
 * @param ItemConverter $converter
 */
public function __construct(
 Api\Data\TotalsInterfaceFactory $totalsFactory,
 CartRepositoryInterface $quoteRepository,
 DataObjectHelper $dataObjectHelper,
 CouponManagementInterface $couponService,
 TotalsConverter $totalsConverter,
 CartItemExtensionFactory $cartItemInterfaceFactory,
 ItemConverter $converter
) {
 $this->totalsFactory = $totalsFactory;
 $this->quoteRepository = $quoteRepository;
 $this->dataObjectHelper = $dataObjectHelper;
 $this->couponService = $couponService;
 $this->totalsConverter = $totalsConverter;
 $this->cartItemInterfaceFactory = $cartItemInterfaceFactory;
 $this->itemConverter = $converter;
}
/**
 * Apply extension attributes to totals
 *
 * @param TotalRepository $subject
 * @param \Closure $proceed
 * @param int $cartId
 * @return TotalsInterface
 * @SuppressWarnings(PHPMD.UnusedFormalParameter)
 */
public function aroundGet(TotalRepository $subject, \Closure $proceed, $cartId)
{
 /** @var \Magento\Quote\Model\Quote $quote */
 $quote = $this->quoteRepository->getActive($cartId);
 if ($quote->isVirtual()) {
 $addressTotalsData = $quote->getBillingAddress()->getData();
 $addressTotals = $quote->getBillingAddress()->getTotals();
 } else {
 $addressTotalsData = $quote->getShippingAddress()->getData();
 $addressTotals = $quote->getShippingAddress()->getTotals();
 }
 unset($addressTotalsData[ExtensibleDataInterface::EXTENSION_ATTRIBUTES_KEY]);
 /** @var \Magento\Quote\Api\Data\TotalsInterface $quoteTotals */
 $quoteTotals = $this->totalsFactory->create();
 $this->dataObjectHelper->populateWithArray(
 $quoteTotals,
 $addressTotalsData,
 \Magento\Quote\Api\Data\TotalsInterface::class
 );
 $items = [];
 foreach ($quote->getAllVisibleItems() as $index => $item) {
 $cartItemExtensionAttributes = $item->getExtensionAttributes();
 if($cartItemExtensionAttributes == null){
 $cartItemExtensionAttributes = $this->cartItemInterfaceFactory->create();
 $cartItemExtensionAttributes->setProductOption('Product Option Check');
 $item->setExtensionAttributes($cartItemExtensionAttributes); 
 $item->save();
 }
 $items[$index] = $this->itemConverter->modelToDataObject($item);
 }
 $calculatedTotals = $this->totalsConverter->process($addressTotals);
 $quoteTotals->setTotalSegments($calculatedTotals);
 $amount = $quoteTotals->getGrandTotal() - $quoteTotals->getTaxAmount();
 $amount = $amount > 0 ? $amount : 0;
 $quoteTotals->setCouponCode($this->couponService->get($cartId));
 $quoteTotals->setGrandTotal($amount);
 $quoteTotals->setItems($items);
 $quoteTotals->setItemsQty($quote->getItemsQty());
 $quoteTotals->setBaseCurrencyCode($quote->getBaseCurrencyCode());
 $quoteTotals->setQuoteCurrencyCode($quote->getQuoteCurrencyCode());
 return $quoteTotals;
 }
}

extension_attributes.xml

 <config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:framework:Api/etc/extension_attributes.xsd">
<extension_attributes for="Magento\Quote\Api\Data\CartItemInterface">
 <attribute code="product_option" type="string" />
</extension_attributes>

di.xml

 <type name="Magento\Quote\Model\Cart\CartTotalRepository">
 <plugin name="cp_product_opt" type="Commercepundit\Product\Plugin\Model\Cart\CartRepositoryPlugin" />
</type>

I hope it'll work for you. Let me know if you need further help.

answered Nov 21, 2018 at 6:19
10
  • no i no needed in total i want this in Quote Item. Commented Nov 21, 2018 at 6:32
  • if you need this in cart item then you need to do create your plugin on cart repository as total api does not return item data Commented Nov 21, 2018 at 6:57
  • Please check updated answer. Commented Nov 21, 2018 at 7:05
  • ok Let me implement Commented Nov 21, 2018 at 7:13
  • Call to undefined method Magento\\Quote\\Model\\QuoteRepository\\Interceptor::getItems() Commented Nov 21, 2018 at 7:32

Your Answer

Draft saved
Draft discarded

Sign up or log in

Sign up using Google
Sign up using Email and Password

Post as a guest

Required, but never shown

Post as a guest

Required, but never shown

By clicking "Post Your Answer", you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.