В Magento 2 Как переопределить файлы phtml или ядра макета?
Я разработал расширение "Hello world" в Magento 2.
Я хочу переопределить форму "Связаться с нами" в основных файлах. Как правильно переопределить файл формы "Свяжитесь с нами" в Magento 2.
Пожалуйста, помогите мне. Любая помощь будет признательна.
5 answers
В отличие от двух предыдущих ответов, я решил удалить исходный блок из макета и добавить новый, используя свой собственный шаблон.
Мы создадим новый модуль 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
Каждый модуль в 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" ]
} }
Дополнительная ссылка
- Документация Magento 2 для composer.json
- Вызвать registration.php в composer.json с автоматической загрузкой
- Изучите код Примеров модулей с помощью Magento на Гитхаб.
Вы можете сделать это с помощью плагина.
Сначала вам нужно переопределить блок и вызвать метод beforeToHtml
следующим образом:
public function beforeToHtml(\Magento\Catalog\Block\Product\View\Description $originalBlock)
{
$originalBlock->setTemplate('Vendorname_Modulename::description.phtml');
}
Я решил эту проблему. если вы хотите переопределить какие-либо основные файлы, вы просто используете имя ссылки, и это имя ссылки передается в имя блока ссылок ="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. Вы можете проверить это с помощью средства отладки переднего плана разработчика.
Привет, самый простой способ переопределить файл шаблона ядра:-
module-contact/view/frontend/templates/form.phtml
Перейдите к своей теме app/design/frontend/vendor/your_theme/
выполните следующие действия:
- Создать папку Magento_Contact (Переименованный модуль-контакт в Magento-Контакт)
- Создать папку шаблонов
- Создайте
form.phtm
или скопируйте свойform.phtml
из ядра, а затем отредактируйте его.
Для этого вам необходимо создать расширение (пользовательский модуль).
Создайте 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
- название модуля.
Дайте мне знать, если у вас возникнут какие-либо вопросы.