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文件覆盖功能的任何建议。

谢谢。

Answers:


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 dir以应用此更改


使用插件方法对我不起作用。页面消失,仅选择框显示整个页面中的值为空。
Rakesh Jesadiya

那么很可能在某个地方仍然有错误。检查您在magento中的错误日志,以及您的网络服务器错误日志。您是否在.htaccess文件中启用了开发人员模式?我也不确定当原始方法没有参数时是否必须返回一个空数组或者什么也不要返回(应该不会有所作为,但是可以)
David Verholen

我必须在下拉列表中显示缺货产品选项,因此我必须从上述功能中删除条件(但使用插件无法正常工作),也不会显示任何错误log.any建议。
Rakesh Jesadiya '16

既然您已经问过这种方式,那么只要更改配置以显示前端缺货的产品就足够了。在您的后端中,转到商店->配置。然后选择目录->库存选项卡,将缺货产品的显示更改为yes
David Verholen '16

我所做的那些设置,我想在配置产品中显示缺货的产品选项。默认情况下,缺货的产品配置选项不会显示在“配置产品详细信息”页面的下拉列表中。所以我必须在下拉菜单中显示这些选项。
Rakesh Jesadiya '16

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


}

应该为type =“ Namespace \ Module \ Block \ Outstock”
Rooster242 '17

但不适用于列表页面,为什么?
zed Blackbeard

4

您需要覆盖

Magento\Swatches\Block\Product\Renderer\Configurable 

而不是覆盖

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

文件。


但不适用于列表页面,为什么?
zed Blackbeard,

1

覆盖configurable.php文件的功能。

1)首先在文件夹Test / Configuration / etc中创建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>

2)现在在文件夹Test \ Configuration \ Block中创建Outstock.php阻止文件

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


}

但不适用于列表页面,为什么?
zed Blackbeard,

如何覆盖\ Magento \ ConfigurableProduct \ Block \ Product \ View \ Type \ Configurable我正在尝试但无法在上述代码下工作
Rv Singh

在我要求的可配置产品选项下拉列表中,删除“自定义选项”标签
Rv Singh,
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.