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 

файл.


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

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');
    }


}

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

Как переопределить \ Magento \ ConfigurableProduct \ Block \ Product \ View \ Type \ Configurable Я пытаюсь, но не работаю над кодом
— Р. В. Сингх,

В моем требовании настраиваемый параметр продукта в раскрывающемся
— Rv Singh
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.