Ajouter un bloc personnalisé sur la page de liste: Magento2

10

Je veux ajouter mon bloc personnalisé sur la page de liste [Magento-2] mais sans aucune modification list.phtmlni.phtml fichier. Y a-t-il une possibilité en utilisant un xmlfichier?

entrez la description de l'image ici

Toute aide serait appréciée.

Keyur Shah
la source
Excellent article. Souhaitez-vous développer plus de détails sur test.phtml pour remplacer la page de liste d'origine? Comme je suis un nouveau venu sur Magento 2.
Comment puis-je utiliser la fonction getProductDetailsHtml () pour ajouter le bloc 'label' NEW sur la grille dans test.phtml?
Kllee

Réponses:

10

Vous pouvez le faire si vous créez un nouveau module pour remplacer ce bloc: vendor\magento\module-catalog\Block\Product\ListProduct.php

pour remplacer ce bloc, vous devez créer di.xmlàapp\code\Vendor\Module_Name\etc

di.xml contenu:

<?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\Catalog\Block\Product\ListProduct" type="Vendor\Module_Name\Block\Product\ListProduct" />
</config>

Créez un nouveau nom de fichier ListProduct.phpàapp\code\Vendor\Module_Name\Block\Product

ListProduct.php contenu:

namespace Vendor\Module_Name\Block\Product;
class ListProduct extends \Magento\Catalog\Block\Product\ListProduct
{
    public function getProductDetailsHtml(\Magento\Catalog\Model\Product $product)
    {
        $html = $this->getLayout()->createBlock('Magento\Framework\View\Element\Template')->setProduct($product)->setTemplate('Vendor_ModuleName::test.phtml')->toHtml();
        $renderer = $this->getDetailsRenderer($product->getTypeId());
        if ($renderer) {
            $renderer->setProduct($product);
            return $html.$renderer->toHtml();
        }
        return '';
    }
}

Vous pouvez changer le bloc Magento\Framework\View\Element\Templateen votre bloc

créer un test.phtmlfichier àapp\code\Vendor\Module_Name\view\frontend\templates

Solution de mage
la source
Merci pour les informations +1 de ma part ... Mais pouvons-nous réaliser sans dérogation?
Keyur Shah
@KeyurShah, est au-dessus de la meilleure méthode jusqu'à présent dans Mage 2.0 pour ajouter votre bloc personnalisé sur la page de liste? Je suis également d'accord avec Kandy car la sortie du produit est codée en dur dans list.phtml.
Slimshadddyyy
@Vikram jusqu'à présent, je pense que c'est la meilleure méthode jusqu'à présent et fonctionne également très bien pour moi ..
Keyur Shah
@KeyurShah, j'ai déjà outrepassé cela en di.xmlutilisant la méthode ci-dessus. Maintenant, comment afficher ma valeur d'attribut personnalisé dans la page de liste?
Slimshadddyyy
@Vikram, vous pouvez utiliser le code Mageev2 pour afficher votre attribut personnalisé. Je veux dire dans test.phtml vous pouvez obtenir $ product object et à partir de $ product object vous pouvez facilement obtenir sa valeur d'attribut.
Keyur Shah
4

Actuellement, vous ne pouvez pas le faire car toute la logique de sortie du produit est codée en dur dans le list.phtmlmodèle.

KAndy
la source
Oui, je le sais, mais y a-t-il un crochet ou un truc disponible pour ça? Btw, Merci pour l'information.
Keyur Shah
0

Voici mon point de vue sur la solution - mais vous devez modifier le list.phtmlmodèle:

catalog_category_view.xml

<referenceBlock name="category.products.list">
    <block class="Magento\Catalog\Block\Product\ProductList\Item\Container" name="custom.block.container" as="custom-block-container">
        <block class="Magento\Catalog\Block\Product\ProductList\Item\Block" name="custom.block" as="custom-block"
           template="Magento_Catalog::product/view/custom-block.phtml" />
    </block>
</referenceBlock>

En custom-block.phtmlvous pouvez obtenir le produit comme celui - ci:

$_product = $block->getProduct();

Vous devrez cependant remplacer le list.phtmlmodèle ... Ajoutez simplement ceci à l'endroit où vous souhaitez que votre bloc personnalisé s'affiche:

<?php if ($customBlock = $block->getChildBlock('custom-block-container')): ?>
    <?= $customBlock->setProduct($_product)->getChildHtml() ?>
<?php endif; ?>

Si vous voulez vraiment éviter de modifier le list.phtmlmodèle, vous pourrez peut-être faire une chose similaire mais dans un modèle différent.

Zankar
la source