Tworzę niestandardowy moduł, który zawiera przesłanie formularza. Chciałbym dodać do niej captcha. I chcemy użyć domyślnej biblioteki captcha Magento, aby captcha była zgodna z tą w formularzu rejestracyjnym.
Aby użyć magento captcha w module niestandardowym, musisz wykonać kilka kroków.
Krok 1 : Vendor/Module/etc/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"> <domyślny> <klient> <captcha> <shown_to_logged_in_user> <custom_form> 1 </custom_form> </shown_to_logged_in_user> <zawsze_do> <custom_form> 1 </custom_form> </always_for> </captcha> </customer> <captcha translate = "label"> <frontend> <obszary> <formularz_dostosowany> <label> Formularz niestandardowy </label> </custom_form> </areas> </frontend> </captcha> </default> </config>
Krok 2: Przejdź do „ Administrator -> Sklepy -> Konfiguracja -> Klient -> Konfiguracja klienta -> Captcha ” i skonfiguruj. Możesz zobaczyć nowe formularze o wartości „Formularz niestandardowy”
Krok 3: Utwórz Vendor/Module/view/frontend/layout/yourroutid_index_index.xml
<? xml version = "1.0"?> <strona xmlns: xsi = "http://www.w3.org/2001/XMLSchema-instance" layout = "1 kolumna" xsi: noNamespaceSchemaLocation = "urn: magento: framework: View / Layout / etc / page_configuration.xsd"> <head> <title> Formularz niestandardowy </title> </head> <body> <referenceContainer name = "content"> <block class = "Vendor \ Module \ Block \ CaptchaForm" name = "contactForm" template = "Vendor_Module :: captchaform.phtml"> <nazwa kontenera = „form.additional.info” label = „Formularz dodatkowe informacje”> <block class = "Magento \ Captcha \ Block \ Captcha" name = "captcha" after = "-" cacheable = "false"> <action method = "setFormId"> <argument name = "formId" xsi: type = "string"> custom_form </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> </block> </referenceContainer> <referenceBlock name = "head.components"> <block class = "Magento \ Framework \ View \ Element \ Js \ Components" name = "captcha_page_head_components" template = "Magento_Captcha :: js / components.phtml" /> </referenceBlock> </body> </page>
Krok 4: Vendor/Module/Block/CaptchaForm.php
przestrzeń nazw Vendor \ Module \ Block; klasa CaptchaForm rozszerza \ Magento \ Framework \ View \ Element \ Template { funkcja publiczna getFormAction () { return $ this-> getUrl ('yourroute / index / post', ['_secure' => true]); } }
Krok 5: Vendor/Moduel/view/frontend/templates/captchaform.phtml
<form class = "formularz kontaktowy" action = "<? php / * @escapeNotVerified * / echo $ block-> getFormAction ();?>" id = „formularz kontaktowy” 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 = "wymagana nazwa pola"> <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 = "" class = "input-text" type = "text" data-validate = "{wymagany: prawda}" /> </div> </div> <div class = "wymagany adres e-mail"> <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 = "" class = "input-text" type = "email" data-validate = "{wymagany: prawda, 'validate-email': true}" /> </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 replace primary"> <span> <? php / * @escapeNotVerified * / echo __ („Prześlij”)?> </span> </button> </div> </div> </form>
Teraz możesz zobaczyć captcha w swojej formie. Teraz musisz zweryfikować swoją captcha za pomocą obserwatora. Tak więc do sprawdzania poprawności używam zdarzenia predispatch kontrolera końcowego.
Krok 6: Vendor/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_yourroute_index_post"> <observer name = "captcha_custom_form" instance = "Vendor \ Module \ Observer \ CheckCustomFormObserver" /> </event> </config>
Krok 7: Vendor/Module/Observer/CheckCustomFormObserver.php
przestrzeń nazw Vendor \ Module \ Observer; użyj Magento \ Framework \ Event \ ObserverInterface; użyj Magento \ Framework \ App \ Request \ DataPersistorInterface; użyj Magento \ Framework \ App \ ObjectManager; użyj Magento \ Captcha \ Observer \ CaptchaStringResolver; klasa CheckCustomFormObserver implementuje ObserverInterface { / ** * @var \ Magento \ Captcha \ Helper \ Data * / chroniony $ _helper; / ** * @var \ Magento \ Framework \ App \ ActionFlag * / chroniony $ _actionFlag; / ** * @var \ Magento \ Framework \ Message \ ManagerInterface * / chroniony $ messageManager; / ** * @var \ Magento \ Framework \ App \ Response \ RedirectInterface * / chronione przekierowanie $; / ** * @var CaptchaStringResolver * / chroniony $ captchaStringResolver; / ** * @var DataPersistorInterface * / prywatne $ dataPersistor; / ** * @param \ Magento \ Captcha \ Helper \ Data $ helper * @param \ Magento \ Framework \ App \ ActionFlag $ actionFlag * @param \ Magento \ Framework \ Message \ ManagerInterface $ messageManager * @param \ Magento \ Framework \ App \ Response \ RedirectInterface $ redirect * @param CaptchaStringResolver $ captchaStringResolver * / funkcja publiczna __construct ( \ Magento \ Captcha \ Helper \ Data $ helper, \ Magento \ Framework \ App \ ActionFlag $ actionFlag, \ Magento \ Framework \ Message \ ManagerInterface $ messageManager, \ Magento \ Framework \ App \ Response \ RedirectInterface $ redirect, CaptchaStringResolver $ captchaStringResolver ) { $ this -> _ helper = $ helper; $ this -> _ actionFlag = $ actionFlag; $ this-> messageManager = $ messageManager; $ this-> redirect = $ redirect; $ this-> captchaStringResolver = $ captchaStringResolver; } / ** * Sprawdź CAPTCHA w formularzu niestandardowym * * @param \ Magento \ Framework \ Event \ Observer $ observer * @render void * / wykonanie funkcji publicznej (\ Magento \ Framework \ Event \ Observer $ observer) { $ formId = 'custom_form'; $ captcha = $ this -> _ helper-> getCaptcha ($ formId); if ($ captcha-> isRequired ()) { / ** @var \ Magento \ Framework \ App \ Action \ Action $ kontroler * / $ controller = $ observer-> getControllerAction (); if (! $ captcha-> isCorrect ($ this-> captchaStringResolver-> resolver ($ 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 (), 'yourroute / index / index'); } } } / ** * Uzyskaj Data Persistor * * @return DataPersistorInterface * / funkcja prywatna getDataPersistor () { if ($ this-> dataPersistor === null) { $ this-> dataPersistor = ObjectManager :: getInstance () -> get (DataPersistorInterface :: class); } return $ this-> dataPersistor; } }
Dla tych z was, którzy nie mogą sprawić, by to zadziałało, może być konieczne zrobienie tego, co ja:
Powodem, dla którego captcha może nie być wyświetlany, jest to, że ustawienia podstawowe mają używać domyślnego bloku captcha, który w _toHtml sprawdza, czy captcha jest wymagany.
Jeśli masz ustawienia, aby captcha zawsze wyświetlała się, prawdopodobnie nie napotkałeś tego problemu, ale jeśli nie jest ustawione, aby zawsze wyświetlać captchas i nie chcesz zawsze pokazywać captchas (tj. Tworzenie konta / logowanie itp.), Niż musisz ustaw logikę tylko dla niestandardowego captcha na „Zawsze wymagane”.
w 69 wierszu dostawcy / magento / module-captcha / Block / Captcha / DefaultCaptcha.php zobaczysz:
$this->getCaptchaModel()
wywołania,$this->_captchaData->getCaptcha()
które znajdują się w vendor / magento / module-captcha / Helper / Data.phpTutaj metoda getCaptcha sprawdza wartość konfiguracji typu captcha do renderowania i ładuje swoją fabrykę
$this->_factory->create()
Jakkolwiek wejdziesz do tej fabryki, zobaczysz
Problem polega na tym, że bez względu na to, jak fabryka będzie wyglądać w module Magento Captcha dla dowolnego modelu Factory .. tak
Musimy stworzyć wtyczkę, która obejmie pomocnika i sprawdzi, czy nasz klucz formularza jest używany, a jeśli jest używany nasz klucz formularza, musimy utworzyć nową klasę fabryczną, która ładuje nasz model, który rozszerza \ Magento \ Captcha \ Model \ DefaultModel i zastępuje metoda isRequired (). Coś, co wygląda tak:
w \ Twój \ Moduł \ etc \ di.xml
w Your \ Module \ Plugin \ Helper \ CaptchaData
}
w \ Twój \ Moduł \ Model \ CaptchaFactory
i na koniec twój model, aby pominąć wymagany parametr w \ Your \ Module \ Model \ Captcha :
źródło
Potrzebuję captcha na stronie subskrybenta biuletynu dzięki sohan, byłem obserwatorem newslettera i captcha pracuje na stronie biuletynu dla mnie.
1) app / code / Vendorname / Modulename / etc / config.xml
2) Przejdź do „Administrator -> Sklepy -> Konfiguracja -> Klient -> Konfiguracja klienta -> Captcha” i skonfiguruj. Możesz zobaczyć nowe formularze o wartości „Formularz biuletynu”.
3) skopiuj plik układu w kompozycji (default.xml)
4) Utwórz obserwatora -> utwórz plik event.xml w app / code / Vendorname / Modulename / etc / frontend
5) Utwórz model obserwatora i sprawdź captcha app / code / Vendorname / Modulename / Observer / CheckCustomFormObserver.php
źródło