Я разработал расширение «Hello world» в Magento 2.
Я хочу переопределить форму обратной связи с нами. Как правильно переопределить файл формы обратной связи в Magento 2.
Пожалуйста, помогите мне. Любая помощь будет оценена.
В отличие от двух предыдущих ответов, я выбрал удалить оригинальный блок от макета и добавить новый, используя мой собственный шаблон.
Мы создадим новый модуль, 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 имеет уникальное имя, состоящее из двух частей. Первая часть — это слово, которое описывает компанию, отдельное лицо или группу, которая создала расширение. Это иногда называют «продавецПространство имен. Вторая часть модульИмя — это слово, которое описывает, что делает модуль.
Алан Сторм, в своем уроке Модуль Hello World, Magento 2
<?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 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>
Просто замените VendorName_ModuleName
с вашим собственным.
<?php
\Magento\Framework\Component\ComponentRegistrar::register(
\Magento\Framework\Component\ComponentRegistrar::MODULE,
'VendorName_ModuleName',
__DIR__
);
замещать 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
,
{
"name": "VendorName/ModuleName",
"autoload": {
"psr-4": { "VendorName\\ModuleName\\": "" },
"files": [ "registration.php" ]
} }
Вы можете сделать это с помощью плагина.
Сначала вы должны переопределить блок и вызвать beforeToHtml
метод как это:
public function beforeToHtml(\Magento\Catalog\Block\Product\View\Description $originalBlock)
{
$originalBlock->setTemplate('Vendorname_Modulename::description.phtml');
}
я решил эту проблему. если вы хотите переопределить какие-либо основные файлы, вы просто используете имя ссылки, и это имя ссылки передается в referenceBlock name = «passit».
Для переопределения файла conatct 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/
выполните следующие шаги:
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
это имя модуля.
Дайте знать, если у вас появятся вопросы.