123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115 |
- <?php
- /**
- * Copyright © Magento, Inc. All rights reserved.
- * See COPYING.txt for license details.
- */
- declare(strict_types=1);
- namespace Magento\GraphQl\Model;
- use Magento\Eav\Api\AttributeManagementInterface;
- use Magento\Eav\Api\AttributeSetRepositoryInterface;
- use Magento\Eav\Api\Data\AttributeInterface;
- use Magento\Framework\Api\FilterBuilder;
- use Magento\Framework\Api\MetadataServiceInterface;
- use Magento\Framework\Api\SearchCriteriaBuilder;
- use Magento\Framework\Exception\NoSuchEntityException;
- use Magento\Framework\GraphQl\Exception\GraphQlNoSuchEntityException;
- /**
- * Iterate through all attribute sets to retrieve attributes for any given entity type
- */
- class EntityAttributeList
- {
- /**
- * @var AttributeManagementInterface
- */
- private $attributeManagement;
- /**
- * @var AttributeSetRepositoryInterface
- */
- private $attributeSetRepository;
- /**
- * @var SearchCriteriaBuilder
- */
- private $searchCriteriaBuilder;
- /**
- * @var FilterBuilder
- */
- private $filterBuilder;
- /**
- * @param AttributeManagementInterface $attributeManagement
- * @param AttributeSetRepositoryInterface $attributeSetRepository
- * @param SearchCriteriaBuilder $searchCriteriaBuilder
- * @param FilterBuilder $filterBuilder
- */
- public function __construct(
- AttributeManagementInterface $attributeManagement,
- AttributeSetRepositoryInterface $attributeSetRepository,
- SearchCriteriaBuilder $searchCriteriaBuilder,
- FilterBuilder $filterBuilder
- ) {
- $this->attributeManagement = $attributeManagement;
- $this->attributeSetRepository = $attributeSetRepository;
- $this->searchCriteriaBuilder = $searchCriteriaBuilder;
- $this->filterBuilder = $filterBuilder;
- }
- /**
- * Retrieve all EAV and custom attribute codes from all attribute sets for given entity code.
- *
- * Returned in the format [$attributeCode => $isSortable] with $isSortable being a boolean value where an attribute
- * can be sorted with in a search criteria expression. The metadata service parameter is only required if type has
- * custom attributes.
- *
- * @param string $entityCode
- * @param MetadataServiceInterface $metadataService
- * @return boolean[]
- * @throws GraphQlNoSuchEntityException
- */
- public function getDefaultEntityAttributes(
- string $entityCode,
- MetadataServiceInterface $metadataService = null
- ) : array {
- $this->searchCriteriaBuilder->addFilters(
- [
- $this->filterBuilder
- ->setField('entity_type_code')
- ->setValue($entityCode)
- ->setConditionType('eq')
- ->create(),
- ]
- );
- $attributeSetList = $this->attributeSetRepository->getList($this->searchCriteriaBuilder->create())->getItems();
- $attributes = [];
- foreach ($attributeSetList as $attributeSet) {
- try {
- $attributes = array_merge(
- $attributes,
- $this->attributeManagement->getAttributes($entityCode, $attributeSet->getAttributeSetId())
- );
- } catch (NoSuchEntityException $exception) {
- throw new GraphQlNoSuchEntityException(__('Entity code %1 does not exist.', [$entityCode]));
- }
- }
- $attributeCodes = [];
- $metadata = $metadataService ? $metadataService->getCustomAttributesMetadata() : [];
- foreach ($metadata as $customAttribute) {
- if (!array_key_exists($customAttribute->getAttributeCode(), $attributeCodes)) {
- $attributeCodes[$customAttribute->getAttributeCode()] = false;
- }
- }
- /** @var AttributeInterface $attribute */
- foreach ($attributes as $attribute) {
- if (!array_key_exists($attribute->getAttributeCode(), $attributeCodes)) {
- $attributeCodes[$attribute->getAttributeCode()]
- = ((! $attribute->getIsUserDefined()) && !is_array($attribute));
- }
- }
- return $attributeCodes;
- }
- }
|