Magento – How to get MSP Recaptcha Module on custom Form

captchamagento2.2

I have a custom form inside a modal in a configurable product page which requires MSP Google ReCaptcha to be implemented. I tried to include the Recaptcha block in my layout file but it is not showing up.

 <block class="Magento\Framework\View\Element\Template" name="custom-modal" template="Vendor_module::custom-modal.phtml" >
     <block class="Magento\Swatches\Block\Product\Renderer\Configurable" name="product.info.options.swatches_inside_modal"   />
 </block>

If anyone knows how to solve this let me know.

Best Answer

Using @mahmoudismail answer to add reCaptcha to your own module:

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_YOUR_FORM_NAME_index_post">
        <observer name="msp_captcha" instance="YOUR_NAMESPACE\YOUR_MODULE\Model\Provider\Failure\YOUR_FORM_NAMEObserver" />
    </event>
</config>

etc/frontend/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">

<!--    Setup redirect-->
    <virtualType name="YOUR_NAMESPACE\YOUR_MODULE\Model\Provider\Failure\RedirectUrl\YOUR_FORM_NAME"
                 type="MSP\ReCaptcha\Model\Provider\Failure\RedirectUrl\SimpleUrlProvider">
        <arguments>
            <argument name="urlPath" xsi:type="string">events/index/index</argument>
        </arguments>
    </virtualType>


    <virtualType name="YOUR_NAMESPACE\YOUR_MODULE\Model\Provider\Failure\YOUR_FORM_NAMEObserver"
                 type="MSP\ReCaptcha\Model\Provider\Failure\ObserverRedirectFailure">
        <arguments>
            <argument name="redirectUrlProvider"
                      xsi:type="object">YOUR_NAMESPACE\YOUR_MODULE\Model\Provider\Failure\RedirectUrl\YOUR_FORM_NAME</argument>
        </arguments>
    </virtualType>

<!--    Check an enable config -->
    <virtualType name="YOUR_NAMESPACE\YOUR_MODULE\Model\Provider\IsCheckRequired\Frontend\YOUR_FORM_NAME"
                 type="MSP\ReCaptcha\Model\IsCheckRequired">
        <arguments>
<!--            Commented out to eliminate need for a system config-->
<!--            <argument name="enableConfigFlag"-->
<!--                      xsi:type="string">msp_securitysuite_recaptcha/frontend/enabled_YOUR_SETTING</argument>-->
            <argument name="area" xsi:type="string">frontend</argument>
        </arguments>
    </virtualType>


    <virtualType name="YOUR_NAMESPACE\YOUR_MODULE\Observer\Frontend\YOUR_FORM_NAMEObserver"
                 type="MSP\ReCaptcha\Observer\ReCaptchaObserver">
        <arguments>
            <argument name="isCheckRequired"
                      xsi:type="object">YOUR_NAMESPACE\YOUR_MODULE\Model\Provider\IsCheckRequired\Frontend\YOUR_FORM_NAME</argument>
            <argument name="failureProvider"
                      xsi:type="object">YOUR_NAMESPACE\YOUR_MODULE\Model\Provider\Failure\YOUR_FORM_NAMEObserver</argument>
        </arguments>
    </virtualType>

<!--    Adds YOUR_FORM_NAME enabled to reCaptcha module settings-->
    <type name="MSP\ReCaptcha\Model\LayoutSettings">
        <plugin
            name="YOUR_NAMESPACE_YOUR_MODULE_recaptcha"
            type="YOUR_NAMESPACE\YOUR_MODULE\Plugin\Recaptcha\LayoutSettings"
            sortOrder="1"
            disabled="false"
        />
    </type>
</config>

Plugin/Recaptcha/LayoutSettings.php

<?php

    namespace YOUR_NAMESPACE\YOUR_MODULE\Plugin\Recaptcha;


    /**
     * Class LayoutSettings
     * @package YOUR_NAMESPACE\YOUR_MODULE\Plugin\Recaptcha
     */
    class LayoutSettings
    {
        /**
         * Enable the recaptcha for form
         * Use a system config (optional)
         *
         * @param \MSP\ReCaptcha\Model\LayoutSettings $subject
         * @param $result
         * @return bool
         */
        public function afterGetCaptchaSettings(
            \MSP\ReCaptcha\Model\LayoutSettings $subject,
            $result

        ) {

            $result['enabled']['YOUR_FORM_NAME'] = true;
            return $result;
        }
    }

Add to your forms layout where appropriate

 <block class="MSP\ReCaptcha\Block\Frontend\ReCaptcha" name="msp-recaptcha" after="-"
                   template="MSP_ReCaptcha::msp_recaptcha.phtml">

                <arguments>
                    <argument name="jsLayout" xsi:type="array">
                        <item name="components" xsi:type="array">
                            <item name="msp-recaptcha" xsi:type="array">
                                <item name="component" xsi:type="string">MSP_ReCaptcha/js/reCaptcha</item>
                                <item name="zone" xsi:type="string">YOUR_FORM_NAME</item>
                            </item>
                        </item>
                    </argument>
                </arguments>
            </block>

Output the reCaptcha div in your form

<?= $this->getChildHtml('msp-recaptcha') ?>
Related Topic