2015-12-03 4 views
4

Я использую szmnmichalowski/ZF2-NoCaptcha для проверок captcha, и у меня есть следующая настройка. Как использовать идентификационный валидатор для проверки элемента формы «captcha» с помощью «g-recaptcha-response», сгенерированного и встроенного в форму «на лету»? Я получаю сообщение «Два указанных токена не соответствуют», даже если я правильно напечатаю код. Но я могу проверить его с помощью специального валидатора.ZF2, ZF2-NoCaptcha, FormValidation

composer.json

{ 
    "require": { 
     "php": ">=5.3.3", 
     "zendframework/zendframework": "2.3.3", 
     "spoonx/sxmail": "1.4.*", 
     "slm/queue": "0.4.*", 
     "szmnmichalowski/zf2-nocaptcha": "dev-master" 
    } 
} 

Config/application.config.php

return array(
    'modules' => array(
     'SxMail', 
     'SlmQueue', 
     'Application', 
     'NoCaptcha' 
    ) 
); 

модуль/Применение/module.php

<?php 
namespace Application; 

class Module implements AutoloaderProviderInterface, ConfigProviderInterface, BootstrapListenerInterface 
{ 
    public function getFormElementConfig() 
    { 
     return array(
      'factories' => array(
       'Application\Form\ContactusForm' => function ($serviceManager) { 
        $form = new \Application\Form\ContactusForm(); 
        return $form; 
       } 

      ) 
     ); 
    } 
} 

модуль/Применение/SRC/Применение/Форма/ContactusForm.php

<?php 
namespace Application\Form; 

use Zend\Form\Element; 
use Zend\Form\Form; 
use Zend\ServiceManager\ServiceLocatorAwareInterface; 
use Zend\InputFilter\InputFilterAwareInterface; 
use Zend\InputFilter\InputFilter; 
use Zend\InputFilter\Factory as InputFactory; 


class ContactusForm extends Form implements InputFilterAwareInterface, ServiceLocatorAwareInterface 
{ 
    protected $inputFilter; 

    public function __construct($name = null) 
    { 
     parent::__construct('ContactUs'); 
    } 

    public function init() 
    { 
     $name = new \Zend\Form\Element\Text('name'); 
     $name->setAttributes(array(
       'class'  => 'form-control', 
       'id'   => 'name', 
       'placeholder' => 'Name', 
       'required' => 'Name required' 
      ) 
     ); 

     $this->add($name); 

     $config = $this->getServiceLocator()->getServiceLocator()->get('config'); 
     $options = $config['application']['captcha']; 

     $captcha = new \NoCaptcha\Captcha\ReCaptcha($options); 

     $this->add(array(
      'type' => 'Zend\Form\Element\Captcha', 
      'name' => 'captcha', 
      'attributes' => array(
       'id'  => 'recaptcha-response', 
      ), 
      'options' => array(
       'label' => 'Are you a bot?', 
       'captcha' => $captcha 
      ) 
     )); 
    } 

    public function getInputFilter() 
    { 
     if (!$this->inputFilter) { 
      $inputFilter = new InputFilter(); 
      $factory = new InputFactory(); 

      $inputFilter->add($factory->createInput([ 
       'name' => 'name', 
       'required' => true, 
       'filters' => array(
        array(
         'name' => 'StripTags' 
        ), 
        array(
         'name' => 'StringTrim' 
        ) 
       ), 
       'validators' => array(
        array(
         'name' => 'not_empty', 
         "options" => array(
          "messages" => array(
           "isEmpty" => "Name is empty." 
          ), 
         ), 
        ), 
       ) 
      ])); 

      $inputFilter->add($factory->createInput([ 
       'name' => 'captcha', 
       'required' => true, 
       'validators' => array(
        array(
         'name' => 'Identical', 
         'options' => array(
          'token' => 'g-recaptcha-response', 
         ) 
        ) 
       ) 
      ])); 

      $this->inputFilter = $inputFilter; 
     } 

     return $this->inputFilter; 
    } 
} 

модуль/Application/SRC/Application/Controller/IndexController.php

<?php 
namespace Application\Controller; 

use Application\Form\ContactusForm; 

class IndexController extends ApplicationController 
{ 
    public function __construct(
     \Application\Service\EmailService $emailService 
    ) { 
     $this->emailService = $emailService; 
    } 

    public function indexAction() 
    { 
     $contactUsForm = $this->getServiceLocator()->get('FormElementManager')->get('Application\Form\ContactusForm'); 
     $contactUsForm->setTranslator($this->translator); 

     $request = $this->getRequest(); 

     if ($request->isPost()) { 

      $postData = $request->getPost(); 
      $contactUsForm->setData($postData); 

      if ($contactUsForm->isValid()) { 
       $emailJob = $this->getJobManager()->get('Application\Job\Email'); 
       $emailJob->setContent(
       //content 
       ); 
       $this->getDoctrineQueue()->push($emailJob); 

       $successMessage = $this->translator->translate('Message successfully sent.'); 
       $this->flashMessenger()->addSuccessMessage($successMessage); 
       $this->redirect()->toRoute('home'); 

      } else { 
       $errorMessage = $this->translator->translate('Message failed. Please try again'); 
       $this->flashMessenger()->addErrorMessage($errorMessage); 
      } 
     } 

     $viewModel = new ViewModel(); 
     $viewModel->setVariable('form', $contactUsForm); 

     return $viewModel; 
    } 
} 

ответ

2

Кажется, что много работы. Попробуйте это вместо: https://github.com/Saeven/zf2-circlical-recaptcha

Раскрытие информации: Я автор, но, по крайней мере, могу гарантировать, что он работает.

+0

Спасибо. ZF2-NoCaptcha также работает. Я ищу идентичный валидатор. –

+0

Вам не нужно тождественно проверять капчу. Класс capcha, указанный выше, имеет доступный для проверки тип проверки. Дайте мне знать, если вам сложно провести время. – Saeven

0

Вы посмотрите на свободный модуль ZF2 mxreCaptcha, который может:

  1. Гораздо проще использовать
  2. Имеет более единицы тестовое покрытие
  3. Под CI/CD
  4. зрелыми и о версиях
  5. SemVer
  6. использовано в коммерческих целях
Смежные вопросы