4

これについてかなりの数の投稿を読みましたが、問題を解決できませんでした。Zend フォームのキャプチャを検証しようとすると、正しいテキストであっても常に失敗します。これが私のコードです:

// フォームを呼び出す場所

 public function contactAction()
{
    $this->view->form = new Forms_ContactForm();
}

//私のフォーム

class Forms_ContactForm extends Twitter_Form
{
public function init()
{
    $this->setAction( 'email/email/contact' );
    $this->setMethod('post');

    $this->addElement('text', 'strFirstName', array( 
            'required' => true,
            'label' => 'Your First Name' ) );

    $this->addElement('text', 'strLastName', array( 
            'required' => true,
            'label' => 'your Last Name' ) );

    $this->addElement('text', 'strEmail', array( 'validators' => array(
            array('EmailAddress') ),
            'required' => true,
            'label' => 'Your Email' ) );

    $this->addElement('textarea', 'strContent', array( 
            'required' => true,
            'label' => 'Your message' ) );

    $this->addElement('captcha', 'captcha', array(
            'label'      => 'Please enter the 5 letters displayed below:',
            'required'   => true,
                            'name'       => 'captchaField',
            'captcha' => 'image',
            'captchaOptions' => array(  
                            'captcha' => 'image',  
                            'font'=> 'static/font/arial.ttf',
                            'imgDir'=>'static/img/captcha',
                            'imgUrl'=> 'static/img/captcha/',
                    'wordLen' => 5,
                    'fsize'=>20,
                    'height'=>60,
                    'width'=>200,
                    'gcFreq'=>50,
                    'expiration' => 300)

            ));


    $this->addElement('submit', 'submit', array('class' => 'Submit') );
}
}

// そしてそれを送信する私のアクション

public function contactAction()
{
    if( $this->_request->isPost() )
    {
        $objForm = new Forms_ContactForm();

        if( $objForm->isValid($_POST) )
        {
            $arrParams = $this->_request->getParams();
            if( $arrParams['strFirstName'] && $arrParams['strLastName'] && $arrParams['strEmail'] && $arrParams['strContent'] ) 
            {
                $this->_objEmail = new Zend_Mail();
                $this->_objEmail ->setFrom( $arrParams['strEmail'] );
                $this->_objEmail ->setSubject( 'C' );
                $this->_objEmail ->setBodyHtml( 'Message from: '. $arrParams['strFirstName'] . ' ' . $arrParams['strLastName'] . 
                                                '<BR>eMail address: ' . $arrParams['strEmail'] . '<BR><BR>'
                                                . $arrParams['strContent'] );

                $this->_objEmail ->addTo( 'mail@gmail.com' );

                $this->view->bolSent = $this->_objEmail->send();
            }
        }
        else
            $this->view->form = $objForm;
    }
}

私のcontactActionでは、新しいキャプチャコードが生成されるようです。そのため、送信したものと一致しませんが、修正方法がわかりません。

お時間をいただき、ありがとうございました!!

危険な何かを見ました:接触アクションで $_POST をダンプすると、ここに私の結果があります:

array
'strFirstName' => string 'fghjfghj' (length=8)
'strLastName' => string 'ffffffff' (length=8)
'strEmail' => string 'fvhkbno@biu.fr' (length=14)
'strContent' => string 'fewfew' (length=6)
'captchaField' => string 'cebfe69ead38dba86a6b557dc8853b24' (length=32)

入力したばかりのキャプチャが表示されず、代わりにキャプチャ ケイが表示されます !!??

編集

あなたのリプレイをありがとう!!! あなたの変更があってもまだそこにはありませんが、私は何が間違っていると思います. キャプチャ フィールドの html は次のとおりです。

<div class="control-group">
   <label class="control-label required" for="captchaField-input">Please enter the 5  letters displayed below:</label>
   <div class="controls">
       <img width="200" height="60" src="static/img/captcha/ab2d15044a637338064b39cfd2675837.png" alt="">
       <input type="hidden" id="captchaField-id" value="ab2d15044a637338064b39cfd2675837" name="captchaField[id]">
       <input type="text" value="" id="captchaField-input" name="captchaField[input]">
       <input type="text" value="ab2d15044a637338064b39cfd2675837" id="captchaField" name="captchaField">
   </div>
</div>

送信されたパラメーターを見ると、次のようになります。

