Magento 2: Blockdatei überschreiben Magento \ ConfigurableProduct \ Block \ Product \ View \ Type \ Configurable.php

8

Wie außer Kraft setzen function getAllowProducts()von Magento\ConfigurableProduct\Block\Product\View\Type\Configurable.phpin magento 2.

Ich möchte die obige Funktion überschreiben, bekomme aber keine Funktionsänderungen und nichts zeigt ein Problem an. In der Protokolldatei wird kein Fehler angezeigt.

Ich werde meinen Code hier teilen,

registration.php Datei,

<?php

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

etc Ordner,

module.xml 

Code ist,

<?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>

Ich habe Override Block im di.xmlCode ist

<?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>

Ordner, Outstock.phpDatei blockieren,

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

Ich habe keine Fehleranzeige, kein Protokoll für diese Datei generiert und das Modul ist aktiviert. Inneneintrag setup_modulewerden generiert.

Jeder Vorschlag für die Überschreibungsfunktion der configurable.phpDatei.

Vielen Dank.

Rakesh Jesadiya
quelle

Antworten:

5

Sie müssen die Präferenz nicht überschreiben und sollten es auch nicht.

Sie können einfach ein Plugin verwenden, um die Daten für allow_products festzulegen, bevor die Methode aufgerufen wird. Ein nettes Tutorial zu Plugins finden Sie hier:

http://alanstorm.com/magento_2_object_manager_plugin_system

Um Ihr Plugin zu erstellen, müssen Sie zuerst einen Typ zu Ihrer etc / frontend / di.xml hinzufügen

<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>

Dann sollte Ihre Plugin-Klasse folgendermaßen aussehen:

<?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 [];
    }

}

Stellen Sie sicher, dass Sie den Cache und auch Ihr Var / Generation-Verzeichnis löschen, damit diese Änderungen angewendet werden

David Verholen
quelle
Es funktioniert nicht für mich mit Plugin-Methode. Seite verschwinden und nur Feldanzeige mit Nullwert auf der gesamten Seite auswählen.
Rakesh Jesadiya
dann liegt höchstwahrscheinlich noch irgendwo ein fehler vor. Überprüfen Sie Ihre Fehlerprotokolle in Magento und auch Ihr Webserver-Fehlerprotokoll. Haben Sie den Entwicklermodus in der .htaccess-Datei aktiviert? Ich war mir auch nicht sicher, ob Sie ein leeres Array oder eher nichts zurückgeben müssen, wenn die ursprüngliche Methode keine Argumente enthält (sollte keinen Unterschied machen, könnte aber)
David Verholen
Ich muss die Option "Nicht vorrätige Produkte" in der Dropdown-Liste anzeigen, damit ich die Bedingung von der obigen Funktion entfernen kann, aber wenn das Plugin nicht funktioniert, wird auch kein Fehlerprotokoll angezeigt.
Rakesh Jesadiya
Jetzt, da Sie auf diese Weise fragen, kann es ausreichend sein, wenn Sie nur die Konfiguration ändern, um nicht vorrätige Produkte im Frontend anzuzeigen. Gehen Sie in Ihrem Backend zu Stores -> Configuration. Wählen Sie dann Katalog-> Registerkarte Inventar und ändern Sie die Anzeige von nicht vorrätigen Produkten in Ja
David Verholen
Diese Einstellungen, die ich vorgenommen habe, möchte ich nicht vorrätige Produktoptionen im Konfigurationsprodukt anzeigen. Standardmäßig werden die Konfigurationsoptionen für nicht vorrätige Produkte nicht in der Dropdown-Liste der Konfigurationsproduktdetailseite angezeigt. Also muss ich diese Optionen in der Dropdown-Liste anzeigen.
Rakesh Jesadiya
12

Für die Magento2.1-Version müssen Sie überschreiben Magento\Swatches\Block\Product\Renderer\Configurable

1) Erstellen Sie eine di.xml Datei im OrdnerNamespace\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) Erstellen Sie eine Outstock.phpBlockdatei im OrdnerNamespace\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');
    }


}
Leitender Entwickler
quelle
Sollte type = "Namespace \ Module \ Block \ Outstock"
Rooster242
aber es funktioniert nicht für Listenseite, warum?
Zed Blackbeard
4

Sie müssen überschreiben

Magento\Swatches\Block\Product\Renderer\Configurable 

anstatt zu überschreiben

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

Datei.

Rejoe
quelle
aber es funktioniert nicht für Listenseite, warum?
Zed Blackbeard
1

So überschreiben Sie die Funktion der Datei configure.php.

1) Erstellen Sie zuerst die Datei di.xml in Folder 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) Erstellen Sie nun die Blockdatei Outstock.php unter Ordnertest \ Konfiguration \ 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
quelle
aber es funktioniert nicht für Listenseite, warum?
Zed Blackbeard
Wie überschreibe ich \ Magento \ ConfigurableProduct \ Block \ Product \ View \ Type \ Configurable? Ich versuche, aber arbeite nicht über dem Code
Rv Singh
In meiner Dropdown-Liste für konfigurierbare Produktoptionen entfernen Sie das Etikett "Benutzerdefinierte Option"
Rv Singh