Magento 2: remplacer le fichier de blocage Magento \ ConfigurableProduct \ Block \ Product \ View \ Type \ Configurable.php

8

Comment remplacer function getAllowProducts()depuis Magento\ConfigurableProduct\Block\Product\View\Type\Configurable.phpdans magento 2.

Je veux remplacer la fonction ci-dessus mais ne pas obtenir de changements de fonction et rien n'afficher de problème. Il n'y a aucun affichage d'erreur dans le fichier journal.

je vais partager mon code ici,

registration.php fichier,

<?php

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

dossier etc,

module.xml 

le code est,

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

j'ai remplacer le bloc à l'intérieur du di.xmlcode est

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

Bloquer le dossier, le Outstock.phpfichier,

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

Je n'ai aucun affichage d'erreur, aucun journal n'est généré pour ce fichier et le module est activé. une setup_moduleentrée interne est générée.

Toute suggestion pour remplacer la fonction du configurable.phpfichier.

Merci.

Rakesh Jesadiya
la source

Réponses:

5

vous n'avez pas à remplacer la préférence et vous ne devriez pas.

Vous pouvez facilement utiliser un plugin pour définir les données allow_products avant l'appel de la méthode. Vous trouverez un joli tutoriel sur les plugins ici:

http://alanstorm.com/magento_2_object_manager_plugin_system

Pour créer votre plugin, vous devez d'abord ajouter un type à votre 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>

Votre classe de plugin devrait alors ressembler à ceci:

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

}

Assurez-vous de vider le cache et également votre répertoire var / generation pour que ces modifications soient appliquées

David Verholen
la source
cela ne fonctionne pas pour moi en utilisant la méthode du plugin. la page disparaît et ne sélectionne que l'affichage de la boîte avec une valeur nulle dans toute la page.
Rakesh Jesadiya
alors il y a très probablement encore une erreur quelque part. Vérifiez vos journaux d'erreurs dans magento et également votre journal d'erreurs de serveur Web. Le mode développeur est-il activé dans le fichier .htaccess? De plus, je ne savais pas si vous devez retourner un tableau vide ou plutôt rien lorsque la méthode d'origine n'a pas d'arguments (ne devrait pas faire de différence mais pourrait)
David Verholen
Je dois afficher l'option des produits en rupture de stock dans la liste déroulante, donc je dois supprimer si la condition de la fonction ci-dessus, mais en utilisant le plugin, cela ne fonctionne pas non plus, n'affiche aucune suggestion de journal d'erreur.
Rakesh Jesadiya
Maintenant que vous le demandez de cette façon, il peut être suffisant de simplement modifier la configuration pour afficher les produits en rupture de stock en frontend. Dans votre backend, accédez à Stores -> Configuration. Choisissez ensuite Catalogue-> Onglet Inventaire et changez l'affichage des produits en rupture de stock en oui
David Verholen
ces paramètres que j'ai fait, je veux afficher les options de produits en rupture de stock dans le produit de configuration. par défaut, les options de configuration des produits en rupture de stock ne s'affichent pas dans la liste déroulante de la page de détails du produit de configuration. donc je dois afficher ces options dans le menu déroulant.
Rakesh Jesadiya
12

Pour la version Magento2.1, vous devez remplacer Magento\Swatches\Block\Product\Renderer\Configurable

1) Créer un di.xml fichier dans un dossierNamespace\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) Créer un Outstock.phpfichier de blocage dans un dossierNamespace\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');
    }


}
Développeur principal
la source
Doit être type = "Namespace \ Module \ Block \ Outstock"
Rooster242
mais cela ne fonctionne pas pour la page de liste, pourquoi?
zed Blackbeard
4

Vous devez remplacer

Magento\Swatches\Block\Product\Renderer\Configurable 

au lieu de remplacer

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

fichier.

Rejoe
la source
mais cela ne fonctionne pas pour la page de liste, pourquoi?
zed Blackbeard
1

Pour remplacer la fonction du fichier configurable.php.

1) Créez d'abord le fichier di.xml dans 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) Créez maintenant le fichier Block Outstock.php dans 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
la source
mais cela ne fonctionne pas pour la page de liste, pourquoi?
zed Blackbeard
Comment remplacer \ Magento \ ConfigurableProduct \ Block \ Product \ View \ Type \ Configurable J'essaie mais ne travaille pas au-dessus du code
Rv Singh
Dans ma liste déroulante d'options de produits configurables, supprimez l'étiquette "Option personnalisée"
Rv Singh