![]() Server : Apache System : Linux server2.corals.io 4.18.0-348.2.1.el8_5.x86_64 #1 SMP Mon Nov 15 09:17:08 EST 2021 x86_64 User : corals ( 1002) PHP Version : 7.4.33 Disable Function : exec,passthru,shell_exec,system Directory : /home/corals/old/app/code/Cnc/SearchAutocomplete/Index/Magento/Catalog/ |
<?php /** * Copyright (c) 2019 Kaliop Digital Commerce (https://digitalcommerce.kaliop.com) All Rights Reserved. * https://opensource.org/licenses/OSL-3.0 Open Software License (OSL 3.0) * cnc_searchautocomplete_m2 * <[email protected]> */ declare(strict_types=1); namespace Cnc\SearchAutocomplete\Index\Magento\Catalog; use Cnc\Catalog\Model\Product\States as ProductStates; use Cnc\Catalog\Model\Product\Stock as ProductStock; use Magento\Catalog\Api\Data\ProductInterface; use Magento\Catalog\Model\ResourceModel\Product\CollectionFactory as ProductCollectionFactory; use Magento\Review\Model\ResourceModel\Review\Summary\CollectionFactory as SummaryCollectionFactory; use Mirasvit\Search\Index\Magento\Catalog\Product\InstantProvider; use Mirasvit\Search\Service\IndexService; class ProductInstantProvider extends InstantProvider { /** * @var InstantProvider\Mapper */ private $mapper; /** * @var SummaryCollectionFactory */ private $summaryFactory; /** * @var ProductCollectionFactory */ private $productCollectionFactory; private $reviews = []; /** * @var ProductStates */ private $productStates; /** * @var ProductStock */ private $productStock; public function __construct( InstantProvider\Mapper $mapper, SummaryCollectionFactory $summaryFactory, ProductCollectionFactory $productCollectionFactory, IndexService $indexService, ProductStates $productStates, ProductStock $productStock ) { parent::__construct($mapper, $indexService); $this->mapper = $mapper; $this->summaryFactory = $summaryFactory; $this->productCollectionFactory = $productCollectionFactory; $this->productStates = $productStates; $this->productStock = $productStock; } public function getItems(int $storeId, int $limit, int $page = 1): array { /** @var \Magento\CatalogSearch\Model\ResourceModel\Fulltext\Collection $collection */ $collection = $this->getCollection($limit); $collection->addAttributeToSelect('name') ->addAttributeToSelect('short_description') ->addAttributeToSelect('description'); $this->prepareRatingData($collection->getAllIds(), $storeId); $items = []; foreach ($collection as $product) { $items[] = $this->mapProduct($product, $storeId); } return $items; } private function mapProduct(ProductInterface $product, int $storeId): array { // @override START // States (init empty values first, in order to make knockoutjs conditions safe) $initialStates = [ 'state_' . ProductStates::STATE_NEW => null, 'state_' . ProductStates::STATE_EXCHANGE => null, 'state_' . ProductStates::STATE_USED => null, 'state_' . ProductStates::STATE_REFURBISHED => null ]; $productStates = $this->productStates->getProductStates($product, 'state_'); $resultStates = array_merge($initialStates, $productStates); // @override END $itemData = [ 'name' => $this->mapper->getProductName($product), 'url' => $this->mapper->getProductUrl($product, $storeId), 'sku' => $this->mapper->getProductSku($product), 'description' => $this->mapper->getDescription($product), 'image' => $this->mapper->getProductImage($product, $storeId), 'price' => $this->mapper->getPrice($product), 'rating' => $this->mapper->getRating($product, $storeId, $this->reviews), 'cart' => $this->mapper->getCart($product, $storeId), // @override START // Stock/Availability 'stock_status_css_class' => $this->productStock->getStatusCssClass($product), 'stock_status_label' => $this->productStock->getStatusLabel($product), // Delivery 'delivery_label' => $this->productStock->getDeliveryDelayLabel($product), // @override END ]; return array_merge($itemData, $resultStates); } private function prepareRatingData(array $productIds, int $storeId): void { $reviewsCollection = $this->summaryFactory->create() ->addEntityFilter($productIds) ->addStoreFilter($storeId) ->load(); /** @var \Magento\Review\Model\Review\Summary $reviewSummary */ foreach ($reviewsCollection as $reviewSummary) { $this->reviews[$reviewSummary->getData('entity_pk_value')] = $reviewSummary; } } }