Zend - Recaptcha странная проблема - работает, но не так, как ожидалось - PullRequest
0 голосов
/ 09 января 2011

У меня странная проблема. Я тестирую Zend и мне нужно было добавить поле reCaptcha в форму. Я следовал примеру, приведенному в документации Zend, он не работал (привыкая к этому). Получал ошибку «неверный-captcha-sol».

Прочитав некоторое время, я наконец-то смог заставить его работать. Однако кажется, что метод isValid возвращает противоположное тому, что вы ожидаете.

Вот код:

Форма:

class Application_Form_Album extends Zend_Form {

public function init() {


    ## Set Recapture


    $this->setName('album');
    $this->setMethod('POST');
    $id = new Zend_Form_Element_Hidden('id');
    $id->addFilter('Int');
    $artist = new Zend_Form_Element_Text('artist');
    $artist->setLabel('Artist')
            ->setRequired(true)
            ->addFilter('StripTags')
            ->addFilter('StringTrim')
            ->addValidator('NotEmpty');
    $title = new Zend_Form_Element_Text('title');
    $title->setLabel('Title')
            ->setRequired(true)
            ->addFilter('StripTags')
            ->addFilter('StringTrim')
            ->addValidator('NotEmpty');
    $submit = new Zend_Form_Element_Submit('submit');
    $submit->setAttrib('id', 'submitbutton');


    //Change theme
    $recaptcha = new Zend_Service_ReCaptcha("XXXXXXX","XXXXXXX");
    $recaptcha->setOption('theme', 'clean');
    $captcha = new Zend_Form_Element_Captcha('challenge', array('captcha' => 'ReCaptcha','captchaOptions' => array('captcha' => 'ReCaptcha','service' => $recaptcha)));



    $this->addElements(array($id, $artist, $title, $captcha, $submit));
}

}

И метод контроллера:

    public function addAction()
{



    $auth = Zend_Auth::getInstance();
    if ($auth->hasIdentity()) {
        $form = new Application_Form_Album();
        $form->submit->setLabel('Add');
        $this->view->form = $form;
        if ($this->getRequest()->isPost()) {

                $formData = $this->getRequest()->getPost();
                if ($form->isValid($formData)) {

                    $captcha = new Zend_Service_ReCaptcha("XXXXXXX","XXXXXXX");
                    $result = $captcha->verify($this->_getParam('recaptcha_challenge_field'),
                                                 $this->_getParam('recaptcha_response_field'));

                    if ($result->isValid()) {
                        //ReCaptcha validation error
                        #echo "CAPTCHA FAILED!<br>";

                    } else {
                        $artist = $form->getValue('artist');
                        $title = $form->getValue('title');
                        $albums = new Application_Model_DbTable_Albums();
                        $albums->addAlbum($artist, $title);
                        $this->_helper->redirector('index');
                    }


                } else {
                    $form->populate($formData);
                }
       }
    } else {
        $this->_helper->redirector('index','auth');
    }

}

Я бы предположил ($ result-> isValid ()), чтобы вернуть TRUE при вводе действительной капчи. После некоторого растягивания волос я понял, что $ result-> isValid () возвращает FALSE, когда капча была успешно введена, и TRUE, если были введены неправильные слова или слова?

Я что-то упустил? Кто-нибудь знает, почему это может происходить?

1 Ответ

0 голосов
/ 09 января 2011

Не думаю, что вам нужно создавать новую Zend_Service_ReCaptcha в вашем контроллере. Форма должна заботиться об этом. Вместо if ($result->isValid()) {, попробуйте получить элемент captcha из формы и посмотреть, действительно ли это. Взгляните на пример в http://framework.zend.com/manual/en/zend.captcha.operation.html

Это может выглядеть примерно так:

if ($form->getElement('challenge')->isValid() {
...