J'essaie d'ajouter un modèle personnalisé à la page du produit dans la section de partage social. Dans mon module, j'ai le code suivant dans le fichier de disposition default.xml
<body>
<referenceContainer name="product.info.social">
<block class="Magento\Framework\View\Element\Template" name="product.info.custom" template="Lapisbard_Product::social.phtml" after="product.info.addtocart">
</block>
</referenceContainer>
</body>
contenu social.phtml
<p>Hey there !</p>
<?php //$_product = $block->getProduct();
Cela fonctionne bien et affiche le contenu du modèle sur la page du produit. Lorsque j'utilise la classe de bloc au Magento\Catalog\Block\Product\View
lieu de Magento\Framework\View\Element\Template
pour que je puisse obtenir un objet produit dans mon modèle $block->getProduct();
, cela montre une page vierge.
1. Quelle erreur je fais ici?
2. Quelle est la meilleure façon de modifier la page produit?
3. Existe-t-il un fichier de mise en page de référence que je peux utiliser pour ajouter de nouveaux modèles à n'importe quelle section de la page produit écrivant le code de mise en page dans mon module?
$_product = $block->getProduct();
lorsque j'utilise leMagento\Catalog\Block\Product\View
bloc.Réponses:
L'erreur "page blanche" vient parce que nous
Magento\Framework\View\Element\Template
n'avons pas degetProduct()
méthode.Je pense donc que la façon la plus "propre" de le faire est de créer un module personnalisé avec un bloc, une disposition et un modèle personnalisés (ne vous inquiétez pas, cela ne prend que quelques minutes et vous avez fait quelques parties)
Fichiers de module:
(Je vais sauter
/etc/module.xml
etregistration.php
parce que c'est trivial, cependant vous pouvez trouver l'exemple complet ici .)Commençons par le fichier Block php:
Comme vous pouvez le voir, ce n'est qu'une classe concrète qui étend (IMO) le bloc abstrait de produit le plus léger. Vous pouvez également étendre,
Magento\Framework\View\Element\Template
mais dans ce cas, vous devrez implémenter lagetProduct()
méthode et modifier le contexte dans le constructeur afin d'accéder au registre.Permet donc de passer au fichier de mise en page:
Et enfin le fichier modèle:
Comme vous pouvez le voir, c'est assez simple, plus simple que M1-
N'oubliez pas que toute votre logique personnalisée doit être implémentée dans la
Extra.php
classe de bloc afin de garder la vue propre.c'est à dire:
la source
Un supplément pour la réponse acceptée
La réponse acceptée est bonne, mais elle
AbstractProduct
est désormais obsolète .Donc, nous devons utiliser le
Magento\Framework\Registry
pour obtenir le bloc , l'exemple de bloc est ci-dessous:la source