Magento 2: anular el archivo de bloque Magento \ ConfigurableProduct \ Block \ Product \ View \ Type \ Configurable.php

8

Cómo anular function getAllowProducts()a partir Magento\ConfigurableProduct\Block\Product\View\Type\Configurable.phpde 2 Magento.

Quiero anular la función anterior pero no obtener cambios de función y nada muestra ningún problema. No se muestra ningún error dentro del archivo de registro.

compartiré mi código aquí,

registration.php archivo,

<?php

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

carpeta etc.

module.xml 

el código es

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

Tengo anular bloque dentro del di.xmlcódigo es

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

Bloquear carpeta, Outstock.phparchivo,

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

No he mostrado ningún error, no se ha generado ningún registro para este archivo y el módulo está activado. setup_moduleSe generan entradas internas .

Cualquier sugerencia para anular la función del configurable.phparchivo.

Gracias.

Rakesh Jesadiya
fuente

Respuestas:

5

no tiene que anular la preferencia y no debe hacerlo.

Puede usar fácilmente un complemento para establecer los datos de allow_products antes de llamar al método. Encuentra un buen tutorial sobre complementos aquí:

http://alanstorm.com/magento_2_object_manager_plugin_system

Para crear su complemento, primero debe agregar un tipo a su 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>

Entonces su clase de complemento debería verse así:

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

}

Asegúrese de borrar el caché y también su directorio var / generation para que se apliquen estos cambios

David Verholen
fuente
no funciona para mí usando el método de complemento. la página desaparece y solo se selecciona la visualización del cuadro con un valor nulo en toda la página.
Rakesh Jesadiya
entonces lo más probable es que todavía haya un error en alguna parte. Verifique sus registros de errores en magento y también el registro de errores de su servidor web. ¿Tiene habilitado el modo desarrollador en el archivo .htaccess? Además, no estaba seguro de si debe devolver una matriz vacía o más bien nada cuando el método original no tiene argumentos (no debería hacer una diferencia pero podría)
David Verholen
Tengo que mostrar la opción de productos agotados en el menú desplegable, por lo que tengo que eliminar si la condición de la función anterior, pero el uso del complemento no funciona, tampoco muestra ningún registro de errores.
Rakesh Jesadiya
Ahora que está preguntando de esta manera, puede ser suficiente si solo cambia la configuración para mostrar los productos agotados en la interfaz. En tu backend ve a Tiendas -> Configuración. Luego elija Catálogo-> Pestaña Inventario y cambie la visualización de los productos agotados a sí
David Verholen
Esos ajustes que hice, quiero mostrar las opciones de productos fuera de stock dentro del producto de configuración. de forma predeterminada, las opciones de configuración de productos agotados no se muestran dentro del menú desplegable de la página de detalles del producto de configuración. así que tengo que mostrar esas opciones en el menú desplegable.
Rakesh Jesadiya
12

Para la versión Magento2.1 necesita anular Magento\Swatches\Block\Product\Renderer\Configurable

1) Crear di.xml archivo en la carpetaNamespace\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) Crear Outstock.phparchivo de bloque en la carpetaNamespace\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');
    }


}
Desarrollador principal
fuente
Debe ser type = "Namespace \ Module \ Block \ Outstock"
Rooster242
pero no funciona para la página de lista, ¿por qué?
zed Blackbeard
4

Necesitas anular

Magento\Swatches\Block\Product\Renderer\Configurable 

en lugar de anular

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

archivo.

Alegrarse
fuente
pero no funciona para la página de lista, ¿por qué?
zed Blackbeard
1

Para anular la función del archivo configurable.php.

1) Primero cree el archivo di.xml en Prueba de carpeta / Configuración / 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) Ahora crea el archivo Outstock.php Block en Folder 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');
    }


}
Cartin24
fuente
pero no funciona para la página de lista, ¿por qué?
zed Blackbeard
Cómo anular \ Magento \ ConfigurableProduct \ Block \ Product \ View \ Type \ Configurable estoy intentando pero no funciona el código anterior
Rv Singh
En mi requisito desplegable de opción de producto configurable, elimine la etiqueta "Opción personalizada"
Rv Singh