Magento 2 - Добавьте Статический блок CMS в форму адреса для оформления заказа


Всем добрый вечер,

Я хочу добавить статический блок CMS в форму адреса доставки заказа Magento 2. Я хотел бы отобразить блок CMS в поле номер телефона. Старый метод состоял бы в том, чтобы вставить шаблон в мою новую тему и обновить его, но в Magento 2 проверка выполняется с помощью knockoutjs, и я немного растерялся.

Любая помощь в том, какие шаблоны нокаута или XML-макет мне нужно обновить, чтобы сделать это, была бы очень полезной.

Author: Baber, 2017-05-06

3 answers

Вам придется сделать это с помощью модуля, это невозможно сделать из темы.

Идея состоит в том, чтобы получить html-код блока CMS и поместить его в объект checkoutConfig JS. Мы делаем это, добавляя поставщика конфигурации в Magento\Checkout\Model\CompositeConfigProvider

Вот {module_dir}/etc/frontend/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\Model\CompositeConfigProvider">
        <arguments>
            <argument name="configProviders" xsi:type="array">
                <item name="cms_block_provider" xsi:type="object">Vendor\Module\Model\CheckoutConfigProvider</item>
            </argument>
        </arguments>
    </type>
    <type name="Vendor\Module\Model\CheckoutConfigProvider">
        <arguments>
            <!--ID OF THE CMS BLOCK-->
            <argument name="blockId" xsi:type="string">16</argument>
        </arguments>
    </type>
</config>

Это добавит нашего поставщика конфигурации, а также мы передадим идентификатор блока CMS, который вы хотите отобразить.

Теперь для поставщика конфигурации {модуль_дир}/Model/CheckoutConfigProvider.php:

<?php

namespace Vendor\Module\Model;


use Magento\Checkout\Model\ConfigProviderInterface;
use Magento\Cms\Block\Widget\Block;

class CheckoutConfigProvider implements ConfigProviderInterface
{
    protected $cmsBlockWidget;

    public function __construct(Block $block, $blockId)
    {
        $this->cmsBlockWidget = $block;
        $block->setData('block_id', $blockId);
        $block->setTemplate('Magento_Cms::widget/static_block/default.phtml');
    }

    public function getConfig()
    {
        return [
            'cmsBlockHtml' => $this->cmsBlockWidget->toHtml()
        ];
    }
}

Это отобразит html-код блока и сделает его доступным для javascript в window.checkoutConfig.cmsBlockHtml.

Теперь нам нужно добавить uiComponent в адресную форму. Мы делаем это в {module_dir}/view/frontend/layout/checkout_index_index.xml`

<?xml version="1.0"?>

<page xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" layout="checkout" 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="steps" xsi:type="array">
                                    <item name="children" xsi:type="array">
                                        <item name="shipping-step" xsi:type="array">
                                            <item name="children" xsi:type="array">
                                                <item name="shippingAddress" xsi:type="array">
                                                    <item name="children" xsi:type="array">
                                                        <item name="shipping-address-fieldset" xsi:type="array">
                                                            <item name="children" xsi:type="array">
                                                                <item name="cms-block" xsi:type="array">
                                                                    <item name="component" xsi:type="string">uiComponent</item>
                                                                    <item name="config" xsi:type="array">
                                                                        <item name="template" xsi:type="string">Vendor_Module/cms-block</item>
                                                                    </item>
                                                                    <item name="sortOrder" xsi:type="string">125</item>
                                                                </item>
                                                            </item>
                                                        </item>
                                                    </item>
                                                </item>
                                            </item>
                                        </item>
                                    </item>
                                </item>
                            </item>
                        </item>
                    </item>
                </argument>
            </arguments>
        </referenceBlock>
    </body>
</page>

Наконец, нам просто нужно создать файл шаблона нокаута для этого uiComponent. Это будет {module_dir}/view/frontend/web/template/cms-block.html:

<div data-bind="html: window.checkoutConfig.cmsBlockHtml"></div>
 12
Author: Aaron Allen, 2017-08-30 12:45:33

Вот что я сделал, чтобы отобразить блок CMS на странице оформления заказа под боковой панелью. 1. В шаблонах/onepage.phtml я создал переменную js для хранения содержимого блока cms следующим образом:

<?php $myCmsBlock = $block->getLayout()->createBlock('Magento\Cms\Block\Block')->setBlockId('my_cms_block')->toHtml() ?>

    <script type="text/javascript">
        var my_cms_block = <?php echo json_encode($myCmsBlock)?>;
    </script>

2. В файле шаблона нокаута (в моем случае это было web/js/template/sidebar.html), отображал содержимое блока cms из указанной выше переменной js следующим образом:

<div class="opc-help-cms" data-bind="html:my_cms_block">
    </div>

Надеюсь, это кому-то поможет! Спасибо!

 9
Author: Siju Joseph, 2017-09-20 18:06:41

Основываясь на ответе Ааронса, я поместил это в наш Модуль Mestrona_common Blocks Magento 2 на GitHub.

 0
Author: Alex, 2019-05-23 10:35:03