Magento 2: переопределить файл блока Magento \ ConfigurableProduct \ Block \ Product \ View \ Type \ Configurable.php

8

Как переопределить function getAllowProducts()из Magento\ConfigurableProduct\Block\Product\View\Type\Configurable.phpв magento 2.

Я хочу переопределить вышеуказанную функцию, но не получаю изменения функции и ничего не отображает никаких проблем. Там нет никаких ошибок отображения внутри файла журнала.

я поделюсь своим кодом здесь,

registration.php файл,

<?php

\Magento\Framework\Component\ComponentRegistrar::register(
    \Magento\Framework\Component\ComponentRegistrar::MODULE,
    'Test_Configuration',
    __DIR__
);

и т.д. папка,

module.xml 

код есть,

<?xml version="1.0"?>
<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:framework:Module/etc/module.xsd">
  <module name="Test_Configuration" setup_version="1.0.0"/>
</config>

у меня есть блок переопределения внутри di.xmlкода

<?xml version="1.0"?>
<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:framework:ObjectManager/etc/config.xsd">
    <preference for="Magento\ConfigurableProduct\Block\Product\View\Type\Configurable" type="Test\Configuration\Block\Outstock" />
</config>

Заблокировать папку, Outstock.phpфайл,

<?php
namespace Test\Configuration\Block;

class Outstock extends \Magento\ConfigurableProduct\Block\Product\View\Type\Configurable
{
    public function getAllowProducts()
    {
        if (!$this->hasAllowProducts()) {
            $products = [];
            $skipSaleableCheck = $this->catalogProduct->getSkipSaleableCheck();
            $allProducts = $this->getProduct()->getTypeInstance()->getUsedProducts($this->getProduct(), null);
            foreach ($allProducts as $product) {
                    $products[] = $product;
            }
            $this->setAllowProducts($products);
        }
        return $this->getData('allow_products');
    }   

    protected function _toHtml()
    {
        $this->setModuleName($this->extractModuleName('Magento\ConfigurableProduct\Block\Product\View\Type\Configurable'));
        return parent::_toHtml();
    } 
}

У меня нет никаких сообщений об ошибках, не генерируется журнал для этого файла, и модуль активирован. внутри setup_moduleзаписи генерируются.

Любое предложение для переопределения функции configurable.phpфайла.

Спасибо.

Ракеш Джесадия
источник

Ответы:

5

вам не нужно переопределять предпочтения, и вы не должны.

Вы можете легко использовать плагин для установки данных allow_products до вызова метода. Вы найдете хороший учебник о плагинах здесь:

http://alanstorm.com/magento_2_object_manager_plugin_system

Чтобы создать плагин, сначала нужно добавить тип в ваш файл etc / frontend / di.xml.

<type name="Magento\ConfigurableProduct\Block\Product\View\Type\Configurable">
    <plugin name="changeAllowProductsBehaviour" type="Vendor\Module\Model\ConfigurableProduct\Block\Product\View\Type\Configurable\Plugin" sortOrder="10" />
</type>

Тогда ваш класс плагинов должен выглядеть так:

<?php
namespace Vendor\Module\Model\ConfigurableProduct\Block\Product\View\Type\Configurable;

class Plugin
{
    /**
     * getAllowProducts
     *
     * @param \Magento\ConfigurableProduct\Block\Product\View\Type\Configurable $subject
     *
     * @return array
     */
    public function beforeGetAllowProducts($subject)
    {
        if (!$subject->hasData('allow_products')) {
            $products = [];
            $allProducts = $subject->getProduct()->getTypeInstance()->getUsedProducts($subject->getProduct(), null);
            foreach ($allProducts as $product) {
                    $products[] = $product;
            }
            $subject->setData('allow_products', $products);
        }

        return [];
    }

}

Обязательно очистите кеш, а также каталог var / generation, чтобы применить эти изменения

