Magento 2: Substituir arquivo de bloco Magento \ ConfigurableProduct \ Block \ Product \ View \ Type \ Configurable.php

8

Como substituir function getAllowProducts()a partir Magento\ConfigurableProduct\Block\Product\View\Type\Configurable.phpde Magento 2.

Desejo substituir a função acima, mas não obtendo alterações de função e nada exibe nenhum problema. Não há nenhum erro de exibição dentro do arquivo de log.

vou compartilhar meu código aqui,

registration.php Arquivo,

<?php

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

pasta etc,

module.xml 

código é

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

eu tenho substituir bloco dentro do di.xmlcódigo é

<?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 pasta, Outstock.phparquivo,

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

não há exibição de erro nem geração de log para este arquivo e módulo está ativado. setup_moduleentrada interna é gerada.

Qualquer sugestão para substituir a função do configurable.phparquivo.

Obrigado.

Rakesh Jesadiya
fonte

Respostas:

5

você não precisa substituir a preferência e não deve.

Você pode usar facilmente um plug-in para definir os dados de allow_products antes que o método seja chamado. Você encontra um bom tutorial sobre plugins aqui:

http://alanstorm.com/magento_2_object_manager_plugin_system

Para criar seu plug-in, primeiro você precisa adicionar um tipo ao seu 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>

Em seguida, sua classe de plug-in deve ficar assim:

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

}

Certifique-se de limpar o cache e também o diretório var / generation para que essas alterações sejam aplicadas

David Verholen
fonte
não está funcionando para mim usando o método plugin. a página desaparece e apenas a caixa de seleção é exibida com valor nulo na página inteira.
Rakesh Jesadiya
provavelmente ainda existe um erro em algum lugar. Verifique os logs de erros no magento e também o log de erros do servidor da web. Você tem o modo de desenvolvedor ativado no arquivo .htaccess? Também eu não tinha certeza se você tem que retornar um array vazio ou melhor, nada quando o método orgininal não tem argumentos (não deve fazer a diferença, mas poderia)
David Verholen
Eu tenho que exibir a opção de produtos fora de estoque no menu suspenso, então eu tenho que remover se a condição da função acima, mas usar o plug-in, não estiver funcionando, também não exibir nenhum log de erro.
Rakesh Jesadiya
Agora que você está perguntando dessa maneira, pode ser suficiente se você apenas alterar a configuração para exibir produtos fora de estoque no frontend. No seu back-end, vá para Stores -> Configuração. Em seguida, escolha Catálogo-> guia Inventário e altere a exibição dos produtos em falta para sim
David Verholen
essas configurações que eu fiz, eu quero exibir opções de produtos fora de estoque dentro do produto de configuração. por padrão, as opções de configuração de produtos fora de estoque não são exibidas na lista suspensa da página de detalhes do produto de configuração. então eu tenho que exibir essas opções no menu suspenso.
Rakesh Jesadiya
12

Para a versão Magento2.1, você precisa substituir Magento\Swatches\Block\Product\Renderer\Configurable

1) Crie um di.xml arquivo na pastaNamespace\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) Criar Outstock.phparquivo de bloco na pastaNamespace\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');
    }


}
Desenvolvedor-chefe
fonte
Deve ser do tipo = "Namespace \ Module \ Block \ Outstock"
Rooster242
mas não funciona para a página da lista, por quê?
zed Blackbeard
4

Você precisa substituir

Magento\Swatches\Block\Product\Renderer\Configurable 

em vez de substituir

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

Arquivo.

Rejoe
fonte
mas não funciona para a página da lista, por quê?
Julio
1

Para substituir a função do arquivo configurable.php.

1) Primeiro crie o arquivo di.xml em Pasta Teste / Configuração / 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) Agora crie o arquivo Outstock.php Block na pasta 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
fonte
mas não funciona para a página da lista, por quê?
Julio
Como substituir \ Magento \ ConfigurableProduct \ Bloco \ Product \ Ver \ tipo \ configurável eu estou tentando, mas não trabalhar acima código
Rv Singh
Na minha exigência configurável queda opção de produto para baixo Remover "opção Personalizada" etiqueta
Rv Singh