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


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

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

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

Author: Robbie Averill, 2015-08-20

5 answers

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

Мы создадим новый модуль 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 имеет уникальное имя, состоящее из двух частей. Первая часть - это слово, которое описывает компанию, физическое лицо или группу, создавшую расширение. Это иногда называют пространством имен "поставщик". Вторая часть имени модуля - это слово, описывающее, что делает модуль.

Алан Шторм в своем учебнике Модуль 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.


Форма.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>

Композитор.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 на Гитхаб.
 11
Author: Henry, 2016-06-10 20:55:18

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

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

public function beforeToHtml(\Magento\Catalog\Block\Product\View\Description $originalBlock)
{
    $originalBlock->setTemplate('Vendorname_Modulename::description.phtml');
}
 3
Author: Pratik Khamar, 2015-12-16 20:49:38

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

Для переопределения файла contactus us сначала вы получаете исходный файл contactus form.phtml, а затем находите его файл макета contact_index_index.xml и получите справочное имя, например "Форма контакта".

Система/ядро 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>

Это "Форма контакта" имя ссылки передается в наш файл макета расширения в теге 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
Author: Niks, 2016-01-18 08:52:13

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

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

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

  1. Создать папку Magento_Contact (Переименованный модуль-контакт в Magento-Контакт)
  2. Создать папку шаблонов
  3. Создайте form.phtm или скопируйте свой form.phtml из ядра, а затем отредактируйте его.
 1
Author: varun garg, 2016-03-17 11:00:43

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

Создайте block, etc и view папка из приложения/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 - название модуля.

Дайте мне знать, если у вас возникнут какие-либо вопросы.

 0
Author: sagar umaretiya, 2015-12-16 21:12:40