Я разрабатываю пользовательский модуль, который содержит отправку формы. Я хотел бы добавить капчу к нему. И мы хотим использовать библиотеку капчи Magento по умолчанию, чтобы капча соответствовала той, что указана в регистрационной форме.
Вам нужно выполнить некоторые шаги для использования magento captcha в пользовательском модуле.
Шаг 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"> <По умолчанию> <Клиент> <CAPTCHA,> <Shown_to_logged_in_user> <Custom_form> 1 </ custom_form> </ Shown_to_logged_in_user> <Always_for> <Custom_form> 1 </ custom_form> </ Always_for> </ CAPTCHA,> </ Клиент> <captcha translate = "label"> <Интерфейс> <области> <Custom_form> <label> Пользовательская форма </ label> </ Custom_form> </ Области> </ Интерфейс> </ CAPTCHA,> </ По умолчанию> </ Config>
Шаг 2: Перейдите « Админ -> Магазины -> Конфигурация -> Клиент -> Конфигурация клиента -> Капча » и настройте. Вы можете увидеть новые значения формы «Пользовательская форма»
Шаг 3: Создать Vendor/Module/view/frontend/layout/yourroutid_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"> <Голова> <title> Пользовательская форма </ title> </ HEAD> <Тело> <referenceContainer name = "content"> <block class = "Vendor \ Module \ Block \ CaptchaForm" name = "contactForm" template = "Vendor_Module :: captchaform.phtml"> <container name = "form.additional.info" label = "Дополнительная информация о форме"> <block class = "Magento \ Captcha \ Block \ Captcha" name = "captcha" after = "-" cacheable = "false"> <action method = "setFormId"> <аргумент name = "formId" xsi: type = "string"> custom_form </ аргумент> </ Действие> <action method = "setImgWidth"> <аргумент имя = "ширина" xsi: тип = "строка"> 230 </ аргумент> </ Действие> <action method = "setImgHeight"> <аргумент имя = "ширина" xsi: тип = "строка"> 50 </ аргумент> </ Действие> </ Блок> </ Контейнер> </ Блок> </ 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> </ Страница>
Шаг 4: Vendor/Module/Block/CaptchaForm.php
namespace Vendor \ Module \ Block; класс CaptchaForm extends \ Magento \ Framework \ View \ Element \ Template { публичная функция getFormAction () { return $ this-> getUrl ('yourroute / index / post', ['_secure' => true]); } }
Шаг 5: Vendor/Moduel/view/frontend/templates/captchaform.phtml
<form class = "форма контакта" action = "<? php / * @escapeNotVerified * / echo $ block-> getFormAction ();?>" ID = "контакт-форма" Метод = «пост» data-hasrequired = "<? php / * @escapeNotVerified * / echo __ ('* Обязательные поля')?>" данных MAGE-инициализации = '{ "Проверка": {}}'> <fieldset class = "fieldset"> <legend class = "legend"> <span> <? php / * @escapeNotVerified * / echo __ ('Напишите нам')?> </ span> </ legend> <br /> <div class = "обязательное имя поля"> <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" данные Validate = "{требуется: истинно}" /> </ DIV> </ DIV> <div class = "поле электронной почты обязательно"> <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 = "{required: true, '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 submit primary"> <span> <? php / * @escapeNotVerified * / echo __ ('Submit')?> </ span> Кнопка </> </ DIV> </ DIV> </ Форма>
Теперь вы можете видеть капчу в вашей форме. Теперь необходимо проверить вашу капчу с помощью обозревателя. Поэтому для проверки я использую событие predispatch после контроллера.
Шаг 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: событие / etc / events.xsd"> <имя события = "controller_action_predispatch_yourroute_index_post"> <наблюдатель name = "captcha_custom_form" instance = "Vendor \ Module \ Observer \ CheckCustomFormObserver" /> </ События> </ Config>
Шаг 7: Vendor/Module/Observer/CheckCustomFormObserver.php
namespace Vendor \ Module \ Observer; использовать Magento \ Framework \ Event \ ObserverInterface; использовать Magento \ Framework \ App \ Request \ DataPersistorInterface; использовать Magento \ Framework \ App \ ObjectManager; использовать Magento \ Captcha \ Observer \ CaptchaStringResolver; Класс CheckCustomFormObserver реализует ObserverInterface { / ** * @var \ Magento \ Captcha \ Helper \ Data * / защищенный $ _helper; / ** * @var \ Magento \ Framework \ App \ ActionFlag * / защищенный $ _actionFlag; / ** * @var \ Magento \ Framework \ Message \ ManagerInterface * / защищенный $ messageManager; / ** * @var \ Magento \ Framework \ App \ Response \ RedirectInterface * / защищенное перенаправление $; / ** * @var CaptchaStringResolver * / protected $ captchaStringResolver; / ** * @var DataPersistorInterface * / приватный $ 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 * / публичная функция __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; } / ** * Проверьте CAPTCHA в пользовательской форме * * @param \ Magento \ Framework \ Event \ Observer $ наблюдатель * @turn void * / публичная функция execute (\ Magento \ Framework \ Event \ Observer $ наблюдатель) { $ formId = 'custom_form'; $ captcha = $ this -> _ helper-> getCaptcha ($ formId); if ($ captcha-> isRequired ()) { / ** @var \ Magento \ Framework \ App \ Action \ Action $ controller * / $ controller = $ наблюдатель-> getControllerAction (); if (! $ captcha-> isCorrect ($ this-> captchaStringResolver-> Resolution ($ controller-> getRequest (), $ formId))) { $ this-> messageManager-> addError (__ ('Неправильная 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'); } } } / ** * Получить данные Персистор * * @return DataPersistorInterface * / приватная функция getDataPersistor () { if ($ this-> dataPersistor === null) { $ this-> dataPersistor = ObjectManager :: getInstance () -> получить (DataPersistorInterface :: класс); } вернуть $ this-> dataPersistor; } }
Для тех из вас, кто не может заставить это работать, вам может понадобиться сделать то, что я сделал:
Причина, по которой ваша капча может не отображаться, заключается в том, что базовые настройки должны использовать блок капчи по умолчанию, который в _toHtml проверяет, требуется ли капча.
Если у вас есть настройки для показа капчи, чтобы всегда показывать, то вы, вероятно, не сталкивались с этой проблемой, однако, если она не установлена, чтобы всегда показывать капчи, и вы не хотите всегда показывать капчи (т.е. создание учетной записи / вход и т. Д.), Чем вам нужно установите логику только для вашей пользовательской капчи на «Всегда быть обязательным».
в строке 69 поставщика / magento / module-captcha / Block / Captcha / DefaultCaptcha.php вы увидите:
$this->getCaptchaModel()
звонки,$this->_captchaData->getCaptcha()
которые находятся в vendor / magento / module-captcha / Helper / Data.phpЗдесь метод getCaptcha проверяет значение конфигурации для типа отображаемой капчи и загружает ее фабрику с помощью
$this->_factory->create()
Однако, войдя в этот заводской класс, вы увидите,
Проблема здесь в том, что независимо от того, как будет выглядеть фабрика в модуле Magento Captcha для любой модели фабрики .. так
Нам нужно создать плагин, чтобы обернуть помощника и проверить наш ключ формы, и если это наш ключ формы используется, нам нужно создать новый фабричный класс, который загружает нашу модель, которая расширяет \ Magento \ Captcha \ Model \ DefaultModel и overides метод isRequired (). Что-то похожее на это:
в \ Your \ Module \ etc \ di.xml
в вашем \ Module \ Plugin \ Helper \ CaptchaData
}
в \ Your \ Module \ Model \ CaptchaFactory
и, наконец, ваша модель для переопределения необходимого параметра в \ Your \ Module \ Model \ Captcha :
источник
Мне нужна капча на странице подписчика на новостную рассылку, спасибо, что я использовал наблюдателя на новостную рассылку, и для меня работала капча на странице новостной рассылки.
1) app / code / Vendorname / Modulename / etc / config.xml
2) Зайдите в «Админ -> Магазины -> Конфигурация -> Клиент -> Конфигурация клиента -> Капча» и настройте. Вы можете увидеть новое значение формы «Форма информационного бюллетеня».
3) скопировать файл макета в тему (default.xml)
4) Создать обозреватель -> создать файл event.xml в приложении / code / Vendorname / Modulename / etc / frontend
5) Создайте модель наблюдателя и проверьте приложение captcha / code / Vendorname / Modulename / Observer / CheckCustomFormObserver.php
источник