![]() 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/vendor/magento/module-catalog/Model/CategoryRepository/ |
<?php /** * Copyright © Magento, Inc. All rights reserved. * See COPYING.txt for license details. */ declare(strict_types=1); namespace Magento\Catalog\Model\CategoryRepository; use Magento\Catalog\Api\Data\CategoryInterface; use Magento\Catalog\Model\Attribute\ScopeOverriddenValue; use Magento\Catalog\Model\Category; use Magento\Catalog\Api\CategoryAttributeRepositoryInterface as AttributeRepository; use Magento\Eav\Api\Data\AttributeInterface; use Magento\Eav\Model\Entity\Attribute\ScopedAttributeInterface; use Magento\Framework\Api\FilterBuilder; use Magento\Framework\Api\SearchCriteriaBuilder; use Magento\Store\Model\Store; /** * Add data to category entity and populate with default values */ class PopulateWithValues { /** * @var ScopeOverriddenValue */ private $scopeOverriddenValue; /** * @var AttributeRepository */ private $attributeRepository; /** * @var SearchCriteriaBuilder */ private $searchCriteriaBuilder; /** * @var FilterBuilder */ private $filterBuilder; /** * @var AttributeInterface[] */ private $attributes; /** * @param ScopeOverriddenValue $scopeOverriddenValue * @param AttributeRepository $attributeRepository * @param SearchCriteriaBuilder $searchCriteriaBuilder * @param FilterBuilder $filterBuilder */ public function __construct( ScopeOverriddenValue $scopeOverriddenValue, AttributeRepository $attributeRepository, SearchCriteriaBuilder $searchCriteriaBuilder, FilterBuilder $filterBuilder ) { $this->scopeOverriddenValue = $scopeOverriddenValue; $this->attributeRepository = $attributeRepository; $this->searchCriteriaBuilder = $searchCriteriaBuilder; $this->filterBuilder = $filterBuilder; } /** * Set null to entity default values * * @param CategoryInterface $category * @param array $existingData * @return void */ public function execute(CategoryInterface $category, array $existingData): void { $storeId = $existingData['store_id'] ?? Store::DEFAULT_STORE_ID; if ((int)$storeId !== Store::DEFAULT_STORE_ID) { $overriddenValues = array_filter( $category->getData(), function ($key) use ($category, $storeId) { /** @var Category $category */ return $this->scopeOverriddenValue->containsValue( CategoryInterface::class, $category, $key, $storeId ); }, ARRAY_FILTER_USE_KEY ); $defaultValues = array_diff_key($category->getData(), $overriddenValues); array_walk( $defaultValues, function (&$value, $key) { $attributes = $this->getAttributes(); if (isset($attributes[$key]) && !$attributes[$key]->isStatic()) { $value = null; } } ); $category->addData($defaultValues); } $category->addData($existingData); $useDefaultAttributes = array_filter( $category->getData(), function ($attributeValue) { return null === $attributeValue; } ); $category->setData( 'use_default', array_map( function () { return true; }, $useDefaultAttributes ) ); } /** * Returns entity attributes. * * @return AttributeInterface[] */ private function getAttributes(): array { if ($this->attributes) { return $this->attributes; } $searchResult = $this->attributeRepository->getList( $this->searchCriteriaBuilder->addFilters( [ $this->filterBuilder ->setField('is_global') ->setConditionType('in') ->setValue([ScopedAttributeInterface::SCOPE_STORE, ScopedAttributeInterface::SCOPE_WEBSITE]) ->create() ] )->create() ); $this->attributes = []; foreach ($searchResult->getItems() as $attribute) { $this->attributes[$attribute->getAttributeCode()] = $attribute; } return $this->attributes; } }