Плагин для замены метода параметрами, измененными другими методами - PullRequest
1 голос
/ 16 января 2020

В ядре magento есть метод с таким кодом, который я хочу переопределить

class A extends B

protected $param;

public function __construct(/*params whatever*/){
    parent::__construct();
}

public function myFunctionA(){/*Use $param modified by some previous methods */}

Он находится в namespace Magento\CatalogImportExport\Model\Export; классе Product.php И методе filterAttributeCollection(\Magento\Eav\Model\ResourceModel\Entity\Attribute\Collection $collection)

Полный метод приведен в нижней части этого поста, чтобы не искать его самостоятельно.

Поэтому я создал плагин для переопределения этого метода и написал свой собственный aroundFilterAttributeCollection в этом плагине.

Проблема в том, что при использовании моего плагина возникает ошибка 500, но я не знаю, почему у меня нет журналов.

В моем файле плагина php я определил только вокруг метода в классе, потому что все примеры, которые я вижу, кажутся такими. Но есть небольшая специфика. В методе есть аргумент, который обновляется другими методами из исходного класса Product. php. Поэтому, если я не определю его в моем новом классе плагинов, он будет неизвестен и, вероятно, вызовет ошибку.

Но попытка расширить, чтобы сказать, что мой плагин расширяет исходный класс Product, похоже, не является решением ни.

Для возобновления проблемы: Как правильно заменить этот метод?

public function filterAttributeCollection(\Magento\Eav\Model\ResourceModel\Entity\Attribute\Collection $collection)
 {
     $validTypes = array_keys($this->_productTypeModels);
     $validTypes = array_combine($validTypes, $validTypes);

     foreach (parent::filterAttributeCollection($collection) as $attribute) {
         if (in_array($attribute->getAttributeCode(), $this->_bannedAttributes)) {
             $collection->removeItemByKey($attribute->getId());
             continue;
         }
         $attrApplyTo = $attribute->getApplyTo();
         $attrApplyTo = array_combine($attrApplyTo, $attrApplyTo);
         $attrApplyTo = $attrApplyTo ? array_intersect_key($attrApplyTo, $validTypes) : $validTypes;

         if ($attrApplyTo) {
             foreach ($attrApplyTo as $productType) {
                 // override attributes by its product type model
                 if ($this->_productTypeModels[$productType]->overrideAttribute($attribute)) {
                     break;
                 }
             }
         } else {
             // remove attributes of not-supported product types
             $collection->removeItemByKey($attribute->getId());
         }
     }
     return $collection;
 }

Как вы можете видеть, например, есть $this->_productTypeModels, который Мне нужно использовать в плагине вокруг метода. Другая сложная вещь - это вызов родительской функции в l oop, который может измениться один раз в плагине?

Вы можете получить доступ ко всему файлу Product.php здесь в официальной документации Magento 2: https://www.magentoextensions.org/documentation/module-catalog-import-export_2_model_2_export_2_product_8php_source.html

Спасибо за вашу помощь, я действительно застрял с этим.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...