Magento 2 Override Block

Blocks are used to connect or create a link between layout and templates are called Blocks. As a class, it is a set of methods that handle and controls the Magento UI Blocks.

Follow the below steps to override a block.

Override di.xml File

File : app/code/PHPCodez/First/etc/di.xml

<?xml version="1.0"?>
<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:framework:ObjectManager/etc/config.xsd">
 <preference for="Magento\Contact\Block\ContactForm" type="PHPCodez\First\Block\ContactForm" />
</config>

Create ContactForm.php

In this file I have modified form action URL and added new function

File : app/code/PHPCodez/First/Block/ContactForm.php

<?php
 namespace PHPCodez\First\Block;
 use Magento\Framework\View\Element\Template;
 //use Magento\Contact\Block\ContactForm;
 class ContactForm extends \Magento\Contact\Block\ContactForm{
 
 public function getFormAction() {
 return $this->getUrl('contact/index/override/', ['_secure' => true]);
 }
 
 public function getText() { 
 return "PHPCodez Overrides Block"; 
 }
 }

Override contact_index_index.xml

File : app/code/PHPCodez/First/view/frontend/layout/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> 
 <referenceBlock name="contactForm" remove="true"/> 
 <referenceContainer name="content">
 <block class="Magento\Contact\Block\ContactForm" name="customContactForm" template="PHPCodez_First::form.phtml" />
 </referenceContainer>
 </body>
</page>

Override form.phtml

File : app/code/PHPCodez/First/view/frontend/templates/form.phtml

<?php
/**
 * Copyright © Magento, Inc. All rights reserved.
 * See COPYING.txt for license details.
 */

// @codingStandardsIgnoreFile
/** @var \Magento\Contact\Block\ContactForm $block */
?>
<form class="form contact"
 action="<?= $block->escapeUrl($block->getFormAction()) ?>"
 id="contact-form"
 method="post"
 data-hasrequired="<?= $block->escapeHtmlAttr(__('* Required Fields')) ?>"
 data-mage-init='{"validation":{}}'>
 <fieldset class="fieldset">
 <legend class="legend"><span><?= $block->escapeHtml(__('Write Us')) ?></span></legend><br />
 <div class="field note no-label"><?php echo $block->getText(); ?></div>
 
 <div class="field name required">
 <label class="label" for="name"><span><?= $block->escapeHtml(__('Name')) ?></span></label>
 <div class="control">
 <input name="name" id="name" title="<?= $block->escapeHtmlAttr(__('Name')) ?>" value="<?= $block->escapeHtmlAttr($this->helper('Magento\Contact\Helper\Data')->getPostValue('name') ?: $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><?= $block->escapeHtml(__('Email')) ?></span></label>
 <div class="control">
 <input name="email" id="email" title="<?= $block->escapeHtmlAttr(__('Email')) ?>" value="<?= $block->escapeHtmlAttr($this->helper('Magento\Contact\Helper\Data')->getPostValue('email') ?: $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><?= $block->escapeHtml(__('Phone Number')) ?></span></label>
 <div class="control">
 <input name="telephone" id="telephone" title="<?= $block->escapeHtmlAttr(__('Phone Number')) ?>" value="<?= $block->escapeHtmlAttr($this->helper('Magento\Contact\Helper\Data')->getPostValue('telephone')) ?>" class="input-text" type="text" />
 </div>
 </div>
 <div class="field comment required">
 <label class="label" for="comment"><span><?= $block->escapeHtml(__('What’s on your mind?')) ?></span></label>
 <div class="control">
 <textarea name="comment" id="comment" title="<?= $block->escapeHtmlAttr(__('What’s on your mind?')) ?>" class="input-text" cols="5" rows="3" data-validate="{required:true}"><?= $block->escapeHtml($this->helper('Magento\Contact\Helper\Data')->getPostValue('comment')) ?></textarea>
 </div>
 </div>
 <?= $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="<?= $block->escapeHtmlAttr(__('Submit')) ?>" class="action submit primary">
 <span><?= $block->escapeHtml(__('Submit')) ?></span>
 </button>
 </div>
 </div>
</form>

Run the following commands and load the URL http://127.0.0.1/mage2/contact/

php bin/magento setup:upgrade
php bin/magento setup:static-content:deploy
php bin/magento cache:clean

You can see that new form action URL will be ‘contact/index/override/’ and text defined in the new function getText() will be displayed on the form.

Leave a Reply

Your email address will not be published. Required fields are marked *