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

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

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

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

4

Решение

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

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

Алан Сторм, в своем уроке Модуль 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>

В приведенном выше коде я удалил исходную форму 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 с вашим собственным.

<?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. Magento 2 документация для composer.json
  2. Вызовите registration.php в composer.json с автозагрузкой
  3. Изучите код Типовые модули от Magento на Github.
12

Другие решения

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

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

public function beforeToHtml(\Magento\Catalog\Block\Product\View\Description $originalBlock)
{
$originalBlock->setTemplate('Vendorname_Modulename::description.phtml');
}
3

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

3

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

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

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

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

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

Создать 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
По вопросам рекламы [email protected]