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

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

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

最佳答案

与前两个答案不同,我选择 从布局中删除原始块 使用我自己的模板 添加一个新块。
我们将创建一个新模块 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.php



  • 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>
    
    在上面的代码中,我删除了原始表单 Block 并通过在 referenceContainer 内容中添加我自己的表单来替换它。


    表单.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>
    

    注册.php
    只需将 VendorName_ModuleName 替换为您自己的。
    <?php
    \Magento\Framework\Component\ComponentRegistrar::register(
        \Magento\Framework\Component\ComponentRegistrar::MODULE,
        'VendorName_ModuleName',
        __DIR__
    );
    

    模块.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" ]
    } }
    

    进一步引用
  • composer.json
  • 的 Magento 2 文档
  • 使用自动加载
  • composer.json 中调用 registration.php
  • 通过 Sample Modules 探索 Magento on Github 的代码。
  • 关于php - 在 Magento 2 如何覆盖 phtml 或布局核心文件?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/32120838/

    10-10 23:36