В ядре 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
Спасибо за вашу помощь, я действительно застрял с этим.