Magento 2淘汰赛XML-> PHTML-> JS-> HTML

时间:2018-09-19 16:11:12

标签: javascript php magento knockout.js block

我想在结帐时在html登录弹出窗口中显示静态块,但是存在问题。

这是从 js 调用的 html 模板,从 phtml 调用的 js xml 调用的 phtml 模板  布局。 ( xml-> phtml-> js-> html

所以问题是如何通过 js phtml xml 中的自定义内容块发送到 html 模板

  

供应商/ magento /模块目录/视图/前端/布局/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布局,代码为:

     <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 :(得分:0)

您需要将此代码放入phtml文件中。

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

现在它显示了您在此块中写入的内容。

答案 1 :(得分:0)

问题由我自己解决。 因此,在第一步中,我开始寻找数据提供程序,该数据提供程序可帮助将数据从 pthml 通过 js 发送到vendor / module-customer /中的 html

我找到了文件 vendor / module-customer / Model / Checkout / ConfigProvider.php 。那正是我所需要的。

根据我创建的link

1)应用/代码/主题/客户/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 标签中调用的类: Theme_Name / Customer / Model / Checkout / ConfigProvider.php 带有扩展的代码
vendor / module-customer / Model / Checkout / 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>