В Magento 2 Как переопределить файлы ядра phtml или макета?

Я разработал расширение «Hello world» в Magento 2.

Я хочу переопределить контактную форму основных файлов. Как правильно переопределить файл формы «Свяжитесь с нами» в Magento 2.

Помогите мне, пожалуйста. Любая помощь будет оценена по достоинству.


person Niks    schedule 20.08.2015    source источник
comment
Что у тебя уже есть?   -  person pete the pagan-gerbil    schedule 20.08.2015
comment
у меня есть пустая страница, когда я позвонил в core contact us form.phtml, используя контактное имя phtml.   -  person Niks    schedule 21.08.2015
comment
В magento 1.x, используя ссылочное имя, мы можем переопределить основной файл phtml, верно? но в magento 2 структура другая.   -  person Niks    schedule 21.08.2015
comment
я не могу понять, как я могу переопределить основной файл в magento 2?   -  person Niks    schedule 21.08.2015


Ответы (5)


В отличие от двух предыдущих ответов, я решил удалить исходный блок из макета и добавить новый, используя свой собственный шаблон.

Мы создадим новый модуль 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. Вторая часть имени модуля — это слово, которое описывает, что делает модуль.

Алан Сторм в своем руководстве Модуль Hello World для Magento 2


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>

регистрация.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>

композитор.json

Конечно, если вы хотите, чтобы ваш новый модуль работал, не забудьте добавить composer.json.

 {
"name": "VendorName/ModuleName",
"autoload": {
    "psr-4": { "VendorName\\ModuleName\\": "" },
    "files": [ "registration.php" ]
} }

Дополнительная ссылка

  1. Документация Magento 2 для composer.json
  2. Запустите Registration.php в composer.json с автозагрузкой
  3. Изучите код образцов модулей от Magento на Github.
person Henry    schedule 09.12.2015
comment
в чем разница в преимуществах/недостатках этого ответа, а затем просто скопируйте form.phtml в app/design/frontend/vendor/your_theme/Magento_Contact? - person Mage Explorer; 05.07.2019

Вы можете сделать это с помощью плагина.

Сначала вам нужно переопределить блок и вызвать метод beforeToHtml следующим образом:

public function beforeToHtml(\Magento\Catalog\Block\Product\View\Description $originalBlock)
{
    $originalBlock->setTemplate('Vendorname_Modulename::description.phtml');
}
person Pratik Khamar    schedule 20.10.2015
comment
Конечно, наследование на основе темы решение было бы предпочтительнее, чем добавление плагина для воссоздания той же функциональности? - person scrowler; 17.12.2015

я решил эту проблему. если вы хотите переопределить какие-либо файлы ядра, вы просто используете имя ссылки, и это имя ссылки передается в referenceBlock name="passit".

Для переопределения файла conatct us сначала вы получаете исходный файл 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. Вы можете проверить, используя инструмент отладки интерфейса разработчика.

person Niks    schedule 18.01.2016

Привет, самый простой способ переопределить файл основного шаблона: -

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

перейдите к своей теме app/design/frontend/vendor/your_theme/ выполните следующие действия:

  1. Создать папку Magento_Contact (модуль-контакт переименован в Magento-Contact)
  2. Создать папку шаблонов
  3. Создайте form.phtm или скопируйте form.phtml из ядра, а затем отредактируйте его.
person varun garg    schedule 17.03.2016

Для этого вам необходимо создать расширение (пользовательский модуль).

Создайте папки block, etc и view из app/magento.

В папке 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 — имя модуля.

Дайте знать, если у вас появятся вопросы.

person samumaretiya    schedule 28.08.2015
comment
Спасибо за помощь. но этот код не работает для меня. - person Niks; 31.08.2015
comment
Мой модуль в файле contact_index_index.xml не вызывается.. по умолчанию исходный файл magento contact_index_index.xml называется - person Niks; 31.08.2015
comment
когда я отправил запрос localhost/magento2/contact в браузере, он попадает в мой контроллер. В моем контроллере $this-›_view-›renderLayout(); функция называется .. поэтому она напрямую вызывает файл макета Megento, свяжитесь с нами, а не мой файл макета. - person Niks; 31.08.2015
comment
Привет @Niks - просто примечание, чтобы сказать, что этот ответ, возможно, был основан на выпуске Magento 2 до GA и, возможно, нуждается в обновлении. Теперь макеты и шаблоны должны находиться в view/frontend/layout или templates — в этом ответе отсутствует часть frontend этого пути. - person scrowler; 17.12.2015