【问题标题】:In Magento 2 How to Override phtml or layout core files?在 Magento 2 如何覆盖 phtml 或布局核心文件?
【发布时间】:2015-08-20 14:21:46
【问题描述】:

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

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

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

【问题讨论】:

  • 你已经得到了什么?
  • 当我使用联系我们 phtml 参考名称调用核心联系我们 form.phtml 时,我得到了空白页。
  • 在 magento 1.x 中使用参考名称,我们可以覆盖核心 phtml 文件,对吧?但在 magento 2 中结构不同。
  • 我无法理解如何在 magento 2 中覆盖核心文件?

标签: php magento magento2


【解决方案1】:

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

我们将创建一个新模块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 中的每个模块都有由两部分组成的唯一名称。第一部分是描述构建扩展的公司、个人或团体的词。这有时称为“vendor”命名空间。 模块名称的第二部分是描述模块功能的词。

Alan Storm,在他的教程中Magento 2 Hello World Module


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 内容中添加我自己的表单来替换它。

注意:

在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__
);

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

进一步参考

  1. composer.json 的 Magento 2 文档
  2. 使用自动加载在composer.json 中调用registration.php
  3. 通过Magento on Github探索Sample Modules的代码。

【讨论】:

  • 这个答案的优势/劣势有什么区别,然后只需将form.phtml复制到“app/design/frontend/vendor/your_theme/Magento_Contact”?
【解决方案2】:

您可以使用插件来做到这一点。

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

public function beforeToHtml(\Magento\Catalog\Block\Product\View\Description $originalBlock)
{
    $originalBlock->setTemplate('Vendorname_Modulename::description.phtml');
}

【讨论】:

【解决方案3】:

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

对于联系我们的文件覆盖,首先你得到contactus form.phtml的原始文件,然后找到它的布局文件contact_index_index.xml并得到像“contactForm”这样的参考名称。

系统/核心 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>

在此之后,系统联系form.phtml没有被调用,我们的扩展form.phtml文件被调用。您可以使用开发者前端调试工具进行检查。

【讨论】:

    【解决方案4】:

    您好,覆盖核心模板文件的最简单方法:-

    module-contact/view/frontend/templates/form.phtml
    

    转到您的主题app/design/frontend/vendor/your_theme/ 请按照以下步骤操作:

    1. 创建 Magento_Contact 文件夹(将 module-contact 重命名为 Magento-Contact)
    2. 创建模板文件夹
    3. 创建form.phtm 或从核心复制form.phtml,然后对其进行编辑。

    【讨论】:

      【解决方案5】:

      为此,您需要创建一个扩展(自定义模块)。

      从 app/magento 创建一个 block、etc 和 view 文件夹。

      在etc 文件夹中创建module.xml:

      <?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="Xyz_Contact" setup_version="0.0.1"></module>
      </config>
      

      在view 文件夹中创建一个layout 文件夹并将下面的代码放在一个名为contact_index_index.xml 的文件中:

      <?xml version="1.0"?>
      <!--
      /**
       * Copyright © 2015 Magento. All rights reserved.
       * See COPYING.txt for license details.
       */
      -->
      <page xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" layout="1column" xsi:noNamespaceSchemaLocation="../../../../../../../lib/internal/Magento/Framework/View/Layout/etc/page_configuration.xsd">
          <head>
              <title>Contact Us</title>
          </head>
          <body>
              <referenceContainer name="content">
                  <block class="Xyz\Contact\Block\ContactForm" name="contactForm" template="Xyz_Contact::form.phtml">
                      <container name="form.additional.info" label="Form Additional Info"/>
                  </block>
              </referenceContainer>
          </body>
      </page>
      

      创建templates文件夹并将下面的代码放入form.phtml:

      <?php
      /**
       * Copyright © 2015 Magento. All rights reserved.
       * See COPYING.txt for license details.
       */
      
      // @codingStandardsIgnoreFile
      ?>
      <form class="form contact"
            action="<?php echo $block->getFormAction(); ?>"
            id="contact-form"
            method="post"
            data-hasrequired="<?php echo __('* Required Fields') ?>"
            data-mage-init='{"validation":{}}'>
          <fieldset class="fieldset">
              <legend class="legend"><span><?php echo __('Write Us') ?></span></legend><br />
              <div class="field note no-label"><?php 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 echo __('Name') ?></span></label>
                  <div class="control">
                      <input name="name" id="name" title="<?php 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 echo __('Email') ?></span></label>
                  <div class="control">
                      <input name="email" id="email" title="<?php 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 echo __('Phone Number') ?></span></label>
                  <div class="control">
                      <input name="telephone" id="telephone" title="<?php echo __('Phone Number') ?>" value="" class="input-text" type="text" />
                  </div>
              </div>
              <div class="field comment required">
                  <label class="label" for="comment"><span><?php echo __('What’s on your mind?') ?></span></label>
                  <div class="control">
                      <textarea name="comment" id="comment" title="<?php 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 echo __('Submit') ?>" class="action submit primary">
                      <span><?php echo __('Submit') ?></span>
                  </button>
              </div>
          </div>
      </form>
      

      在Block 文件夹中,创建一个名为ContactForm.php 的文件并使用以下代码:

      <?php
      /**
       * Copyright © 2015 Magento. All rights reserved.
       * See COPYING.txt for license details.
       */
      namespace Xyz\Contact\Block;
      
      use Magento\Framework\View\Element\Template;
      
      /**
       * Main contact form block
       */
      class ContactForm extends Template
      {
          /**
           * @param Template\Context $context
           * @param array $data
           */
          public function __construct(Template\Context $context, array $data = [])
          {
              parent::__construct($context, $data);
              $this->_isScopePrivate = true;
          }
      }
      

      请不要忘记在app/etc/config.php 中注册您的模块,或使用命令行中的Magento 二进制工具:php -f bin/magento module:enable Xyz_Contact。

      这里Xyz 是公司名称(供应商),Contact 是模块名称。

      如果您有任何问题,请告诉我。

      【讨论】:

      • 感谢您的帮助。但这段代码对我不起作用。
      • 我在contact_index_index.xml文件中的模块没有被调用..默认magento原始contact_index_index.xml文件被调用
      • 当我在浏览器中发送请求localhost/magento2/contact 时,它会进入我的控制器。在我的控制器 $this->_view->renderLayout();函数名为 .. 所以它直接调用 Megento 联系我们的布局文件而不是我的布局文件。
      • 嗨@Niks - 请注意,此答案可能基于 Magento 2 的预 GA 版本,可能需要更新。现在,布局和模板应该位于view/frontend/layout 或templates - 这个答案缺少该路径的frontend 部分。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-12-11
      • 2012-08-10
      • 1970-01-01
      相关资源
      最近更新 更多