123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223 |
- <?php
- /**
- * Copyright © Magento, Inc. All rights reserved.
- * See COPYING.txt for license details.
- */
- namespace Magento\Eav\Model;
- use Magento\Framework\Api\SearchCriteria\CollectionProcessor;
- use Magento\Framework\Api\SearchCriteria\CollectionProcessorInterface;
- use Magento\Framework\Exception\InputException;
- use Magento\Framework\Exception\NoSuchEntityException;
- use Magento\Framework\Exception\StateException;
- /**
- * @SuppressWarnings(PHPMD.CouplingBetweenObjects)
- */
- class AttributeRepository implements \Magento\Eav\Api\AttributeRepositoryInterface
- {
- /**
- * @var \Magento\Eav\Model\Config
- */
- protected $eavConfig;
- /**
- * @var \Magento\Eav\Model\ResourceModel\Entity\Attribute
- */
- protected $eavResource;
- /**
- * @var \Magento\Eav\Model\ResourceModel\Entity\Attribute\CollectionFactory
- */
- protected $attributeCollectionFactory;
- /**
- * @var \Magento\Eav\Api\Data\AttributeSearchResultsInterfaceFactory
- */
- protected $searchResultsFactory;
- /**
- * @var Entity\AttributeFactory
- */
- protected $attributeFactory;
- /**
- * @var \Magento\Framework\Api\ExtensionAttribute\JoinProcessorInterface
- */
- protected $joinProcessor;
- /**
- * @var CollectionProcessorInterface
- */
- private $collectionProcessor;
- /**
- * @param Config $eavConfig
- * @param \Magento\Eav\Model\ResourceModel\Entity\Attribute $eavResource
- * @param \Magento\Eav\Model\ResourceModel\Entity\Attribute\CollectionFactory $attributeCollectionFactory
- * @param \Magento\Eav\Api\Data\AttributeSearchResultsInterfaceFactory $searchResultsFactory
- * @param Entity\AttributeFactory $attributeFactory
- * @param \Magento\Framework\Api\ExtensionAttribute\JoinProcessorInterface $joinProcessor
- * @param CollectionProcessorInterface $collectionProcessor
- * @codeCoverageIgnore
- */
- public function __construct(
- \Magento\Eav\Model\Config $eavConfig,
- \Magento\Eav\Model\ResourceModel\Entity\Attribute $eavResource,
- \Magento\Eav\Model\ResourceModel\Entity\Attribute\CollectionFactory $attributeCollectionFactory,
- \Magento\Eav\Api\Data\AttributeSearchResultsInterfaceFactory $searchResultsFactory,
- \Magento\Eav\Model\Entity\AttributeFactory $attributeFactory,
- \Magento\Framework\Api\ExtensionAttribute\JoinProcessorInterface $joinProcessor,
- CollectionProcessorInterface $collectionProcessor = null
- ) {
- $this->eavConfig = $eavConfig;
- $this->eavResource = $eavResource;
- $this->attributeCollectionFactory = $attributeCollectionFactory;
- $this->searchResultsFactory = $searchResultsFactory;
- $this->attributeFactory = $attributeFactory;
- $this->joinProcessor = $joinProcessor;
- $this->collectionProcessor = $collectionProcessor ?: $this->getCollectionProcessor();
- }
- /**
- * {@inheritdoc}
- */
- public function save(\Magento\Eav\Api\Data\AttributeInterface $attribute)
- {
- try {
- $this->eavResource->save($attribute);
- } catch (\Exception $e) {
- throw new StateException(__("The attribute can't be saved."));
- }
- return $attribute;
- }
- /**
- * {@inheritdoc}
- */
- public function getList($entityTypeCode, \Magento\Framework\Api\SearchCriteriaInterface $searchCriteria)
- {
- if (!$entityTypeCode) {
- throw InputException::requiredField('entity_type_code');
- }
- /** @var \Magento\Eav\Model\ResourceModel\Entity\Attribute\Collection $attributeCollection */
- $attributeCollection = $this->attributeCollectionFactory->create();
- $this->joinProcessor->process($attributeCollection);
- $attributeCollection->addFieldToFilter('entity_type_code', ['eq' => $entityTypeCode]);
- $attributeCollection->join(
- ['entity_type' => $attributeCollection->getTable('eav_entity_type')],
- 'main_table.entity_type_id = entity_type.entity_type_id',
- []
- );
- $attributeCollection->joinLeft(
- ['eav_entity_attribute' => $attributeCollection->getTable('eav_entity_attribute')],
- 'main_table.attribute_id = eav_entity_attribute.attribute_id',
- []
- );
- $entityType = $this->eavConfig->getEntityType($entityTypeCode);
- $additionalTable = $entityType->getAdditionalAttributeTable();
- if ($additionalTable) {
- $attributeCollection->join(
- ['additional_table' => $attributeCollection->getTable($additionalTable)],
- 'main_table.attribute_id = additional_table.attribute_id',
- []
- );
- }
- $this->collectionProcessor->process($searchCriteria, $attributeCollection);
- // Group attributes by id to prevent duplicates with different attribute sets
- $attributeCollection->addAttributeGrouping();
- $attributes = [];
- /** @var \Magento\Eav\Api\Data\AttributeInterface $attribute */
- foreach ($attributeCollection as $attribute) {
- $attributes[] = $this->get($entityTypeCode, $attribute->getAttributeCode());
- }
- /** @var \Magento\Eav\Api\Data\AttributeSearchResultsInterface $searchResults */
- $searchResults = $this->searchResultsFactory->create();
- $searchResults->setSearchCriteria($searchCriteria);
- $searchResults->setItems($attributes);
- // if $searchCriteria has no page size - we can use count() on $attributeCollection
- // otherwise - we have to use getSize() on $attributeCollection
- // with this approach we can eliminate excessive COUNT requests in case page size is empty
- if ($searchCriteria->getPageSize()) {
- $searchResults->setTotalCount($attributeCollection->getSize());
- } else {
- $searchResults->setTotalCount(count($attributeCollection));
- }
- return $searchResults;
- }
- /**
- * {@inheritdoc}
- */
- public function get($entityTypeCode, $attributeCode)
- {
- /** @var \Magento\Eav\Api\Data\AttributeInterface $attribute */
- $attribute = $this->eavConfig->getAttribute($entityTypeCode, $attributeCode);
- if (!$attribute || !$attribute->getAttributeId()) {
- throw new NoSuchEntityException(
- __(
- 'The attribute with a "%1" attributeCode doesn\'t exist. Verify the attribute and try again.',
- $attributeCode
- )
- );
- }
- return $attribute;
- }
- /**
- * {@inheritdoc}
- */
- public function delete(\Magento\Eav\Api\Data\AttributeInterface $attribute)
- {
- try {
- $this->eavResource->delete($attribute);
- } catch (\Exception $e) {
- throw new StateException(__("The attribute can't be deleted."));
- }
- return true;
- }
- /**
- * {@inheritdoc}
- */
- public function deleteById($attributeId)
- {
- /** @var \Magento\Eav\Model\Entity\Attribute $attribute */
- $attribute = $this->attributeFactory->create();
- $this->eavResource->load($attribute, $attributeId);
- if (!$attribute->getAttributeId()) {
- throw new NoSuchEntityException(
- __('The attribute with a "%1" ID doesn\'t exist. Verify the attribute and try again.', $attributeId)
- );
- }
- $this->delete($attribute);
- return true;
- }
- /**
- * Retrieve collection processor
- *
- * @deprecated 101.0.0
- * @return CollectionProcessorInterface
- */
- private function getCollectionProcessor()
- {
- if (!$this->collectionProcessor) {
- $this->collectionProcessor = \Magento\Framework\App\ObjectManager::getInstance()->get(
- CollectionProcessor::class
- );
- }
- return $this->collectionProcessor;
- }
- }
|