Magento 2: “Ad” olmadan bir bloğun şablonu nasıl değiştirilir


10

Bir bloğun şablonunu özel şablonumla geçersiz kılmak için değiştirmek istiyorum. Ama bir "adı" yok, sadece bir "as" var. Geçersiz kılmak istediğim şey:

<block class="Magento\Sales\Block\Adminhtml\Order\View\Items\Renderer\DefaultRenderer"
       as="default"
       template="order/view/items/renderer/default.phtml"/>

Yanıtlar:


8

ALIAS düzenine sahip bir şablon nasıl geçersiz kılınır.

Bu cevap olası bir örnektir, ALIAS şablonunu geçersiz kılmak için bunu takip edebilirsiniz.

İki örnek modül oluşturdum, Vendor_Moduletakma ad şablonuyla düzeni var, Vendortwo_ModuletwoModüle göre bu takma adı geçersiz kılıyoruz .

Modül oluşturma adımlarını bildiğinizi varsayalım, modül oluşturmanın tamamını göndermiyorum.

Modül 1

\ App \ kod \ Vendor \ Modülü \ vb \ önyüzü \ 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 \ kod \ Vendor \ Modülü \ görünümü \ önyüzü \ düzeni \ 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>

Modül 2

\ App \ kod \ Vendortwo \ Moduletwo \ vb \ önyüzü \ 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 \ kod \ Vendortwo \ Moduletwo \ görünümü \ önyüzü \ düzeni \ 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>

Önbelleği kaldırdıktan sonra http: // localhost / magento210 / module / test / test'i çalıştırıyorum

Takma ad şablonu geçersiz kılınır Vendortwo_Moduletwo two/twoalias.phtml

resim açıklamasını buraya girin


Peki, bu takma adı tarafından bir bloğu geçersiz kılıyor mu? Geçersiz kılmak istemez, ancak arkasına başka bir blok eklersem ne olur?
Jānis Elmeris

3

Bu, düzgün ve kesmeksizin nasıl yapılacağıdır.

OP'nin kullanım durumunu aramadım, ancak arabadaki oluşturucuları değiştirebilmeliydim. Sorun, OP'nin durumunda olduğu gibi, Magento_Checkoutmodülün oluşturuculara ad vermediği anlamına gelir, bu da referans alınamayacakları ve şablonlarının geleneksel veya belgelenmiş yöntemler kullanılarak değiştirilebileceği anlamına gelir. Bununla birlikte, bazı itirazlardan sonra, Magento2'nin bize doğrudan XML düzeninde sağladığı araçları kullanarak nasıl yapılacağını keşfettim.

Magento\Sales\Block\Items\AbstractItemsBlokta olduğu gibi aynı yaklaşımın çalıştığı başka yerler olduğunu unutmayın . Magento_CheckoutVe Magento_Salesmodüller, madde render azami yararlanmak ikisi isimsiz bir bloğun şablonunu değiştirmek için birini yol açacak sorguları birçoğu bu kapakları bu yüzden. Bunun yayınlanmasının nedeni, ödeme veya satış modüllerindeki oluşturucu şablonlarının nasıl değiştirileceğini arayan başkalarının kaçınılmazlığıdır.

İlk olarak çözümü sunacağım ve sonra neden işe yaradığını bilmek isteyen herkes için ayrıntılı olarak açıklayacağım.

Çözüm

checkout_cart_index.xmlDüzen dosyasına aşağıdakileri ekleyin :

<referenceBlock name="checkout.cart.form">
    <arguments>
        <argument name="overridden_templates" xsi:type="array">
            <item name="default" xsi:type="string">LinusShops_Moneymaker::Magento_Checkout/cart/item/default.phtml</item>
            <item name="simple" xsi:type="string">LinusShops_Moneymaker::Magento_Checkout/cart/item/simple.phtml</item>
            <item name="configurable" xsi:type="string">LinusShops_Moneymaker::Magento_Checkout/cart/item/configurable.phtml</item>
        </argument>
    </arguments>
</referenceBlock>

Modül adı ve yolunun kod tabanınızı yansıtacak şekilde değiştirilmesi gerektiğini unutmayın.

açıklama

Bu overridden_templates, varsayılan olarak tanımlanmamış blok verilerinden yararlanarak çalışır .

İçinde Magento_Checkout, checkout_cart_index.xmldüzen dosyası aşağıdaki bloğu tanımlar:

<block class="Magento\Checkout\Block\Cart\Grid" name="checkout.cart.form" as="cart-items" template="cart/form.phtml" after="cart.summary">
    <block class="Magento\Framework\View\Element\RendererList" name="checkout.cart.item.renderers" as="renderer.list"/>
    <block class="Magento\Framework\View\Element\Text\ListText" name="checkout.cart.order.actions"/>
</block>

