I am trying to form a custom format for product collection(getList) using service-contract concept in magento 2 i am able to add keys but i am unable to add values to the response object can you please suggest me
app/code/Ewall/Test/etc/webapi.xml
<?xml version="1.0" ?>
<routes xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:module:Magento_Webapi:etc/webapi.xsd"> <route url="/V1/productlist" method="GET">
<service class="Ewall\Test\Api\ProductRepositoryInterface" method="getList"/>
<resources>
<resource ref="anonymous" />
</resources>
</route>
</routes>
app/code/Ewall/Test/etc/di.xml
<?xml version="1.0" ?>
<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:framework:ObjectManager/etc/config.xsd">
<preference for="Ewall\Test\Api\ProductRepositoryInterface" type="Ewall\Test\Model\ProductRepository"/>
<preference for="Ewall\Test\Api\Data\ProductSearchResultsInterface" type="Magento\Framework\Api\SearchResults" />
<preference for="Ewall\Test\Api\Data\ProductInterface" type="Ewall\Test\Model\Product"/>
</config>
app/code/Ewall/Test/Api/Data/ProductInterface.php
<?php
namespace Ewall\Test\Api\Data;
interface ProductInterface
{
/**#@+
* Constants defined for keys of data array
*/
const SKU = 'sku';
const NAME = 'name';
const PRICE = 'price';
const WEIGHT = 'weight';
const STATUS = 'status';
const DESCRIPTION = 'description';
const BRAND = 'brand';
const POSITION = 'position';
const URL = 'url';
const URL_KEY = 'url_key';
const EXPRESS_DELIVERY = 'express_delivery';
const ITEM_COLLECTION = 'item_collection';
const IS_OFFER = 'is_offer';
const OFFER_TEXT = 'offer_text';
const IMAGE = 'image';
const CHILDREN_DATA = 'children_data';
/**#@-*/
/**
* Product id
*
* @return int|null
*/
public function getId();
/**
* Set product id
*
* @param int $id
* @return $this
*/
public function setId($id);
/**
* Product name
*
* @return string|null
*/
public function getName();
/**
* Set product name
*
* @param string $name
* @return $this
*/
public function setName($name);
/**
* Product sku
*
* @return string
*/
public function getSku();
/**
* Set product sku
*
* @param string $sku
* @return $this
*/
public function setSku($sku);
/**
* Product description
*
* @return string
*/
public function getDescription();
/**
* Set product description
*
* @param string $description
* @return $this
*/
public function setDescription($description);
/**
* Product brand
*
* @return string
*/
public function getBrand();
/**
* Set product brand
*
* @param string $brand
* @return $this
*/
public function setBrand($brand);
/**
* Product position
*
* @return string
*/
public function getposition();
/**
* Set product position
*
* @param string $position
* @return $this
*/
public function setposition($position);
/**
* Product url_key
*
* @return string
*/
public function getUrlKey();
/**
* Set product url_key
*
* @param string $url_key
* @return $this
*/
public function setUrlKey($url_key);
/**
* Product url
*
* @return string
*/
public function getUrl();
/**
* Set product url
*
* @param string $url
* @return $this
*/
public function setUrl($url);
/**
* Product express_delivery
*
* @return string
*/
public function getExpressDelivery();
/**
* Set product express_delivery
*
* @param string $express_delivery
* @return $this
*/
public function setExpressDelivery($express_delivery);
/**
* Product item_collection
*
* @return string
*/
public function getItemCollection();
/**
* Set product item_collection
*
* @param string $item_collection
* @return $this
*/
public function setItemCollection($item_collection);
/**
* Product status
*
* @return int|null
*/
public function getStatus();
/**
* Set product status
*
* @param int $status
* @return $this
*/
public function setStatus($status);
/**
* Product is_offer
*
* @return string
*/
public function getIsOffer();
/**
* Set product is_offer
*
* @param string $is_offer
* @return $this
*/
public function setIsOffer($is_offer);
/**
* Product offer_text
*
* @return string
*/
public function getOfferText();
/**
* Set product offer_text
*
* @param string $offer_text
* @return string
*/
public function setOfferText($offer_text);
/**
* Store id
*
* @return int|null
*/
public function getStoreId();
/**
* Set store id
*
* @param int $store_id
* @return $this
*/
public function setStoreId($store_id);
/**
* Product image
*
* @return string|null
*/
public function getImage();
/**
* Set product image
*
* @param string $image
* @return $this
*/
public function setImage($image);
/**
* Product children_data[]
*
* @return array
*/
public function getChildrenData();
/**
* Set product children_data
*
* @param array $children_data
* @return $this
*/
public function setChildrenData($children_data);
/**
* Product weight
*
* @return float|null
*/
public function getWeight();
/**
* Set product weight
*
* @param float $weight
* @return $this
*/
public function setWeight($weight);
}
app/code/Ewall/Test/Api/Data/ProductSearchResultsInterface.php
<?php
namespace Ewall\Test\Api\Data;
interface ProductSearchResultsInterface extends \Magento\Framework\Api\SearchResultsInterface
{
/**
* Get attributes list.
*
* @return \Ewall\Test\Api\Data\ProductInterface[]
*/
public function getItems();
/**
* Set attributes list.
*
* @param \Ewall\Test\Api\Data\ProductInterface[] $items
* @return $this
*/
public function setItems(array $items);
}
app/code/Ewall/Test/Api/ProductRepositoryInterface.php
<?php
namespace Ewall\Test\Api;
interface ProductRepositoryInterface
{
/**
* Get product list
*
* @param \Magento\Framework\Api\SearchCriteriaInterface $searchCriteria
* @return \Ewall\Test\Api\Data\ProductSearchResultsInterface
*/
public function getList(\Magento\Framework\Api\SearchCriteriaInterface $searchCriteria);
}
<?php
namespace Ewall\Test\Model;
use Ewall\Test\Api\Data\ProductInterface;
use Magento\Catalog\Model\ResourceModel\Product\Collection;
use Magento\Framework\Api\Data\ImageContentInterface;
use Magento\Framework\Api\Data\ImageContentInterfaceFactory;
use Magento\Framework\Api\SearchCriteria\CollectionProcessorInterface;
use Magento\Framework\DB\Adapter\ConnectionException;
use Magento\Framework\DB\Adapter\DeadlockException;
use Magento\Framework\DB\Adapter\LockWaitException;
use Magento\Framework\Exception\CouldNotSaveException;
use Magento\Framework\Exception\InputException;
use Magento\Framework\Exception\LocalizedException;
use Magento\Framework\Exception\NoSuchEntityException;
use Magento\Framework\Exception\StateException;
use Magento\Framework\Exception\ValidatorException;
/**
* @SuppressWarnings(PHPMD.CouplingBetweenObjects)
* @SuppressWarnings(PHPMD.TooManyFields)
*/
class ProductRepository implements \Ewall\Test\Api\ProductRepositoryInterface
{
/**
* @var \Magento\Catalog\Api\ProductCustomOptionRepositoryInterface
*/
protected $optionRepository;
/**
* @var Product[]
*/
protected $instances = [];
/**
* @var Product[]
*/
protected $instancesById = [];
/**
* @var \Magento\Catalog\Controller\Adminhtml\Product\Initialization\Helper
*/
protected $initializationHelper;
/**
* @var \Magento\Catalog\Api\Data\ProductSearchResultsInterfaceFactory
*/
protected $searchResultsFactory;
/**
* @var \Magento\Framework\Api\SearchCriteriaBuilder
*/
protected $searchCriteriaBuilder;
/**
* @var \Magento\Framework\Api\FilterBuilder
*/
protected $filterBuilder;
/**
* @var \Magento\Catalog\Model\ResourceModel\Product\CollectionFactory
*/
protected $collectionFactory;
/**
* @var \Magento\Catalog\Model\ResourceModel\Product
*/
protected $resourceModel;
/**
* @var Product\Initialization\Helper\ProductLinks
*/
protected $linkInitializer;
/**
* @var Product\LinkTypeProvider
*/
protected $linkTypeProvider;
/**
* @var \Magento\Store\Model\StoreManagerInterface
*/
protected $storeManager;
/**
* @var \Magento\Catalog\Api\ProductAttributeRepositoryInterface
*/
protected $attributeRepository;
/**
* @var \Magento\Catalog\Api\ProductAttributeRepositoryInterface
*/
protected $metadataService;
/**
* @var \Magento\Framework\Api\ExtensibleDataObjectConverter
*/
protected $extensibleDataObjectConverter;
/**
* @var \Magento\Framework\Filesystem
*/
protected $fileSystem;
/**
* @var \Magento\Framework\Api\ExtensionAttribute\JoinProcessorInterface
*/
protected $extensionAttributesJoinProcessor;
/**
* @var \Magento\Catalog\Model\Product\Gallery\Processor
*/
protected $mediaGalleryProcessor;
/**
* @var CollectionProcessorInterface
*/
private $collectionProcessor;
/**
* @var int
*/
private $cacheLimit = 0;
/**
* @var \Magento\Framework\Serialize\Serializer\Json
*/
private $serializer;
/**
* ProductRepository constructor.
* @param \Magento\Catalog\Controller\Adminhtml\Product\Initialization\Helper $initializationHelper
* @param \Magento\Catalog\Api\Data\ProductSearchResultsInterfaceFactory $searchResultsFactory
* @param ResourceModel\Product\CollectionFactory $collectionFactory
* @param \Magento\Framework\Api\SearchCriteriaBuilder $searchCriteriaBuilder
* @param \Magento\Catalog\Api\ProductAttributeRepositoryInterface $attributeRepository
* @param ResourceModel\Product $resourceModel
* @param Product\Initialization\Helper\ProductLinks $linkInitializer
* @param Product\LinkTypeProvider $linkTypeProvider
* @param \Magento\Store\Model\StoreManagerInterface $storeManager
* @param \Magento\Framework\Api\FilterBuilder $filterBuilder
* @param \Magento\Catalog\Api\ProductAttributeRepositoryInterface $metadataServiceInterface
* @param \Magento\Framework\Api\ExtensibleDataObjectConverter $extensibleDataObjectConverter
* @param Product\Option\Converter $optionConverter
* @param \Magento\Framework\Filesystem $fileSystem
* @param \Magento\Framework\Api\ExtensionAttribute\JoinProcessorInterface $extensionAttributesJoinProcessor
* @param CollectionProcessorInterface $collectionProcessor [optional]
* @param \Magento\Framework\Serialize\Serializer\Json|null $serializer
* @param int $cacheLimit [optional]
* @SuppressWarnings(PHPMD.ExcessiveParameterList)
* @SuppressWarnings(PHPMD.UnusedFormalParameter)
*/
public function __construct(
\Magento\Catalog\Controller\Adminhtml\Product\Initialization\Helper $initializationHelper,
\Magento\Catalog\Api\Data\ProductSearchResultsInterfaceFactory $searchResultsFactory,
\Magento\Catalog\Model\ResourceModel\Product\CollectionFactory $collectionFactory,
\Magento\Framework\Api\SearchCriteriaBuilder $searchCriteriaBuilder,
\Magento\Catalog\Api\ProductAttributeRepositoryInterface $attributeRepository,
\Magento\Catalog\Model\ResourceModel\Product $resourceModel,
\Magento\Catalog\Model\Product\Initialization\Helper\ProductLinks $linkInitializer,
\Magento\Catalog\Model\Product\LinkTypeProvider $linkTypeProvider,
\Magento\Store\Model\StoreManagerInterface $storeManager,
\Magento\Framework\Api\FilterBuilder $filterBuilder,
\Magento\Catalog\Api\ProductAttributeRepositoryInterface $metadataServiceInterface,
\Magento\Framework\Api\ExtensibleDataObjectConverter $extensibleDataObjectConverter,
\Magento\Catalog\Model\Product\Option\Converter $optionConverter,
\Magento\Framework\Filesystem $fileSystem,
\Magento\Framework\Api\ExtensionAttribute\JoinProcessorInterface $extensionAttributesJoinProcessor,
CollectionProcessorInterface $collectionProcessor = null,
\Magento\Framework\Serialize\Serializer\Json $serializer = null,
$cacheLimit = 1000
) {
$this->collectionFactory = $collectionFactory;
$this->initializationHelper = $initializationHelper;
$this->searchResultsFactory = $searchResultsFactory;
$this->searchCriteriaBuilder = $searchCriteriaBuilder;
$this->resourceModel = $resourceModel;
$this->linkInitializer = $linkInitializer;
$this->linkTypeProvider = $linkTypeProvider;
$this->storeManager = $storeManager;
$this->attributeRepository = $attributeRepository;
$this->filterBuilder = $filterBuilder;
$this->metadataService = $metadataServiceInterface;
$this->extensibleDataObjectConverter = $extensibleDataObjectConverter;
$this->fileSystem = $fileSystem;
$this->extensionAttributesJoinProcessor = $extensionAttributesJoinProcessor;
$this->collectionProcessor = $collectionProcessor ?: $this->getCollectionProcessor();
$this->serializer = $serializer ?: \Magento\Framework\App\ObjectManager::getInstance()
->get(\Magento\Framework\Serialize\Serializer\Json::class);
$this->cacheLimit = (int)$cacheLimit;
}
/**
* Get key for cache
*
* @param array $data
* @return string
*/
protected function getCacheKey($data)
{
$serializeData = [];
foreach ($data as $key => $value) {
if (is_object($value)) {
$serializeData[$key] = $value->getId();
} else {
$serializeData[$key] = $value;
}
}
$serializeData = $this->serializer->serialize($serializeData);
return sha1($serializeData);
}
/**
* Add product to internal cache and truncate cache if it has more than cacheLimit elements.
*
* @param string $cacheKey
* @param \Magento\Catalog\Api\Data\ProductInterface $product
* @return void
*/
private function cacheProduct($cacheKey, \Magento\Catalog\Api\Data\ProductInterface $product)
{
$this->instancesById[$product->getId()][$cacheKey] = $product;
$this->instances[$product->getSku()][$cacheKey] = $product;
if ($this->cacheLimit && count($this->instances) > $this->cacheLimit) {
$offset = round($this->cacheLimit / -2);
$this->instancesById = array_slice($this->instancesById, $offset, null, true);
$this->instances = array_slice($this->instances, $offset);
}
}
/**
* {@inheritdoc}
*/
public function getList(\Magento\Framework\Api\SearchCriteriaInterface $searchCriteria)
{
/** @var \Magento\Catalog\Model\ResourceModel\Product\Collection $collection */
$collection = $this->collectionFactory->create();
$this->extensionAttributesJoinProcessor->process($collection);
$collection->addAttributeToSelect('*');
$collection->joinAttribute('status', 'catalog_product/status', 'entity_id', null, 'inner');
$collection->joinAttribute('visibility', 'catalog_product/visibility', 'entity_id', null, 'inner');
$this->collectionProcessor->process($searchCriteria, $collection);
$collection->load();
$collection->addCategoryIds();
$searchResult = $this->searchResultsFactory->create();
$searchResult->setSearchCriteria($searchCriteria);
$searchResult->setItems($collection->getItems());
$searchResult->setTotalCount($collection->getSize());
/* foreach ($collection->getItems() as $product) {
$this->cacheProduct(
$this->getCacheKey(
[
false,
$product->hasData(\Magento\Catalog\Model\Product::STORE_ID) ? $product->getStoreId() : null
]
),
$product
);
}
*/
return $searchResult;
}
/**
* Clean internal product cache
*
* @return void
*/
public function cleanCache()
{
$this->instances = null;
$this->instancesById = null;
}
/**
* Retrieve collection processor
*
* @deprecated 101.1.0
* @return CollectionProcessorInterface
*/
private function getCollectionProcessor()
{
if (!$this->collectionProcessor) {
$this->collectionProcessor = \Magento\Framework\App\ObjectManager::getInstance()->get(
'Magento\Catalog\Model\Api\SearchCriteria\ProductCollectionProcessor'
);
}
return $this->collectionProcessor;
}
}