This post is related to add Google Recaptcha to Custom Form in Magento 2.4.X
Module Name: Integerbyte_MyRecaptcha
Files List:
app/code/Integerbyte/MyRecaptcha/registration.php
app/code/Integerbyte/MyRecaptcha/etc/module.xml
app/code/Integerbyte/MyRecaptcha/etc/adminhtml/system.xml
app/code/Integerbyte/MyRecaptcha/etc/config.xml
app/code/Integerbyte/MyRecaptcha/etc/frontend/routes.xml
app/code/Integerbyte/MyRecaptcha/etc/frontend/events.xml
app/code/Integerbyte/MyRecaptcha/Observer/RecapchaObserver.php
app/code/Integerbyte/MyRecaptcha/Controller/Index/Index.php
app/code/Integerbyte/MyRecaptcha/Controller/Index/Save.php
app/code/Integerbyte/MyRecaptcha/view/frontend/layout/myrecaptcha_index_index.xml
app/code/Integerbyte/MyRecaptcha/view/frontend/templates/form.phtml
1. Module Registarion file
app/code/Integerbyte/MyRecaptcha/registration.php
<?php \Magento\Framework\Component\ComponentRegistrar::register( \Magento\Framework\Component\ComponentRegistrar::MODULE, 'Integerbyte_MyRecaptcha', __DIR__ );
2. Create module.xml file
app/code/Integerbyte/MyRecaptcha/etc/module.xml
<?xml version="1.0"?> <config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:framework:Module/etc/module.xsd"> <module name="Integerbyte_MyRecaptcha" setup_version="1.0.0"> </module> </config>
3. Create system.xml file
app/code/Integerbyte/MyRecaptcha/etc/adminhtml/system.xml
Note: section id recaptcha_frontend and group id type_for are static, you can change ‘customform’ acoording to you
This configuration show in Admin -> Stores -> Configuration ->Security tab
<?xml version="1.0"?> <config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:module:Magento_Config:etc/system_file.xsd"> <system> <section id="recaptcha_frontend"> <group id="type_for"> <field id="customform" translate="label" type="select" sortOrder="140" showInDefault="1" showInWebsite="1" showInStore="0" canRestore="1"> <label>Enable for Custom Form</label> <source_model>Magento\ReCaptchaAdminUi\Model\OptionSource\Type</source_model> </field> </group> </section> </system> </config>
4. Create config.xml file
app/code/Integerbyte/MyRecaptcha/etc/config.xml
Note: recaptcha_frontend and type_for are static
<?xml version="1.0"?> <config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:module:Magento_Store:etc/config.xsd"> <default> <recaptcha_frontend> <type_for> <customform/> </type_for> </recaptcha_frontend> </default> </config>
5. Create routes.xml file
app/code/Integerbyte/MyRecaptcha/etc/frontend/routes.xml
<?xml version="1.0" ?> <config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:framework:App/etc/routes.xsd"> <router id="standard"> <route frontName="myrecaptcha" id="myrecaptcha"> <module name="Integerbyte_MyRecaptcha"/> </route> </router> </config>
6. Create events.xml file
app/code/Integerbyte/MyRecaptcha/etc/frontend/events.xml
<?xml version="1.0"?> <config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:framework:Event/etc/events.xsd"> <event name="controller_action_predispatch_myrecaptcha_index_save"> <observer name="recaptcha_demo_form" instance="Integerbyte\MyRecaptcha\Observer\RecapchaObserver"/> </event> </config>
7. Create RecapchaObserver file
app/code/Integerbyte/MyRecaptcha/Observer/RecapchaObserver.php
Note: here key value is ‘customform’
<?php declare(strict_types=1); namespace Integerbyte\MyRecaptcha\Observer; use Magento\Framework\App\Action\Action; use Magento\Framework\Event\Observer; use Magento\Framework\Event\ObserverInterface; use Magento\Framework\Exception\LocalizedException; use Magento\Framework\UrlInterface; use Magento\ReCaptchaUi\Model\IsCaptchaEnabledInterface; use Magento\ReCaptchaUi\Model\RequestHandlerInterface; use Magento\Framework\App\Response\RedirectInterface; class RecapchaObserver implements ObserverInterface { protected $redirect; private $url; private $isCaptchaEnabled; private $requestHandler; public function __construct( UrlInterface $url, IsCaptchaEnabledInterface $isCaptchaEnabled, RequestHandlerInterface $requestHandler, RedirectInterface $redirect ) { $this->url = $url; $this->isCaptchaEnabled = $isCaptchaEnabled; $this->requestHandler = $requestHandler; $this->redirect = $redirect; } public function execute(Observer $observer): void { $key = 'customform'; if ($this->isCaptchaEnabled->isCaptchaEnabledFor($key)) { $controller = $observer->getControllerAction(); $request = $controller->getRequest(); $response = $controller->getResponse(); $redirectOnFailureUrl = $this->redirect->getRedirectUrl(); $this->requestHandler->execute($key, $request, $response, $redirectOnFailureUrl); } } }
8. Create Index controller file
app/code/Integerbyte/MyRecaptcha/Controller/Index/Index.php
<?php namespace Integerbyte\MyRecaptcha\Controller\Index; use Magento\Customer\Model\Session; use Magento\Framework\App\Action\Action; use Magento\Framework\App\Action\Context; use Magento\Framework\App\RequestInterface; use Magento\Framework\View\Result\PageFactory; class Index extends \Magento\Framework\App\Action\Action { /** * @var PageFactory */ protected $resultPageFactory; /** * @var Session */ protected $customerSession; /** * @param Context $context * @param PageFactory $resultPageFactory * @param Session $customerSession */ public function __construct( Context $context, PageFactory $resultPageFactory, Session $customerSession ) { $this->resultPageFactory = $resultPageFactory; $this->customerSession = $customerSession; parent::__construct($context); } public function execute() { $resultPage = $this->resultPageFactory->create(); $resultPage->getConfig()->getTitle()->set(__('My custom form')); return $resultPage; } }
9. Create Save controller file
app/code/Integerbyte/MyRecaptcha/Controller/Index/Save.php
<?php namespace Integerbyte\MyRecaptcha\Controller\Index; class Save extends \Magento\Framework\App\Action\Action { protected $_request; public function __construct( \Magento\Framework\App\Action\Context $context, \Magento\Framework\App\Request\Http $request ) { $this->_request = $request; parent::__construct($context); } public function execute() { $formData = $this->_request->getPostValue(); // your logic die(); } }
10. Create layout file
app/code/Integerbyte/MyRecaptcha/view/frontend/layout/myrecaptcha_index_index.xml
Note: ifconfig is check module is enable or disble
<?xml version="1.0"?> <page xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="../../../../../../../lib/internal/Magento/Framework/View/Layout/etc/page_configuration.xsd"> <body> <referenceContainer name="content"> <block class="Magento\Framework\View\Element\Template" name="demo.for.recaptcha" template="Integerbyte_MyRecaptcha::form.phtml" > <container name="form.additional.info.demo.for.recaptcha"> <block class="Magento\ReCaptchaUi\Block\ReCaptcha" name="recaptcha" after="-" template="Magento_ReCaptchaFrontendUi::recaptcha.phtml" ifconfig="recaptcha_frontend/type_for/customform"> <arguments> <argument name="recaptcha_for" xsi:type="string">customform</argument> <argument name="jsLayout" xsi:type="array"> <item name="components" xsi:type="array"> <item name="recaptcha" xsi:type="array"> <item name="component" xsi:type="string">Magento_ReCaptchaFrontendUi/js/reCaptcha</item> </item> </item> </argument> </arguments> </block> </container> </block> </referenceContainer> </body> </page>
11. Create template file
app/code/Integerbyte/MyRecaptcha/view/frontend/templates/form.phtml
Add childhtml ‘form.additional.info.demo.for.recaptcha’
<?php $form_url = $this->getUrl('myrecaptcha/index/save'); ?> <div id="myrecaptcha-div"> <div class="modal-body"> <form class="form" action="<?= $block->escapeHtmlAttr($form_url) ?>" id="demo-recaptcha-form" method="post" enctype='multipart/form-data' > <input type="hidden" name="product_id" > <fieldset class="fieldset"> <div class="field required"> <label for="user_name" class="label"> <span><?= $block->escapeHtml('Name:') ?></span> </label> <div class="control"> <input type="text" name="customer_name" title="<?= $block->escapeHtml('Name') ?>" class="input-text" data-validate="{required:true}"> </div> </div> <div class="field required"> <label for="user_name" class="label"> <span><?= $block->escapeHtml('E-mail:') ?></span> </label> <div class="control"> <input type="email" name="customer_email" title="<?= $block->escapeHtml('E-mail') ?>" class="input-text" data-validate="{required:true, 'validate-email':true}"> </div> </div> <?= $block->getChildHtml('form.additional.info.demo.for.recaptcha') ?> </fieldset> <div class="actions-toolbar"> <div class="primary"> <button type="submit" class="action submit primary " title="<?= $block->escapeHtml('Submit') ?>"> <span> <?= $block->escapeHtml('Submit') ?> </span> </button> </div> </div> </form> <script type="text/x-magento-init"> { "#demo-recaptcha-form": { "validation": {} } } </script> </div> </div>