首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >在Magento 2中,如何覆盖phtml或布局核心文件?

在Magento 2中,如何覆盖phtml或布局核心文件?
EN

Stack Overflow用户
提问于 2015-08-20 14:21:46
回答 5查看 18.3K关注 0票数 4

我在Magento 2中开发了"Hello“扩展。

我想重写与我们联系的核心文件形式。在Magento 2中重写表单文件的正确方法是什么。

请帮帮我。任何帮助都将不胜感激。

EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2016-01-18 08:52:13

我解决了这个问题。如果要覆盖任何核心文件,只需使用引用名称,并将此引用名称传递给referenceBlock name=“钝化”。

对于conatct文件重写,首先获得contactus form.phtml的原始文件,然后找到它的布局文件contact_index_index.xml并获得类似于form.phtml的引用名

系统/核心contact_index_index.xml文件.

代码语言:javascript
运行
复制
<referenceContainer name="content">
            <block class="Magento\Contact\Block\ContactForm" name="contactForm" template="Magento_Contact::form.phtml">
                <container name="form.additional.info" label="Form Additional Info"/>
            </block>
        </referenceContainer>

这个"contactForm"引用名在referenceBlock标记中传递给我们的扩展布局文件。请出示以下代码。

我们的扩展布局contact_index_index.xml文件

代码语言:javascript
运行
复制
<referenceBlock name="contactForm">
    <action method="setTemplate">
     <argument name="template"xsi:type="string">Test_Overide::form.phtml</argument>
   </action>
</referenceBlock>

在此之后,系统contactus form.phtml未调用,我们的扩展名为form.phtml文件调用。您可以使用开发人员前端调试工具进行检查。

票数 3
EN

Stack Overflow用户

发布于 2015-12-09 17:16:02

与前面的两个答案不同,我选择从布局中删除原始块使用自己的模板添加一个新的块。

我们将创建一个新模块VendorName_ModuleName,为此我们需要创建以下文件:

  1. /app/code/VendorName/ModuleName/view/frontend/layout/contact_index_index.xml
  2. /app/code/VendorName/ModuleName/view/frontend/templates/form.phtml
  3. /app/code/VendorName/ModuleName/etc/module.xml
  4. /app/code/VendorName/ModuleName/composer.json
  5. /app/code/VendorName/ModuleName/registration.php

Magento 2中的每个模块都有一个独特的名称,由两个部分组成。第一部分是描述建立扩展的公司、个人或团体的单词。这有时被称为“供应商”命名空间。模块名称的第二部分是一个描述模块所做工作的单词。 艾伦·斯托姆,在他的教程http://alanstorm.com/magento_2_mvvm_mvc

contact_index_index.xml

代码语言:javascript
运行
复制
<?xml version="1.0"?>
<page xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" layout="1column" xsi:noNamespaceSchemaLocation="urn:magento:framework:View/Layout/etc/page_configuration.xsd">    
    <body>


        <!-- Remove the original Contact Form -->
        <referenceBlock name="contactForm" remove="true"/>


        <!-- Add a custom Contact Form -->
        <referenceContainer name="content">
            <block class="Magento\Contact\Block\ContactForm" name="customContactForm" template="My_Module::form.phtml" />
        </referenceContainer>
    

    </body>
</page>

在上面的代码中,我删除了原始表单块,并通过在referenceContainer内容中添加自己的表单来替换它。

注:contact_index_index.xml中,代码template="My_Module::form.phtml"引用自定义联系人表单的phtml

form.phtml

现在,您需要创建自定义表单模板。您可以复制原始文件并对此文件进行修改。

