我在Magento 2中开发了"Hello“扩展。
我想重写与我们联系的核心文件形式。在Magento 2中重写表单文件的正确方法是什么。
请帮帮我。任何帮助都将不胜感激。
发布于 2016-01-18 08:52:13
我解决了这个问题。如果要覆盖任何核心文件,只需使用引用名称,并将此引用名称传递给referenceBlock name=“钝化”。
对于conatct文件重写,首先获得contactus form.phtml的原始文件,然后找到它的布局文件contact_index_index.xml并获得类似于form.phtml的引用名
系统/核心contact_index_index.xml文件.
<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文件
<referenceBlock name="contactForm">
    <action method="setTemplate">
     <argument name="template"xsi:type="string">Test_Overide::form.phtml</argument>
   </action>
</referenceBlock>在此之后,系统contactus form.phtml未调用,我们的扩展名为form.phtml文件调用。您可以使用开发人员前端调试工具进行检查。
发布于 2015-12-09 17:16:02
与前面的两个答案不同,我选择从布局中删除原始块,使用自己的模板添加一个新的块。
我们将创建一个新模块VendorName_ModuleName,为此我们需要创建以下文件:
/app/code/VendorName/ModuleName/view/frontend/layout/contact_index_index.xml/app/code/VendorName/ModuleName/view/frontend/templates/form.phtml/app/code/VendorName/ModuleName/etc/module.xml/app/code/VendorName/ModuleName/composer.json/app/code/VendorName/ModuleName/registration.phpMagento 2中的每个模块都有一个独特的名称,由两个部分组成。第一部分是描述建立扩展的公司、个人或团体的单词。这有时被称为“供应商”命名空间。模块名称的第二部分是一个描述模块所做工作的单词。 艾伦·斯托姆,在他的教程http://alanstorm.com/magento_2_mvvm_mvc中
contact_index_index.xml
<?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
现在,您需要创建自定义表单模板。您可以复制原始文件并对此文件进行修改。
<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替换为您自己的。
<?php
\Magento\Framework\Component\ComponentRegistrar::register(
    \Magento\Framework\Component\ComponentRegistrar::MODULE,
    'VendorName_ModuleName',
    __DIR__
);module.xml
用您自己的版本替换VendorName_ModuleName,用自定义模块的版本替换0.0.1作为安装版本。
<?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。
 {
"name": "VendorName/ModuleName",
"autoload": {
    "psr-4": { "VendorName\\ModuleName\\": "" },
    "files": [ "registration.php" ]
} }进一步参考
发布于 2015-10-20 11:26:47
你可以用一个插件来完成它。
首先,您必须重写这个块并像下面这样调用beforeToHtml方法:
public function beforeToHtml(\Magento\Catalog\Block\Product\View\Description $originalBlock)
{
    $originalBlock->setTemplate('Vendorname_Modulename::description.phtml');
}https://stackoverflow.com/questions/32120838
复制相似问题