Magento 2:ブロックファイルを上書きMagento \ ConfigurableProduct \ Block \ Product \ View \ Type \ Configurable.php


8

magento 2 からオーバーライドfunction getAllowProducts()する方法Magento\ConfigurableProduct\Block\Product\View\Type\Configurable.php

上記の関数をオーバーライドしたいのですが、関数の変更を取得せず、何も問題を表示しません。ログファイル内にエラー表示はありません。

ここでコードを共有します

registration.php ファイル、

<?php

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

etcフォルダー、

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 dirを必ずクリアしてください


プラグインメソッドを使用すると、動作しません。ページが非表示になり、ページ全体でnull値の選択ボックスのみが表示されます。
Rakesh Jesadiya、2016

その後、おそらくどこかにまだエラーがあります。magentoのエラーログとウェブサーバーのエラーログを確認します。.htaccessファイルで開発者モードを有効にしていますか?また、元のメソッドに引数がない場合、空の配列を返す必要があるのか​​、それとも何も返さないのかわかりませんでした(違いを生むべきではありませんが)
David Verholen

私はドロップダウンで在庫切れの製品オプションを表示する必要があるので、上記の関数からif条件を削除する必要がありますが、プラグインを使用しても機能せず、エラーログが表示されません。
Rakesh Jesadiya、2016

このように質問したら、フロントエンドの在庫切れの商品を表示するように構成を変更するだけで十分な場合があります。バックエンドで、[ストア]-> [構成]に移動します。次に[カタログ]-> [在庫]タブを選択し、在庫切れの商品の表示を[はい]に変更します
David Verholen

私が行った設定は、config product内の在庫切れの製品オプションを表示したいです。デフォルトでは、在庫切れの製品の構成オプションは、構成製品の詳細ページのドロップダウン内に表示されません。だから私はそれらのオプションをドロップダウンに表示する必要があります。
Rakesh Jesadiya、2016

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

しかし、それはリストページでは機能しません、なぜですか?
zeed Blackbeard 2018

4

オーバーライドする必要があります

Magento\Swatches\Block\Product\Renderer\Configurable 

上書きする代わりに

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

ファイル。


しかし、それはリストページでは機能しません、なぜですか?
zeed blackbeard 2018

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


}

しかし、それはリストページでは機能しません、なぜですか?
zeed blackbeard 2018

\ Magento \ ConfigurableProduct \ Block \ Product \ View \ Type \ Configurableをオーバーライドする方法を試してみましたが、上記のコードでは機能しません
Rv Singh

私の要件では、構成可能な製品オプションのドロップダウンで「カスタムオプション」ラベルを削除
Rv Singh
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.