Comment remplacer un modèle ayant une disposition ALIAS.
Cette réponse est un exemple possible, vous pouvez suivre ceci pour remplacer le modèle ALIAS.
J'ai créé deux exemples de modules, Vendor_Module
a une disposition avec un modèle d'alias, nous remplaçons cet alias par Vendortwo_Moduletwo
module.
Supposons que vous connaissez les étapes pour créer un module, je ne publie pas la création de module entière.
Module 1
\ app \ code \ Vendor \ Module \ etc \ frontend \ routes.xml
<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="../../../../../../lib/internal/Magento/Framework/App/etc/routes.xsd">
<router id="standard">
<route id="module" frontName="module">
<module name="Vendor_Module" />
</route>
</router>
</config>
\ app \ code \ Vendor \ Module \ view \ frontend \ layout \ module_test_test.xml
<?xml version="1.0"?>
<page xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" layout="2columns-left" xsi:noNamespaceSchemaLocation="../../../../../../../lib/internal/Magento/Framework/View/Layout/etc/page_configuration.xsd">
<body>
<referenceContainer name="content">
<block class="Vendor\Module\Block\Test\Test" name="test_test" template="test/test.phtml">
<block class="Vendor\Module\Block\Test\Test" as="testali" template="test/testali.phtml"/>
</block>
</referenceContainer>
</body>
</page>
Module 2
\ app \ code \ Vendortwo \ Moduletwo \ etc \ frontend \ routes.xml
<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="../../../../../../lib/internal/Magento/Framework/App/etc/routes.xsd">
<router id="standard">
<route id="moduletwo" frontName="moduletwo">
<module name="Vendortwo_Moduletwo" />
</route>
</router>
</config>
\ app \ code \ Vendortwo \ Moduletwo \ view \ frontend \ layout \ default.xml
<?xml version="1.0"?>
<page xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:framework:View/Layout/etc/page_configuration.xsd">
<referenceBlock name="test_test">
<block class="Vendortwo\Moduletwo\Block\Two\Two" as="testali" template="two/twoalias.phtml"/>
</referenceBlock>
</page>
Après avoir supprimé le cache, j'exécute http: // localhost / magento210 / module / test / test
Le modèle d'alias est remplacé par Vendortwo_Moduletwo
two/twoalias.phtml
Voici comment le faire correctement et sans piratage.
Je n'ai pas recherché le cas d'utilisation d'OP, mais j'avais besoin de pouvoir modifier les moteurs de rendu dans le panier. Le problème est que, comme dans le cas d'OP, le
Magento_Checkout
module ne fournit pas de noms aux moteurs de rendu, ce qui signifie qu'ils ne peuvent pas être référencés et leurs modèles modifiés à l'aide de méthodes traditionnelles ou documentées. Cependant, après quelques recherches, j'ai découvert comment le faire en utilisant les outils que Magento2 nous fournit directement dans la mise en page XML.Notez qu'il existe d'autres endroits où cette même approche fonctionne, comme dans le
Magento\Sales\Block\Items\AbstractItems
bloc. Les modulesMagento_Checkout
etMagento_Sales
sont les deux qui utilisent le plus les rendus d'élément, donc cela couvre la plupart des requêtes qui conduiraient quelqu'un à changer le modèle d'un bloc sans nom. La raison pour laquelle cela a été publié est à cause de l'inévitabilité de ceux qui cherchent à modifier les modèles de rendu dans les modules de paiement ou de vente.Je vais d'abord fournir la solution, puis l'expliquer en détail à tous ceux qui veulent savoir pourquoi cela fonctionne.
Solution
Ajoutez ce qui suit au
checkout_cart_index.xml
fichier de mise en page:Notez que le nom et le chemin du module doivent être modifiés pour refléter votre base de code.
Explication
Cela fonctionne en exploitant les
overridden_templates
données de bloc, qui ne sont pas définies par défaut.Dans
Magento_Checkout
, lecheckout_cart_index.xml
fichier de mise en page définit le bloc suivant:Il définit ensuite quelques-uns de ces moteurs de rendu dans le
checkout_cart_item_renderers.xml
fichier de disposition:Malheureusement, ils ne peuvent pas être référencés par leurs alias
default
etsimple
respectivement.Cependant, en regardant dans le
Magento\Checkout\Block\Cart\Grid
bloc, qui est nommécheckout.cart.form
, et est le parent des équarrisseurs, on peut noter qu'il ya un appel à lagetItemHtml
méthode dans le modèle associé,cart/form.phtml
. Cette méthode appelle ensuitegetItemRenderer
. Sont définis ces deux méthodes dansGrid
la classe parente de »,AbstractBlock
. C'est là que lesoverridden_templates
données sont utilisées:Avec ces connaissances, le remplissage du bloc avec des données provenant de la mise en page XML est simple en utilisant la
arguments
syntaxe de Magento2 .la source
Ma solution n'est pas universelle, c'est un "hack sale" mais elle peut être utile dans certains cas. Mon exemple est pour le rendu frontal, pas pour adminhtml (je suppose que ce devrait être le même).
Configurez le point d'arrêt
\Magento\Framework\Data\Structure::getChildId
avec la condition " $ parentId == 'checkout.cart.item.renderers' " (c'est un nom pour le bloc parent comme vous pouvez le voir dans lacheckout_cart_item_renderers.xml
disposition). Tous les blocs enfants ont leurs propres noms (calculés):Utilisez ces noms dans la mise à jour de la mise en page de votre module:
la source
Veuillez voir ma réponse ici: https://magento.stackexchange.com/a/239387/14403
Je pense que c'est la solution qui vous conviendra le mieux. La solution consiste à remplacer tout bloc / modèle qui n'a pas d'alias de nom uniquement.
la source