Magento 2: sovrascrive il file di blocco Magento \ ConfigurableProduct \ Block \ Product \ View \ Type \ Configurable.php


8

Come eseguire l'override function getAllowProducts()da Magento\ConfigurableProduct\Block\Product\View\Type\Configurable.phpin Magento 2.

Voglio sovrascrivere la funzione sopra ma non ottenere cambiamenti di funzione e nulla mostra alcun problema. Non ci sono errori visualizzati nel file di registro.

condividerò il mio codice qui,

registration.php file,

<?php

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

cartella ecc.

module.xml 

il codice è,

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

ho override blocco all'interno del di.xmlcodice è

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

Blocca cartella, Outstock.phpfile,

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

non ho alcun display di errore, nessun log generato per questo file e il modulo è attivato. la setup_modulevoce interna viene generata.

Qualsiasi suggerimento per la funzione di sostituzione del configurable.phpfile.

Grazie.

Risposte:


5

non devi ignorare la preferenza e non dovresti.

Puoi facilmente usare un plugin per impostare i dati allow_products prima che venga chiamato il metodo. Puoi trovare un bel tutorial sui plugin qui:

http://alanstorm.com/magento_2_object_manager_plugin_system

Per creare il tuo plugin, devi prima aggiungere un tipo al tuo 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>

Quindi la tua classe di plugin dovrebbe apparire così:

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

}

Assicurati di cancellare la cache e anche la tua directory var / generation per applicare queste modifiche


non funziona per me usando il metodo plugin. la pagina scompare e seleziona solo la visualizzazione della casella con valore null nell'intera pagina.
Rakesh Jesadiya,

allora molto probabilmente c'è ancora un errore da qualche parte. Controlla i log degli errori in magento e anche il log degli errori del server web. La modalità sviluppatore è abilitata nel file .htaccess? Inoltre non ero sicuro che dovessi restituire un array vuoto o piuttosto nulla quando il metodo originale non ha argomenti (non dovrebbe fare la differenza ma potrebbe)
David Verholen,

Devo visualizzare l'opzione di prodotti esauriti nel menu a discesa, quindi devo rimuovere se la condizione dalla funzione sopra, ma usando il plugin non funziona, inoltre non viene visualizzato alcun registro degli errori. Qualsiasi suggerimento.
Rakesh Jesadiya,

Ora che lo stai chiedendo in questo modo, potrebbe essere sufficiente modificare la configurazione per mostrare prodotti esauriti in frontend. Nel tuo backend vai su Negozi -> Configurazione. Quindi scegli Catalogo-> Scheda Inventario e modifica la visualizzazione dei prodotti non disponibili in Sì
David Verholen,

quelle impostazioni che ho fatto, voglio visualizzare le opzioni di prodotto esaurito all'interno del prodotto di configurazione. per impostazione predefinita, le opzioni di configurazione dei prodotti esauriti non vengono visualizzate nel menu a discesa della pagina dei dettagli del prodotto di configurazione. quindi devo visualizzare quelle opzioni nel menu a discesa.
Rakesh Jesadiya,

12

Per la versione Magento2.1 è necessario eseguire l'override Magento\Swatches\Block\Product\Renderer\Configurable

1) Crea di.xml file nella cartellaNamespace\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) Crea Outstock.phpfile di blocco nella cartellaNamespace\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');
    }


}

Dovrebbe essere type = "Namespace \ Module \ Block \ Outstock"
Rooster242

ma non funziona per la pagina dell'elenco, perché?
zed Barbanera,

4

Devi scavalcare

Magento\Swatches\Block\Product\Renderer\Configurable 

invece di scavalcare

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

file.


ma non funziona per la pagina dell'elenco, perché?
zed Barbanera,

1

Per sovrascrivere la funzione del file configurable.php.

1) Innanzitutto creare il file di.xml in Test cartella / Configurazione / ecc

<?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) Ora crea il file di blocco Outstock.php in Cartella Test \ Configurazione \ Blocco

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


}

ma non funziona per la pagina dell'elenco, perché?
zed Barbanera,

Come sovrascrivere \ Magento \ ConfigurableProduct \ Block \ Product \ View \ Type \ Configurable sto provando ma non sto lavorando sopra il codice
Rv Singh

Nel mio requisito l'opzione configurabile del menu a discesa rimuove l'etichetta "Opzione personalizzata"
Rv Singh
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.