代码语言:javascript
运行
复制
<form class="form contact"
      action="<?php /* @escapeNotVerified */ echo $block->getFormAction(); ?>"
      id="contact-form"
      method="post"
      data-hasrequired="<?php /* @escapeNotVerified */ echo __('* Required Fields') ?>"
      data-mage-init='{"validation":{}}'>
    <fieldset class="fieldset">
        <legend class="legend"><span><?php /* @escapeNotVerified */ echo __('Write Us') ?></span></legend><br />
        <div class="field note no-label"><?php /* @escapeNotVerified */ echo __('Jot us a note and we’ll get back to you as quickly as possible.') ?></div>
        <div class="field name required">
            <label class="label" for="name"><span><?php /* @escapeNotVerified */ echo __('Name') ?></span></label>
            <div class="control">
                <input name="name" id="name" title="<?php /* @escapeNotVerified */ echo __('Name') ?>" value="<?php echo $block->escapeHtml($this->helper('Magento\Contact\Helper\Data')->getUserName()) ?>" class="input-text" type="text" data-validate="{required:true}"/>
            </div>
        </div>
        <div class="field email required">
            <label class="label" for="email"><span><?php /* @escapeNotVerified */ echo __('Email') ?></span></label>
            <div class="control">
                <input name="email" id="email" title="<?php /* @escapeNotVerified */ echo __('Email') ?>" value="<?php echo $block->escapeHtml($this->helper('Magento\Contact\Helper\Data')->getUserEmail()) ?>" class="input-text" type="email" data-validate="{required:true, 'validate-email':true}"/>
            </div>
        </div>
        <div class="field telephone">
            <label class="label" for="telephone"><span><?php /* @escapeNotVerified */ echo __('Phone Number') ?></span></label>
            <div class="control">
                <input name="telephone" id="telephone" title="<?php /* @escapeNotVerified */ echo __('Phone Number') ?>" value="" class="input-text" type="text" />
            </div>
        </div>
        <div class="field comment required">
            <label class="label" for="comment"><span><?php /* @escapeNotVerified */ echo __('What’s on your mind?') ?></span></label>
            <div class="control">
                <textarea name="comment" id="comment" title="<?php /* @escapeNotVerified */ echo __('What’s on your mind?') ?>" class="input-text" cols="5" rows="3" data-validate="{required:true}"></textarea>
            </div>
        </div>
        <?php echo $block->getChildHtml('form.additional.info'); ?>
    </fieldset>
    <div class="actions-toolbar">
        <div class="primary">
            <input type="hidden" name="hideit" id="hideit" value="" />
            <button type="submit" title="<?php /* @escapeNotVerified */ echo __('Submit') ?>" class="action submit primary">
                <span><?php /* @escapeNotVerified */ echo __('Submit') ?></span>
            </button>
        </div>
    </div>
</form>

registration.php

只需将VendorName_ModuleName替换为您自己的。

代码语言:javascript
运行
复制
<?php
\Magento\Framework\Component\ComponentRegistrar::register(
    \Magento\Framework\Component\ComponentRegistrar::MODULE,
    'VendorName_ModuleName',
    __DIR__
);

module.xml

用您自己的版本替换VendorName_ModuleName,用自定义模块的版本替换0.0.1作为安装版本。

代码语言:javascript
运行
复制
<?xml version="1.0"?>
<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="../../../../../lib/internal/Magento/Framework/Module/etc/module.xsd">
    <module name="VendorName_ModuleName" setup_version="0.0.1" />
</config>

composer.json

当然,如果您想让您的新模块正常工作,请不要忘记添加composer.json

代码语言:javascript
运行
复制
 {
"name": "VendorName/ModuleName",
"autoload": {
    "psr-4": { "VendorName\\ModuleName\\": "" },
    "files": [ "registration.php" ]
} }

进一步参考

  1. composer.json的Magento 2文档
  2. 用autoload在registration.php中调用composer.json
  3. 通过样本模块开发马根托在吉特布的代码。
票数 12
EN

Stack Overflow用户

发布于 2015-10-20 11:26:47

你可以用一个插件来完成它。

首先,您必须重写这个块并像下面这样调用beforeToHtml方法:

代码语言:javascript
运行
复制
public function beforeToHtml(\Magento\Catalog\Block\Product\View\Description $originalBlock)
{
    $originalBlock->setTemplate('Vendorname_Modulename::description.phtml');
}
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/32120838

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档