captchaField ab2d15044a637338064b39cfd2675837 captchaField[id] ab2d15044a637338064b39cfd2675837 captchaField[入力] 6af7u

cptchaField は [id] と [input] を上書きしているようです

この captchaField を削除する必要があるように感じますが、これまでのところ方法がわかりません!

私はJSでそれを行うことができましたが、そうするためのきれいな方法が必要です!

もう一度編集

シリアル化を使用してフォームを送信するために ajax を使用しています。それが問題かもしれません。

TER編集

ajaxが原因ではありません。手動で行を削除した場合:

 <input type="text" value="ab2d15044a637338064b39cfd2675837" id="captchaField" name="captchaField">

firebug では、すべてが正常であり、キャプチャは適切に検証されます。問題は、この行を適切に削除する方法です...

解決

苦労した後、ここに解決策があります(デコレータを削除します)!

$captcha = new Zend_Form_Element_Captcha('captchaField',
        array('label' => "Please enter the 5  letters displayed below:",
            'required'=>true,
            'captcha' => array(
            'captcha' => 'image',
            'font'=> 'static/font/arial.ttf',
            'imgDir'=>'static/img/captcha',
            'imgUrl'=> 'static/img/captcha/',
            'wordLen' => 5,
            'fsize'=>20,
            'height'=>60,
            'width'=>200,
            'gcFreq'=>50,
            'expiration' => 300
        )
    ));

    $this->addElement($captcha);    
    $this->getElement('captchaField')->removeDecorator("viewhelper");
4

2 に答える 2

4

多くの苦労をした後、ここに解決策があります(私は単にデコレータを削除する必要がありました)!

$captcha = new Zend_Form_Element_Captcha('captchaField',
    array('label' => "Please enter the 5  letters displayed below:",
        'required'=>true,
        'captcha' => array(
        'captcha' => 'image',
        'font'=> 'static/font/arial.ttf',
        'imgDir'=>'static/img/captcha',
        'imgUrl'=> 'static/img/captcha/',
        'wordLen' => 5,
        'fsize'=>20,
        'height'=>60,
        'width'=>200,
        'gcFreq'=>50,
        'expiration' => 300
    )
));

$this->addElement($captcha);    
$this->getElement('captchaField')->removeDecorator("viewhelper");

あなたの助けとあなたの時間をありがとうハルーン:)

于 2012-06-17T10:26:33.683 に答える
1

コードは次のようにする必要があると思います。contactAction.phpファイルではpublic function contactAction() 、フォームとフォームが投稿されたときのアクションの表示を処理する必要があると思います):

//Display the form

$objForm = new Forms_ContactForm();

$this->view->form = $objForm;



//Handle the form, when it has been posted including validation etc

if( $this->_request->isPost() )
{  
    if( $objForm->isValid($_POST) )
    {
        //processing logic etc
    }        
}

フォームがPOSTされた後にフォームをインスタンス化しているため、現在、コードはデータ入力に対して確認するために新しいキャプチャを生成しています。上記のコード例で示したように、フォームのこのインスタンス化は、フォームが投稿される前に実行する必要があります。

編集

これを試して:

$captcha = new Zend_Form_Element_Captcha('captchaField',
    array('label' => "Please enter the 5  letters displayed below:",
        'required'=>true,
        'captcha' => array(
        'captcha' => 'image',
        'font'=> 'static/font/arial.ttf',
        'imgDir'=>'static/img/captcha',
        'imgUrl'=> 'static/img/captcha/',
        'wordLen' => 5,
        'fsize'=>20,
        'height'=>60,
        'width'=>200,
        'gcFreq'=>50,
        'expiration' => 300
    )
));

$this->addElement($captcha);

編集後のこの新しいコードは、ZendFrameworkバージョン1.11.1を使用して機能します

どのバージョンのZendFrameworkを歌っていますか?また、キャプチャはビューファイルにどのように表示されていますか?

出力をvarダンプする場合、キャプチャ要素については、次のようなものを期待する必要があります。ここで、「5g4ef」は、キャプチャ入力要素に入力したデータです。

["captchaField"]=> array(2) { ["id"]=> string(32) "88bb26d62e9fa19b67937c35be4a8cc7" ["input"]=> string(4) "5g4ef" }

于 2012-06-16T12:20:22.263 に答える