Daha sonra checkout_cart_item_renderers.xmldüzen dosyasında bu oluşturuculardan birkaçını tanımlar :

<page xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:framework:View/Layout/etc/page_configuration.xsd">
    <update handle="checkout_item_price_renderers"/>
    <body>
        <referenceBlock name="checkout.cart.item.renderers">
            <block class="Magento\Checkout\Block\Cart\Item\Renderer" as="default" template="cart/item/default.phtml">
                <block class="Magento\Checkout\Block\Cart\Item\Renderer\Actions" name="checkout.cart.item.renderers.default.actions" as="actions">
                    <block class="Magento\Checkout\Block\Cart\Item\Renderer\Actions\Edit" name="checkout.cart.item.renderers.default.actions.edit" template="Magento_Checkout::cart/item/renderer/actions/edit.phtml"/>
                    <block class="Magento\Checkout\Block\Cart\Item\Renderer\Actions\Remove" name="checkout.cart.item.renderers.default.actions.remove" template="Magento_Checkout::cart/item/renderer/actions/remove.phtml"/>
                </block>
            </block>
            <block class="Magento\Checkout\Block\Cart\Item\Renderer" as="simple" template="cart/item/default.phtml">
                <block class="Magento\Checkout\Block\Cart\Item\Renderer\Actions" name="checkout.cart.item.renderers.simple.actions" as="actions">
                    <block class="Magento\Checkout\Block\Cart\Item\Renderer\Actions\Edit" name="checkout.cart.item.renderers.simple.actions.edit" template="Magento_Checkout::cart/item/renderer/actions/edit.phtml"/>
                    <block class="Magento\Checkout\Block\Cart\Item\Renderer\Actions\Remove" name="checkout.cart.item.renderers.simple.actions.remove" template="Magento_Checkout::cart/item/renderer/actions/remove.phtml"/>
                </block>
            </block>
        </referenceBlock>
    </body>
</page>

Ne yazık ki, onların takma adları tarafından başvurulan, olamaz defaultve simplesırasıyla.

Bununla birlikte, Magento\Checkout\Block\Cart\Gridadlandırılmış checkout.cart.formve oluşturucuların üst öğesi olan Blok'a bakıldığında getItemHtml, ilişkili şablondaki yönteme bir çağrı olduğu not edilebilir cart/form.phtml. Bu yöntem daha sonra çağırır getItemRenderer. Bu yöntemlerin her ikisi de Grid'nin üst sınıfında tanımlanmıştır AbstractBlock. Bu noktada overridden_templatesveriler kullanılmıştır:

/**
 * Retrieve item renderer block
 *
 * @param string|null $type
 * @return \Magento\Framework\View\Element\Template
 * @throws \RuntimeException
 */
public function getItemRenderer($type = null)
{
    if ($type === null) {
        $type = self::DEFAULT_TYPE;
    }
    $rendererList = $this->_getRendererList();
    if (!$rendererList) {
        throw new \RuntimeException('Renderer list for block "' . $this->getNameInLayout() . '" is not defined');
    }
    $overriddenTemplates = $this->getOverriddenTemplates() ?: [];
    $template = isset($overriddenTemplates[$type]) ? $overriddenTemplates[$type] : $this->getRendererTemplate();
    return $rendererList->getRenderer($type, self::DEFAULT_TYPE, $template);
}

Bu bilgi ile, bloğu mizanpaj XML'sinden verilerle doldurmak Magento2'nin argumentssözdizimini kullanarak basittir .


1
Bu gerçek çözüm olarak kabul edilmelidir. Basit ve etkili. Uygun Magento2 yolu. Harika bir açıklama. Teşekkür ederim!
iva

2

Benim çözümüm evrensel değil, "kirli bir saldırı" ama bazı durumlarda yararlı olabilir. Benim örneğim ön uç oluşturucu için, adminhtml için değil (sanırım aynı olmalı).

\Magento\Framework\Data\Structure::getChildId" $ ParentId == 'checkout.cart.item.renderers' " koşuluyla kesme noktasını ayarlayın (bu, checkout_cart_item_renderers.xmldüzende görebileceğiniz gibi üst blok için bir addır ). Tüm alt blokların kendi (hesaplanmış) adları vardır:

resim açıklamasını buraya girin

Modülünüzün yerleşim güncellemesinde bu adları kullanın:

    <referenceBlock name="checkout.cart.item.renderers_schedule_block4">
        <action method="setTemplate">
            <argument name="template" xsi:type="string">Vendor_Module::cart/item/default.phtml</argument>
        </action>
    </referenceBlock>

2
Buna bakan herkese, uzak bir bakış bile verirseniz bunun düşeceğini unutmayın. Evinizi kartlarla inşa etmeyin. Bu numaralar garanti edilmez.
danemacmillan

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.