Удаление детей и предметов с помощью наблюдателя


Я обновил дескриптор checkout_index_index через observer. Теперь я хочу удалить "индикатор выполнения", "Адрес доставки", "способы доставки" через observer. Поэтому я попробовал следующее событие.

    <event name="layout_load_before">
        <observer name="load_custom_handler" instance="NameSpace\Module\Observer\LayoutLoadBefore" />
    </event>   

Загрузка до:

        public function execute(\Magento\Framework\Event\Observer $observer)
    {
           $layout = $observer->getLayout();
           $layout->getUpdate()->addHandle('checkout_index_index'); 
           $layout->unsetElement('checkout_onepage_shippingmethod');
           $layout->unsetElement('checkout_onepage_progress');
           //$layout->unsetBlock('shipping-step');
           $layout->getUpdate()->addUpdate('<referenceBlock name="checkout.cart.shipping" display="false"/>'); 
           //$layout->unsetChild('checkout.steps.shipping-step.shippingAddress');
           return $this;
    }

Все еще дочерние элементы, такие как "Индикатор выполнения", "Адрес доставки не был удален". Есть ли способ удалить это с помощью события?

Author: Arjun Manoharan, 2018-09-18

2 answers

Как упоминал Амит, блоки проверки - это не обычные блоки Magento, а компоненты пользовательского интерфейса, поэтому способ их удаления отличается.

Самым простым способом было бы использовать XML-файл макета, поэтому удаление "индикатора выполнения", например, будет выглядеть примерно так:

Checkout_index_index.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">
    <body>
        <referenceBlock name="checkout.root">
            <arguments>
                <argument name="jsLayout" xsi:type="array">
                    <item name="components" xsi:type="array">
                        <item name="checkout" xsi:type="array">
                            <item name="children" xsi:type="array">
                                <item name="progressBar" xsi:type="array">
                                    <item name="config" xsi:type="array">
                                        <item name="componentDisabled" xsi:type="boolean">true</item>
                                    </item>
                                </item>
                            </item>
                        </item>
                    </item>
                </argument>
            </arguments>
        </referenceBlock>
    </body>
</page>

Я не думаю, что есть способ добиться того же с помощью наблюдателей событий, но, если вы хотите попробовать аналогичный подход, вы можете использовать плагины вместо этого вы можете подключиться к методу Magento\Checkout\Block\Checkout\LayoutProcessorInterface::progress (который обрабатывает блоки, составляющие страницу оформления заказа) и удалить ненужные блоки:

Di.xml

<?xml version="1.0"?>
<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:framework:ObjectManager/etc/config.xsd">
    <type name="Magento\Checkout\Block\Checkout\LayoutProcessorInterface">
        <plugin name="vendor_removecheckoutblocks" type="Vendor\RemoveCheckoutBlocks\Plugin\LayoutProcessor"/>
    </type>
</config>

Vendor/RemoveCheckoutBlocks/Plugin/LayoutProcessor.php

<?php
namespace Vendor\RemoveCheckoutBlocks\Plugin;

class LayoutProcessor
{
    function afterProcess($subject, $result)
    {
        // Remove progress bar
        unset($result['components']['checkout']['children']['progressBar']);

        return $result;
    }
}
 1
Author: Javier Villanueva, 2018-09-18 16:18:51

Вы следуете процессу Magento 1, чтобы изменить страницу оформления заказа. Но Magento 2 этапы оформления заказа совершенно разные. В этой версии Magento использует нокаут js, элемент пользовательского интерфейса jQuery, rest API, локальное хранилище.

Шаги версии Magento 2 не являются манежем из макета, в нем используется нокаут js, элемент пользовательского интерфейса jQuery, API rest, локальное хранилище.

Если вы хотите выполнить настройку в Magento, пожалуйста, следуйте инструкциям Magento devdocs

 1
Author: Amit Bera, 2018-09-18 07:45:55