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

时间:2015-08-20 14:21:47

标签: php magento magento2

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

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

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

5 个答案:

答案 0 :(得分:12)

与之前的两个答案不同,我选择从布局中移除原始块,然后使用我自己的模板添加新块

我们将创建一个新模块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
  6.   

    Magento 2中的每个模块都有唯一的名称,由两部分组成。第一部分是描述构建扩展的公司,个人或团体的词。这有时称为“供应商”命名空间。 模块的名称的第二部分是描述模块功能的单词。

         

    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替换为您自己的。{/ p>

    <?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" ]
    } }
    

    进一步参考

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

答案 1 :(得分:3)

您可以使用插件来完成。

首先,您必须覆盖该块并调用#!/bin/bash echo Content-type: text/html echo ark_pid=$(pgrep ShooterGame) output=$(ls -l /proc/$ark_pid/exe) echo "<HTML>" if [[ $output == *ark2* ]]; then echo "Server is already running" else echo "Server didn't appear to be running" #startark fi echo "<meta http-equiv='Refresh' content='1; url=../'>" echo "</HTML>" 方法,如下所示:

rawr@ubuntu:~/development/hivecontrol/ark$ ls -l
total 20
-rwxrwxr-x 1 rawr rawr 1544 Oct 20 04:10 index.html
-rwxrwxr-x 1 rawr rawr  357 Oct 20 05:50 killserver.sh
-rwxrwxr-x 1 rawr rawr  272 Oct 20 05:12 messageserver.sh
-rwxrwxr-x 1 rawr rawr  278 Oct 20 04:38 restartserver.sh
-rwxrwxr-x 1 rawr rawr  369 Oct 20 05:56 startserver.sh

答案 2 :(得分:3)

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

对于conatct us file override,首先获取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>

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

答案 3 :(得分:1)

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

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

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

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

答案 4 :(得分:0)

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

从app / magento创建blocketcview文件夹。

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是模块名称。

如果您有任何问题,请与我们联系。