Дэвид Верхолен
источник
это не работает для меня, используя метод плагина. страница исчезнет и выберите только отображение окна с нулевым значением на всей странице.
Ракеш Джесадия
тогда, скорее всего, где-то все еще есть ошибка. Проверьте журналы ошибок в magento, а также журнал ошибок веб-сервера. У вас включен режим разработчика в файле .htaccess? Также я не был уверен, нужно ли вам возвращать пустой массив или, вернее, ничего, когда оригинальный метод не имеет аргументов (не должен иметь значения, но может)
Дэвид Верхолен
Мне нужно отобразить опцию «Нет на складе» в выпадающем меню, поэтому я должен удалить функцию «условие сверху», но с помощью плагина он не работает и не отображать какие-либо ошибки. Любое предложение.
Ракеш Джесадия,
Теперь, когда вы спрашиваете об этом, может быть достаточно, если вы просто измените конфигурацию, чтобы показывать отсутствующие продукты в веб-интерфейсе. В вашем бэкэнде зайдите в Магазины -> Конфигурация. Затем выберите «Каталог» -> «Инвентаризация» и измените показ товаров, отсутствующих на складе, на «да»
Дэвид Верхолен
те настройки, которые я сделал, я хочу отобразить на складе параметры продукта в конфигурации продукта. по умолчанию параметры конфигурации, отсутствующие на складе, не отображаются в раскрывающемся меню страницы сведений о конфигурации продукта. поэтому я должен отобразить эти параметры в раскрывающемся списке.
Ракеш Джесадия,
12

Для версии Magento2.1 вам необходимо переопределить Magento\Swatches\Block\Product\Renderer\Configurable

1) Создать di.xml файл в папкеNamespace\Module\etc

<?xml version="1.0"?>
<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:framework:ObjectManager/etc/config.xsd">
<preference for="Magento\Swatches\Block\Product\Renderer\Configurable" type="Namespace\Module\Block\Outstock" />
</config>

2) Создать Outstock.phpфайл блокировки в папкеNamespace\Module\Block

<?php 

namespace Namespace\Module\Block;

class Outstock extends \Magento\Swatches\Block\Product\Renderer\Configurable
{

    public function getAllowProducts()
    {
        if (!$this->hasAllowProducts()) {
            $products = [];
            $skipSaleableCheck = $this->catalogProduct->getSkipSaleableCheck();
            $allProducts = $this->getProduct()->getTypeInstance()->getUsedProducts($this->getProduct(), null);
            foreach ($allProducts as $product) {
                if ($product->isSaleable() || $skipSaleableCheck) {
                    $products[] = $product;
                }
            }
            $this->setAllowProducts($products);
        }
        return $this->getData('allow_products');
    }


}
Ведущий разработчик
источник
Должен быть тип = "Пространство имен \ Модуль \ Block \ Outstock"
Rooster242
но это не работает для страницы списка, почему?
Зед Черная Борода
4

Вы должны переопределить

Magento\Swatches\Block\Product\Renderer\Configurable 

вместо переопределения

Magento\ConfigurableProduct\Block\Product\View\Type\Configurable 

файл.

Rejoe
источник
но это не работает для страницы списка, почему?
Зед Черная Борода
1

Переопределить функцию файла configurable.php.

1) Сначала создайте файл di.xml в Папке Test / Configuration / etc

<?xml version="1.0"?>
<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:framework:ObjectManager/etc/config.xsd">
<preference for="Magento\ConfigurableProduct\Block\Product\View\Type\Configurable" type="Test\Configuration\Block\Outstock" />
</config>

2) Теперь создайте файл блока Outstock.php в папке \ Test \ Configuration \ Block

<?php 

namespace Test\Configuration\Block;

use Magento\ConfigurableProduct\Block\Product\View\Type\Configurable;

class Outstock extends \Magento\ConfigurableProduct\Block\Product\View\Type\Configurable
{

    public function getAllowProducts()
    {
        if (!$this->hasAllowProducts()) {
            $products = [];
            $skipSaleableCheck = $this->catalogProduct->getSkipSaleableCheck();
            $allProducts = $this->getProduct()->getTypeInstance()->getUsedProducts($this->getProduct(), null);
            foreach ($allProducts as $product) {
                if ($product->isSaleable() || $skipSaleableCheck) {
                    $products[] = $product;
                }
            }
            $this->setAllowProducts($products);
        }
        return $this->getData('allow_products');
    }


}
Cartin24
источник
но это не работает для страницы списка, почему?
Зед Черная Борода
Как переопределить \ Magento \ ConfigurableProduct \ Block \ Product \ View \ Type \ Configurable Я пытаюсь, но не работаю над кодом
Р. В. Сингх,
В моем требовании настраиваемый параметр продукта в раскрывающемся
Rv Singh