Magento 2 Knockout XML-> PHTML-> JS-> HTML - PullRequest
       22

Magento 2 Knockout XML-> PHTML-> JS-> HTML

0 голосов
/ 19 сентября 2018

Я хочу отобразить статический блок во всплывающем окне входа в систему html во время оформления заказа, но есть проблема.

Это шаблон html , который вызывается из js , этот js вызывается из phtml , и этоШаблон phtml вызывается из xml макета.( xml -> phtml -> js -> html )

Поэтому вопрос заключается в том, как отправить пользовательский блок содержимого из phtml или xml throught js до html template

vendor / magento / каталог модулей / просмотр / внешний интерфейс / layout / default.xml

Этот файл вызывает шаблон pthml с

 <block class="Magento\Customer\Block\Account\AuthenticationPopup" name="authentication-popup" as="authentication-popup" template="Magento_Customer::account/authentication-popup.phtml">

vendor / magento / module-customer / view / frontend / templates / account / authentication-popup.phtml

Этот файл вызывает js layout с кодом:

     <script type="text/x-magento-init">
        {
            "#authenticationPopup": {
                "Magento_Ui/js/core/app": <?= /* @noEscape */ $block->getJsLayout() ?>
            }
        }
    </script>

vendor / magento / module-customer / view / frontend / web / js/view/authentication-popup.js

этот файл называется последним html шаблоном , где должен быть статический блок из панели администратора с кодом:

    define([
    'jquery',
    'ko',
    // ......... //
], function ($, ko, /* ... ... ... .... ... */) {
    'use strict';

    return Component.extend({
        registerUrl: window.authenticationPopup.customerRegisterUrl,
        forgotPasswordUrl: window.authenticationPopup.customerForgotPasswordUrl,
        autocomplete: window.authenticationPopup.autocomplete,
        modalWindow: null,
        isLoading: ko.observable(false),

        defaults: {
            template: 'Magento_Customer/authentication-popup'
        },
    });
});

вот как я получаю этот блок в php

<?php echo $this->getLayout()->createBlock('Magento\Cms\Block\Block')->setBlockId('reset_password_notice')->toHtml(); ?>

Я пытался вставить его в phtml , это не такт работает !!!

Ответы [ 2 ]

0 голосов
/ 24 сентября 2018

Проблема решена мной.Поэтому для первого шага я начал искать поставщика данных, который помогает отправлять данные от pthml throught js до html в vendor / module-customer /

Там я нашел файл vendor / module-customer / Model / Checkout / ConfigProvider.php .Это было именно то, что мне нужно.

По этой ссылке я создаю:

1) app / code / Theme / Customer / 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">
    <preference for="Magento\Customer\Controller\Account\CreatePost"
                type="Theme_Name\Customer\Controller\Account\CreatePost" />

    <type name="Magento\Checkout\Model\CompositeConfigProvider">
        <arguments>
            <argument name="configProviders" xsi:type="array">
                <item name="cms_block_config_provider" xsi:type="object">Theme_Name\Customer\Model\Checkout\ConfigProvider</item>
            </argument>
        </arguments>
    </type>
</config>

2) Следующим шагом было создание класса, который вызывается в теге item : Имя темы / Customer / Model / Checkout / ConfigProvider.php скод, который расширяет
поставщик / модуль-клиент / модель / оформление заказа / ConfigProvider.php

Примечание!Они оба реализуют один и тот же ConfigProviderInterface .Так что в новом ConifgProvider.php мы используем тот же интерфейс для правильного расширения провайдера данных

<?php
namespace Theme_Name\Customer\Model\Checkout;

use Magento\Checkout\Model\ConfigProviderInterface;
use Magento\Framework\View\LayoutInterface;

class ConfigProvider implements ConfigProviderInterface
{
    /** @var LayoutInterface  */
    protected $_layout;

    public function __construct(LayoutInterface $layout)
    {
        $this->_layout = $layout;
    }

    public function getConfig()
    {
        $cmsBlockId = 'block_ID'; // id of cms block to use

        return [
            'cms_block_message' => $this->_layout->createBlock('Magento\Cms\Block\Block')->setBlockId($cmsBlockId)->toHtml()
        ];
    }
}

Хорошо.Провайдер настроен.

3) Последнему нужно было переопределить интерфейс HTML KO шаблон:

app / design / frontend / theme_name /Magento_Customer / web / template / authentication-popup.html

Напишите следующее:

<div data-bind="html: window.checkoutConfig.cms_block_message"></div>
0 голосов
/ 22 сентября 2018

Вам нужно поместить этот код в ваш phtml-файл.

<?php echo $this->getLayout()->createBlock('Magento\Cms\Block\Block')->setBlockId('reset_password_notice')->toHtml(); ?>

И теперь он показывает, что вы пишете в этот блок.

...