जवाबों:
आपको कस्टम मॉड्यूल में magento कैप्चा का उपयोग करने के लिए कुछ कदम का पालन करने की आवश्यकता है।
चरण 1 : Vendor/Module/etc/config.xml
<? xml संस्करण = "1.0"?> <config xmlns: xsi = "http://www.w3.org/2001/XMLSchema-instance" xsi: noNamespaceSchemaLocation = "कलश: Magento: मॉड्यूल: Magento_Store, आदि / config.xsd"> <डिफ़ॉल्ट> <ग्राहक> <कैप्चा> <Shown_to_logged_in_user> <Custom_form> 1 </ custom_form> </ Shown_to_logged_in_user> <Always_for> <Custom_form> 1 </ custom_form> </ Always_for> </ कैप्चा> </ ग्राहक> <कैप्चा अनुवाद = "लेबल"> <दृश्यपटल> <क्षेत्रों> <Custom_form> <लेबल> कस्टम फ़ॉर्म </ लेबल> </ Custom_form> </ क्षेत्रों> </ दृश्यपटल> </ कैप्चा> </ डिफ़ॉल्ट> </ Config>
चरण 2: गोटो ' व्यवस्थापक -> स्टोर -> कॉन्फ़िगरेशन -> ग्राहक -> ग्राहक कॉन्फ़िगरेशन -> कैप्चा ' और कॉन्फ़िगर करें। आप नए फॉर्म मूल्य 'कस्टम फॉर्म' देख सकते हैं
चरण 3: बनाएँ Vendor/Module/view/frontend/layout/yourroutid_index_index.xml
<? xml संस्करण = "1.0"?> <पृष्ठ xmlns: xsi = "http://www.w3.org/2001/XMLSchema-instance" लेआउट = "1column" xsi: noNamespaceSchemaLocation = "urn: magento:" दृश्य / लेआउट / etc / page_configuration.xsd "> <Head> <शीर्षक> कस्टम फ़ॉर्म </ शीर्षक> </ Head> <Body> <संदर्भकॉर्नर नाम = "सामग्री"> <block class = "Vendor \ Module \ Block \ CaptchaForm" नाम = "contactForm" टेम्पलेट = "Vendor_Module :: captchaform.phtml"> <कंटेनर का नाम = "form.additional.info" लेबल = "अतिरिक्त जानकारी"> <block class = "Magento \ Captcha \ Block \ Captcha" नाम = "कैप्चा" के बाद = "-" cacheable = "false"> <क्रिया विधि = "setFormId"> <तर्क नाम = "formId" xsi: प्रकार = "स्ट्रिंग"> custom_form </ तर्क> </ कार्रवाई> <क्रिया विधि = "setImgWidth"> <तर्क नाम = "चौड़ाई" xsi: प्रकार = "स्ट्रिंग"> 230 </ तर्क> </ कार्रवाई> <क्रिया विधि = "setImgHeight"> <तर्क नाम = "चौड़ाई" xsi: प्रकार = "स्ट्रिंग"> 50 </ तर्क> </ कार्रवाई> </ ब्लॉक> </ कंटेनर> </ ब्लॉक> </ ReferenceContainer> <संदर्भबेल नाम = "हेड.कॉमपर्सेंट्स"> <block class = "Magento \ Framework \ View \ Element \ Js \ Components" नाम = "कैप्चा_पेज_हेड_कंप्यूटर" टेम्पलेट = "Magento_Captcha :: js / Components.phtml" /> </ ReferenceBlock> </ Body> </ पेज>
चरण 4: Vendor/Module/Block/CaptchaForm.php
नाम स्थान विक्रेता \ मॉड्यूल \ ब्लॉक; class CaptchaForm \ Magento \ फ्रेमवर्क \ View \ Element \ टेम्पलेट का विस्तार करता है { सार्वजनिक समारोह getFormAction () { $ यह लौटाएं-> getUrl ('yourroute / index / post', ['_secure' => true]); } }
चरण 5: Vendor/Moduel/view/frontend/templates/captchaform.phtml
<form class = "फ़ॉर्म संपर्क" कार्रवाई = "<? php / * @escapeNotVerified * / गूंज $ ब्लॉक-> getFormction ()>?" id = "संपर्क फार्म" विधि = "पोस्ट" data-hasrequired = "<? php / * @escapeNotVerified * / echo __ ('* आवश्यक फ़ील्ड')?>" डेटा-दाना-init = '{ "सत्यापन": {}}'> <फ़ील्डसेट वर्ग = "फ़ील्डसेट"> <किंवदंती वर्ग = "किंवदंती"> <अवधि> <? php / * @escapeNotVerified * / echo __ ('हमें लिखें')?> </ अवधि> </ किंवदंती> <br /> <div class = "फ़ील्ड नाम आवश्यक"> <लेबल वर्ग = "लेबल" के लिए = "नाम"> <span> <? php / * @escapeNotVerified * / echo __ ('नाम')?> </ अवधि> </ लेबल> <div class = "control"> <इनपुट नाम = "नाम" आईडी = "नाम" शीर्षक = "<? php / * @escapeNotVerified * / echo __ ('नाम')?>" मूल्य = "" वर्ग = "इनपुट-पाठ" प्रकार = "पाठ"? डेटा सत्यापित करें = "{आवश्यक: सच}" /> </ Div> </ Div> <div class = "फ़ील्ड ईमेल आवश्यक"> <लेबल वर्ग = "लेबल" के लिए = "ईमेल"> <span> <? php / * @escapeNotVerified * / echo __ ('ईमेल')?> </ अवधि> </ लेबल> <div class = "control"> <इनपुट नाम = "ईमेल" आईडी = "ईमेल" शीर्षक = "<? php / * @escapeNotVerified * / echo __ ('ईमेल')?" "मूल्य =" "वर्ग =" इनपुट-पाठ "प्रकार = ईमेल"? data-validate = "{आवश्यक: सत्य, 'सत्यापन-ईमेल': true}" /> </ Div> </ Div> <; php इको $ ब्लॉक-> getChildHtml ('form.additional.info'); ?> </ Fieldset> <div class = "actions-toolbar"> <div class = "प्राथमिक"> <इनपुट प्रकार = "छिपा हुआ" नाम = "छिपाएँ" आईडी = "छिपाएँ" मूल्य = "" /> <बटन प्रकार = "सबमिट करें" शीर्षक = "<? php / * @escapeNotVerified * / echo __ ('सबमिट')?" "वर्ग =" क्रिया प्राथमिक सबमिट करें>> <span> <? php / * @escapeNotVerified * / echo __ ('सबमिट')?> </ span> </ बटन> </ Div> </ Div> </ Form>
अब आप कैप्चा को अपने फॉर्म में देख सकते हैं। अब पर्यवेक्षक का उपयोग करके अपने कैप्चा को मान्य करने की आवश्यकता है। इसलिए मैं सत्यापन के लिए पोस्ट कंट्रोलर प्रीस्पैच घटना का उपयोग करता हूं।
चरण 6: Vendor/Module/etc/frontend/events.xml
<? xml संस्करण = "1.0"?> <config xmlns: xsi = "http://www.w3.org/2001/XMLSchema-instance" xsi: noNamespaceSchemaLocation = "कलश: Magento: ढांचा: घटना / घटना / घटना। xsd"> <घटना का नाम = "कंट्रोलर_एक्शन_प्रिस्पीस्पैच_यूर्राउट_इंडेक्स_पोस्ट"> <पर्यवेक्षक नाम = "captcha_custom_form" उदाहरण = "विक्रेता \ मॉड्यूल \ Observer \ CheckCustomFormObserver" /> </ घटना> </ Config>
चरण 7: Vendor/Module/Observer/CheckCustomFormObserver.php
नाम स्थान विक्रेता \ मॉड्यूल \ Observer; Magento \ Framework \ Event \ ObserverInterface का उपयोग करें; Magento \ Framework \ App \ Request \ DataPersistorInterface का उपयोग करें; Magento \ Framework \ App \ ObjectManager का उपयोग करें; Magento \ Captcha \ Observer \ CaptchaStringResolver का उपयोग करें; वर्ग CheckCustomFormObserver ऑब्ज़र्वरइंटरफेस लागू करता है { / ** * @var \ Magento \ Captcha \ Helper \ Data * / संरक्षित $ _helper; / ** * @var \ Magento \ Framework \ App \ ActionFlag * / संरक्षित $ _actionFlag; / ** * @var \ Magento \ फ्रेमवर्क \ संदेश \ ManagerInterface * / संरक्षित $ संदेश प्रबंधक / ** * @var \ Magento \ Framework \ App \ Response \ RedirectInterface * / संरक्षित $ पुनर्निर्देशित; / ** * @वर कैप्चास्ट्रिंग * / संरक्षित $ captchaStringResolver; / ** * @var DataPersistorInterface * / निजी $ डेटापर्सिस्टर; / ** * @param \ Magento \ Captcha \ Helper \ Data $ सहायक * @param \ Magento \ Framework \ App \ ActionFagag $ ActionFlag * @param \ Magento \ फ्रेमवर्क \ संदेश \ ManagerInterface $ संदेश प्रबंधक * @param \ Magento \ Framework \ App \ Response \ RedirectInterface $ पुनर्निर्देशन * @ अपार कैप्चास्ट्रिंग * / सार्वजनिक समारोह __construct ( \ Magento \ Captcha \ Helper \ Data $ सहायक, \ Magento \ Framework \ App \ ActionFagag $ ActionFlag, \ Magento \ Framework \ संदेश \ ManagerInterface $ संदेश प्रबंधक, \ Magento \ Framework \ App \ Response \ RedirectInterface $ पुनर्निर्देशन, CaptchaStringResolver $ captchaStringResolver ) { $ यह -> _ सहायक = $ सहायक; $ यह -> _ एक्शनफ्लैग = $ एक्शनफ्लैग; $ यह-> संदेश प्रबंधक = $ संदेश प्रबंधक; $ यह-> पुनर्निर्देश = $ पुनर्निर्देशित; $ यह-> captchaStringResolver = $ captchaStringResolver; } / ** * कस्टम फॉर्म पर कैप्चा की जाँच करें * * @param \ Magento \ Framework \ Event \ Observer $ पर्यवेक्षक * @ व्रत शून्य * / सार्वजनिक समारोह निष्पादित (\ Magento \ Framework \ Event \ Observer $ पर्यवेक्षक) { $ formId = 'custom_form'; $ कैप्चा = $ यह -> _ सहायक-> getCaptcha ($ formId); अगर ($ कैप्चा-> अप्रमाणित ()) { / ** @वर \ _ Magento \ Framework \ App \ Action \ Action $ नियंत्रक * / $ नियंत्रक = $ पर्यवेक्षक-> getControllerAction (); अगर ($ captcha-> सही है ($ यह-> captchaStringResolver-> संकल्प ($ नियंत्रक-> getRequest (), $ formId)) { $ यह-> संदेश प्रबंधक-> addError (__ ('गलत कैप्चा')); $ यह-> getDataPersistor () -> सेट ($ formId, $ नियंत्रक-> getRequest () -> getPostValue ()); $ यह -> _ एक्शनफ्लैग-> सेट ('', \ Magento \ Framework \ App \ Action \ क्रिया :: FLAG_NO_DISPATCH, सच); $ यह-> पुनर्निर्देशित-> पुनर्निर्देशित ($ नियंत्रक-> getResponse (), 'yourroute / index / index /); } } } / ** * डेटा Persistor जाओ * * @ ग्रेट डेटापर्सिस्टरइंटरफेस * / निजी फ़ंक्शन getDataPersistor () { अगर ($ यह-> डेटापर्सिस्टर === नल) { $ यह-> dataPersistor = ObjectManager :: getInstance () -> मिल (DataPersistorInterface :: वर्ग); } $ यह लौटाएं-> डेटापर्सिस्टर; } }
आप में से उन लोगों के लिए जिन्हें यह काम करने के लिए नहीं मिल सकता है जो आपको करने की आवश्यकता हो सकती है:
आपके द्वारा कैप्चा का कारण प्रदर्शित नहीं किया जा सकता है क्योंकि आधार सेटिंग्स को डिफ़ॉल्ट कैप्चा ब्लॉक का उपयोग करना है जो कि _toHtml में यह देखने के लिए जांच करता है कि कैप्चा की आवश्यकता है या नहीं।
यदि आपके पास कैप्चा के लिए हमेशा आपके द्वारा दिखाने के लिए सेटिंग है, तो शायद आप इस मुद्दे पर नहीं चले, लेकिन अगर यह हमेशा कैप्चा दिखाने के लिए सेट नहीं है और आप हमेशा कैप्चा (यानी खाता बनाना / लॉगिन आदि) को दिखाना नहीं चाहते हैं तो आपको इसकी आवश्यकता है "हमेशा आवश्यक होना" के लिए केवल अपने कस्टम कैप्चा के लिए तर्क सेट करें।
विक्रेता / मैगनेटो / मॉड्यूल-कैप्चा / ब्लॉक / कैप्चा / DefaultCaptcha.php की लाइन 69 पर आप देखेंगे:
/**
* Renders captcha HTML (if required)
*
* @return string
*/
protected function _toHtml()
{
if ($this->getCaptchaModel()->isRequired()) {
$this->getCaptchaModel()->generate();
return parent::_toHtml();
}
return '';
}
$this->getCaptchaModel()
कॉल $this->_captchaData->getCaptcha()
जो कि
वेंडर / मैगनेटो / मॉड्यूल-कैप्चा / हेल्पर / डाटा.पीपी में है
/**
* Get Captcha
*
* @param string $formId
* @return \Magento\Captcha\Model\CaptchaInterface
*/
public function getCaptcha($formId)
{
if (!array_key_exists($formId, $this->_captcha)) {
$captchaType = ucfirst($this->getConfig('type'));
if (!$captchaType) {
$captchaType = self::DEFAULT_CAPTCHA_TYPE;
} elseif ($captchaType == 'Default') {
$captchaType = $captchaType . 'Model';
}
$this->_captcha[$formId] = $this->_factory->create($captchaType, $formId);
}
return $this->_captcha[$formId];
}
यहाँ getCaptcha विधि अपने कारखाने को रेंडर करने और लोड करने के लिए कैप्चा के प्रकार के लिए कॉन्फ़िगरेशन मान की जाँच करता है $this->_factory->create()
हालाँकि इस फैक्ट्री क्लास में कदम रखते ही आप देखेंगे
public function create($captchaType, $formId)
{
$className = 'Magento\Captcha\Model\\' . ucfirst($captchaType);
$instance = $this->_objectManager->create($className, ['formId' => $formId]);
if (!$instance instanceof \Magento\Captcha\Model\CaptchaInterface) {
throw new \InvalidArgumentException(
$className . ' does not implement \Magento\Captcha\Model\CaptchaInterface'
);
}
return $instance;
}
यहाँ मुद्दा यह है कि किसी भी कारखाने के मॉडल के लिए मैगेंटो कैप्चा मॉड्यूल में कोई भी कारखाना नहीं दिखेगा
हमें हेल्पर के चारों ओर लपेटने के लिए एक प्लगइन बनाने की जरूरत है और हमारे फॉर्म कुंजी की जांच करें और अगर यह हमारी फॉर्म कुंजी का उपयोग किया जा रहा है, तो हमें एक नया कारखाना वर्ग बनाने की आवश्यकता है जो हमारे मॉडल को लोड करता है जो \ Magento \ Captcha \ Model \ DefaultModel और ओवरडोज़ को बढ़ाता है isRequired () विधि। कुछ इस तरह दिखता है:
in \ Your \ मॉड्यूल \ 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">
<!--Custom Captcha-->
<type name="\Magento\Captcha\Helper\Data">
<plugin name="custom-captcha" type="Your\Module\Plugin\Helper\CaptchaData" />
</type>
में आपका \ मॉड्यूल \ प्लगइन \ हेल्पर \ CaptchaData
<?php
namespace Your\Module\Plugin\Helper;
class CaptchaData
{
protected $_captcha = [];
public function __construct(
\Your\Module\Model\CaptchaFactory $captchaFactory
) {
$this->captchaFactory = $captchaFactory;
}
/**
* @param \Magento\Captcha\Helper\Data $subject
* @param \Closure $proceed
* @param $formId
* @return mixed
*/
public function aroundGetCaptcha(\Magento\Captcha\Helper\Data $subject, \Closure $proceed, $formId)
{
if ($formId == 'your_form_key') {
$this->_captcha[$formId] = $this->captchaFactory->create();
return $this->_captcha[$formId];
}
return $proceed($formId);
}
}
in \ Your \ Module \ Model \ CaptchaFactory
<?php
/**
* Captcha model factory
*
* Copyright © Magento, Inc. All rights reserved.
* See COPYING.txt for license details.
*/
namespace Your\Module\Model;
class CaptchaFactory
{
/**
* @var \Magento\Framework\ObjectManagerInterface
*/
protected $_objectManager;
/**
* @param \Magento\Framework\ObjectManagerInterface $objectManager
*/
public function __construct(\Magento\Framework\ObjectManagerInterface $objectManager)
{
$this->_objectManager = $objectManager;
}
/**
* Get captcha instance
*
* @param string $captchaType
* @param string $formId
* @return \Magento\Captcha\Model\CaptchaInterface
* @throws \InvalidArgumentException
*/
public function create()
{
$instance = $this->_objectManager->create('Your\Module\Model\Captcha', ['formId' => 'event_subscriber']);
if (!$instance instanceof \Magento\Captcha\Model\CaptchaInterface) {
throw new \InvalidArgumentException(
'Your\Module\Model\Captcha does not implement \Magento\Captcha\Model\CaptchaInterface'
);
}
return $instance;
}
}
और अंत में आपके मॉडल के अतिरेक के लिए \ Your \ Module \ Model \ Captcha में परम आवश्यक है :
<?php
namespace Your\Module\Model;
class Captcha extends \Magento\Captcha\Model\DefaultModel
{
public function isRequired($login = null)
{
return true;
}
}
मुझे न्यूजलेटर सब्सक्राइबर पेज में कैप्चा की आवश्यकता है, धन्यवाद सोहन मैं न्यूजलेटर पर्यवेक्षक और मेरे लिए न्यूजपेपर पेज में कैप्चा काम करता था।
1) ऐप / कोड / वेंडोर्न / मोडुलनेम / आदि / config.xml
<?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>
<customer>
<captcha>
<shown_to_logged_in_user>
<custom_newsletter>1</custom_newsletter>
</shown_to_logged_in_user>
<always_for>
<custom_newsletter>1</custom_newsletter>
</always_for>
</captcha>
</customer>
<captcha translate="label">
<frontend>
<areas>
<custom_newsletter>
<label>Newsletter Form</label>
</custom_newsletter>
</areas>
</frontend>
</captcha>
</default>
</config>
2) गोटो 'व्यवस्थापक -> स्टोर -> कॉन्फ़िगरेशन -> ग्राहक -> ग्राहक कॉन्फ़िगरेशन -> कैप्चा' और कॉन्फ़िगर करें। आप नए फॉर्म मूल्य 'न्यूज़लेटर फॉर्म' देख सकते हैं।
3) थीम में कॉपी लेआउट फ़ाइल (default.xml)
<block class="Magento\Newsletter\Block\Subscribe" name="subscribe form " template="Magento_Newsletter::subscribe.phtml">
<container name="form.additional.info" label="Form Additional Info">
<block class="Magento\Captcha\Block\Captcha" name="captcha" after="-" cacheable="false">
<action method="setFormId">
<argument name="formId" xsi:type="string">custom_newsletter</argument>
</action>
<action method="setImgWidth">
<argument name="width" xsi:type="string">230</argument>
</action>
<action method="setImgHeight">
<argument name="width" xsi:type="string">50</argument>
</action>
</block>
</container>
4) ऑब्जर्वर बनाएं -> ऐप / कोड / इवेंट / वेंडोर्नम / मोड्यूलनाम / आदि में इवेंट। 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_newsletter_subscriber_new">
<observer name="captcha_newletter_form" instance="Vendorname/Modulename/Observer\CheckCustomFormObserver" />
</event>
</config>
5) ऑब्जर्वर मॉडल बनाएं और कैप्चा ऐप / कोड / वेंडोर्नेम / मोडुलनेम / ऑब्जर्वर / चेककस्टमफोर्मबसेवर.php की जांच करें
public function execute(\Magento\Framework\Event\Observer $observer)
{ $formId = 'custom_newsletter';
$captcha = $this->_helper->getCaptcha($formId);
if ($captcha->isRequired()) {
/** @var \Magento\Framework\App\Action\Action $controller */
$controller = $observer->getControllerAction();
$params=$controller->getRequest()->getPost();
$currentpage = $params['currentpage'];
if (!$captcha->isCorrect($this->captchaStringResolver->resolve($controller->getRequest(), $formId))) {
$this->messageManager->addError(__('Incorrect CAPTCHA.'));
$this->getDataPersistor()->set($formId, $controller->getRequest()->getPostValue());
$this->_actionFlag->set('', \Magento\Framework\App\Action\Action::FLAG_NO_DISPATCH, true);
$this->redirect->redirect($controller->getResponse(), $currentpage);
}
}
}