Estou desenvolvendo um módulo personalizado que contém um envio de formulário. Eu gostaria de adicionar um captcha. E queremos usar a biblioteca captcha padrão do Magento para que o captcha seja consistente com o do formulário de registro.
Você precisa seguir algumas etapas para usar o magento captcha no módulo personalizado.
Passo 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"> <padrão> <cliente> <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> </customer> <captcha translate = "label"> <frontend> <áreas> <form_personalizado> <label> Formulário personalizado </label> </custom_form> </areas> </frontend> </captcha> </default> </config>
Etapa 2: Vá para ' Admin -> Lojas -> Configuração -> Cliente -> Configuração do cliente -> Captcha ' e configure. Você pode ver o novo valor dos formulários 'Formulário personalizado'
Etapa 3: criar Vendor/Module/view/frontend/layout/yourroutid_index_index.xml
<? xml version = "1.0"?> <página xmlns: xsi = "http://www.w3.org/2001/XMLSchema-instance" layout = "1coluna" xsi: noNamespaceSchemaLocation = "urn: magento: framework: Exibir / Layout / etc / page_configuration.xsd"> <head> <title> Formulário personalizado </title> </head> <body> <referenceContainer name = "content"> <block class = "Fornecedor \ Módulo \ Bloco \ CaptchaForm" name = "contactForm" template = "Vendor_Module :: captchaform.phtml"> <nome do contêiner = "form.additional.info" label = "Informações adicionais do formulário"> <classe de bloco = "Magento \ Captcha \ Block \ Captcha" nome = "captcha" depois de "" - "cacheable =" false "> <método de ação = "setFormId"> <nome do argumento = "formId" xsi: type = "string"> custom_form </argument> </action> <action method="setImgWidth"> <nome do argumento = "width" xsi: type = "string"> 230 </argument> </action> <método de ação = "setImgHeight"> <nome do argumento = "width" xsi: type = "string"> 50 </argument> </action> </block> </container> </block> </referenceContainer> <referenceBlock name = "head.components"> <classe de bloco = "Magento \ Framework \ View \ Element \ Js \ Components" nome = "captcha_page_head_components" template = "Magento_Captcha :: js / components.phtml" /> </referenceBlock> </body> </page>
Passo 4: Vendor/Module/Block/CaptchaForm.php
namespace Fornecedor \ Módulo \ Bloco; classe CaptchaForm estende \ Magento \ Framework \ View \ Element \ Template { função pública getFormAction () { retorne $ this-> getUrl ('yourroute / index / post', ['_secure' => true]); } }
Etapa 5: Vendor/Moduel/view/frontend/templates/captchaform.phtml
<form class = "formulário de contato" action = "<? php / * @escapeNotVerified * / echo $ block-> getFormAction ();?>" id = "formulário de contato" method = "post" data-hasrequired = "<? php / * @escapeNotVerified * / echo __ ('* Campos obrigatórios')?>" data-mage-init = '{"validação": {}}'> <fieldset class = "fieldset"> <legend class = "legend"> <span> <? php / * @escapeNotVerified * / echo __ ('Escreva-nos')?> </span> </legend> <br /> <div class = "nome do campo obrigatório"> <label class = "label" for = "name"> <span> <? php / * @escapeNotVerified * / eco __ ('Nome')?> </span> </label> <div class = "control"> <input name = "name" id = "name" title = "<? php / * @escapeNotVerified * / eco __ ('Nome')?>" value = "" class = "input-text" type = "text" data-validate = "{required: true}" /> </div> </div> <div class = "campo email obrigatório"> <label class = "label" for = "email"> <span> <? php / * @escapeNotVerified * / eco __ ('Email')?> </span> </label> <div class = "control"> <input name = "email" id = "email" title = "<? php / * @escapeNotVerified * / eco __ ('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 = "" /> <tipo de botão = "enviar" title = "<? php / * @escapeNotVerified * / eco __ ('Enviar')?>" class = "ação enviar principal"> <span> <? php / * @escapeNotVerified * / echo __ ('Enviar')?> </span> </button> </div> </div> </form>
Agora você pode ver o captcha no seu formulário. Agora é necessário validar seu captcha usando o observador. Então, eu uso o evento predispatch pós-controlador para validação.
Etapa 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: Evento / etc / events.xsd"> <nome do evento = "controller_action_predispatch_yourroute_index_post"> <nome do observador = "captcha_custom_form" instance = "Fornecedor \ Módulo \ Observer \ CheckCustomFormObserver" /> </event> </config>
Etapa 7: Vendor/Module/Observer/CheckCustomFormObserver.php
namespace Vendor \ Module \ Observer; use Magento \ Framework \ Event \ ObserverInterface; use Magento \ Framework \ App \ Request \ DataPersistorInterface; use Magento \ Framework \ App \ ObjectManager; use Magento \ Captcha \ Observer \ CaptchaStringResolver; classe CheckCustomFormObserver implementa ObserverInterface { / ** * @var \ Magento \ Captcha \ Auxiliar \ Dados * / $ _helper protegido; / ** * @var \ Magento \ Framework \ App \ ActionFlag * / protected $ _actionFlag; / ** * @var \ Magento \ Framework \ Message \ ManagerInterface * / protected $ messageManager; / ** * @var \ Magento \ Framework \ App \ Response \ RedirectInterface * / redirecionamento protegido $; / ** * @var CaptchaStringResolver * / protected $ captchaStringResolver; / ** * @var DataPersistorInterface * / private $ dataPersistor; / ** * @param \ Magento \ Captcha \ Helper \ Assistente de dados $ * @param \ Magento \ Framework \ App \ ActionFlag $ actionFlag * @param \ Magento \ Framework \ Message \ ManagerInterface $ messageManager * redirecionamento @param \ Magento \ Framework \ App \ Response \ RedirectInterface $ * @param CaptchaStringResolver $ captchaStringResolver * / função pública __construct ( \ Magento \ Captcha \ Helper \ Data $ helper, \ Magento \ Framework \ App \ ActionFlag $ actionFlag, \ Magento \ Framework \ Message \ ManagerInterface $ messageManager, \ Magento \ Framework \ App \ Response \ RedirectInterface $ redirecionar, CaptchaStringResolver $ captchaStringResolver ) { $ this -> _ helper = $ helper; $ this -> _ actionFlag = $ actionFlag; $ this-> messageManager = $ messageManager; $ this-> redirect = $ redirecionar; $ this-> captchaStringResolver = $ captchaStringResolver; } / ** * Verifique CAPTCHA no formulário personalizado * * @param \ Magento \ Framework \ Evento \ Observer $ observer * @return void * / função pública execute (\ Magento \ Framework \ Event \ Observer $ observer) { $ formId = 'custom_form'; $ captcha = $ this -> _ helper-> getCaptcha ($ formId); if ($ captcha-> isRequired ()) { / ** @var \ Magento \ Framework \ App \ Action \ Action $ controller * / $ controller = $ observer-> getControllerAction (); if (! $ captcha-> isCorrect ($ this-> captchaStringResolver-> resolve ($ controller-> getRequest (), $ formId))) { $ this-> messageManager-> addError (__ ('CAPTCHA incorreto.')); $ this-> getDataPersistor () -> set ($ formId, $ controller-> getRequest () -> getPostValue ()); $ this -> _ actionFlag-> set ('', \ Magento \ Framework \ App \ Action \ Action :: FLAG_NO_DISPATCH, true); $ this-> redirecionar-> redirecionar ($ controller-> getResponse (), 'yourroute / index / index'); } } } / ** * Obter dados Persistor * * @return DataPersistorInterface * / função privada getDataPersistor () { if ($ this-> dataPersistor === null) { $ this-> dataPersistor = ObjectManager :: getInstance () -> get (DataPersistorInterface :: class); } return $ this-> dataPersistor; } }
Para aqueles que não conseguem fazer isso funcionar, talvez seja necessário fazer o que eu fiz:
O motivo pelo qual você captcha pode não estar sendo exibido é porque as configurações básicas são para usar o bloco captcha padrão, que no _toHtml faz uma verificação para ver se o captcha é necessário.
Se você tem suas configurações para o captcha sempre mostrar do que provavelmente não encontrou esse problema, no entanto, se ele não estiver definido para sempre mostrar captchas e você não deseja sempre mostrar captchas (por exemplo, conta / criação de login, etc.) do que você precisa defina a lógica para apenas seu captcha personalizado como "Sempre necessário".
na linha 69 do fornecedor / magento / module-captcha / Block / Captcha / DefaultCaptcha.php você verá:
$this->getCaptchaModel()
chama$this->_captchaData->getCaptcha()
que está no fornecedor / magento / module-captcha / Helper / Data.phpAqui, o método getCaptcha verifica o valor de configuração do tipo de captcha para renderizar e carrega sua fábrica com
$this->_factory->create()
No entanto, entrando nesta classe de fábrica, você verá
A questão aqui é que, independentemente da aparência da fábrica, no módulo Magento Captcha, qualquer modelo de fábrica.
Precisamos criar um plug-in para contornar o auxiliar e verificar nossa chave de formulário. Se ela é usada, precisamos criar uma nova classe de fábrica que carregue nosso modelo que estenda \ Magento \ Captcha \ Model \ DefaultModel e substitua o método isRequired (). Algo que se parece com isso:
em \ Seu \ Módulo \ etc \ di.xml
em Seu \ Módulo \ Plugin \ Helper \ CaptchaData
}
em \ Seu \ Módulo \ Modelo \ CaptchaFactory
e, finalmente, seu modelo para substituir o parâmetro obrigatório em \ Your \ Module \ Model \ Captcha :
fonte
Eu preciso captcha na página de assinante do boletim obrigado sohan eu fui usado observador de boletim e trabalho captcha na página de boletim para mim.
1) app / code / Vendorname / Modulename / etc / config.xml
2) Vá para 'Admin -> Lojas -> Configuração -> Cliente -> Configuração do cliente -> Captcha' e configure. Você pode ver o novo valor dos formulários 'Formulário de Newsletter'.
3) copiar arquivo de layout no tema (default.xml)
4) Criar observador -> criar arquivo event.xml em app / code / Vendorname / Modulename / etc / frontend
5) Crie um modelo de observador e verifique o captcha app / code / Vendorname / Modulename / Observer / CheckCustomFormObserver.php
fonte