Удаление детей и предметов с помощью наблюдателя
Я обновил дескриптор 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;
}
Все еще дочерние элементы, такие как "Индикатор выполнения", "Адрес доставки не был удален". Есть ли способ удалить это с помощью события?
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;
}
}
Вы следуете процессу Magento 1, чтобы изменить страницу оформления заказа. Но Magento 2 этапы оформления заказа совершенно разные. В этой версии Magento использует нокаут js, элемент пользовательского интерфейса jQuery, rest API, локальное хранилище.
Шаги версии Magento 2 не являются манежем из макета, в нем используется нокаут js, элемент пользовательского интерфейса jQuery, API rest, локальное хранилище.
Если вы хотите выполнить настройку в Magento, пожалуйста, следуйте инструкциям Magento devdocs