123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133 |
- <?php
- /**
- * Copyright © Magento, Inc. All rights reserved.
- * See COPYING.txt for license details.
- */
- declare(strict_types=1);
- namespace Magento\ConfigurableProductGraphQl\Model\Options;
- use Magento\Catalog\Api\Data\ProductInterface;
- use Magento\Catalog\Model\Product;
- use Magento\ConfigurableProduct\Model\ResourceModel\Product\Type\Configurable\Attribute\CollectionFactory;
- use Magento\ConfigurableProduct\Model\ResourceModel\Product\Type\Configurable\Attribute\Collection
- as AttributeCollection;
- use Magento\ConfigurableProduct\Model\Product\Type\Configurable\Attribute;
- use Magento\Catalog\Model\ProductFactory;
- use Magento\Framework\EntityManager\MetadataPool;
- /**
- * Collection for fetching options for all configurable options pulled back in result set.
- */
- class Collection
- {
- /**
- * @var CollectionFactory
- */
- private $attributeCollectionFactory;
- /**
- * @var ProductFactory
- */
- private $productFactory;
- /**
- * @var MetadataPool
- */
- private $metadataPool;
- /**
- * @var int[]
- */
- private $productIds = [];
- /**
- * @var array
- */
- private $attributeMap = [];
- /**
- * @param CollectionFactory $attributeCollectionFactory
- * @param ProductFactory $productFactory
- * @param MetadataPool $metadataPool
- */
- public function __construct(
- CollectionFactory $attributeCollectionFactory,
- ProductFactory $productFactory,
- MetadataPool $metadataPool
- ) {
- $this->attributeCollectionFactory = $attributeCollectionFactory;
- $this->productFactory = $productFactory;
- $this->metadataPool = $metadataPool;
- }
- /**
- * Add product id to attribute collection filter.
- *
- * @param int $productId
- */
- public function addProductId(int $productId) : void
- {
- if (!in_array($productId, $this->productIds)) {
- $this->productIds[] = $productId;
- }
- }
- /**
- * Retrieve attributes for given product id or empty array
- *
- * @param int $productId
- * @return array
- */
- public function getAttributesByProductId(int $productId) : array
- {
- $attributes = $this->fetch();
- if (!isset($attributes[$productId])) {
- return [];
- }
- return $attributes[$productId];
- }
- /**
- * Fetch attribute data
- *
- * @return array
- */
- private function fetch() : array
- {
- if (empty($this->productIds) || !empty($this->attributeMap)) {
- return $this->attributeMap;
- }
- $linkField = $this->metadataPool->getMetadata(ProductInterface::class)->getLinkField();
- /** @var AttributeCollection $attributeCollection */
- $attributeCollection = $this->attributeCollectionFactory->create();
- foreach ($this->productIds as $id) {
- /** @var Product $product */
- $product = $this->productFactory->create();
- $product->setData($linkField, $id);
- $attributeCollection->setProductFilter($product);
- }
- /** @var Attribute $attribute */
- foreach ($attributeCollection->getItems() as $attribute) {
- $productId = (int)$attribute->getProductId();
- if (!isset($this->attributeMap[$productId])) {
- $this->attributeMap[$productId] = [];
- }
- $attributeData = $attribute->getData();
- $this->attributeMap[$productId][$attribute->getId()] = $attribute->getData();
- $this->attributeMap[$productId][$attribute->getId()]['id'] = $attribute->getId();
- $this->attributeMap[$productId][$attribute->getId()]['attribute_code']
- = $attribute->getProductAttribute()->getAttributeCode();
- $this->attributeMap[$productId][$attribute->getId()]['values'] = $attributeData['options'];
- $this->attributeMap[$productId][$attribute->getId()]['label']
- = $attribute->getProductAttribute()->getStoreLabel();
- }
- return $this->attributeMap;
- }
- }
|