0

単純なログインモジュールにSymfony1.4フォームを使用しています。かなり基本的なフォームのコードは次のとおりです。

<?php 

class LoginForm extends sfFormSymfony 
{
 public function configure()
 {
  $this->setWidgets( 
         array('username' => new sfWidgetFormInputText(),
               'password' => new sfWidgetFormInputPassword(),));
              // 'remember_me' => new sfWidgetFormSelectCheckbox(array('choices'=>array('true'=>''))),));

   $this->widgetSchema->setNameFormat('login[%s]');
   $this->setValidators(array(
         'username' =>  new sfValidatorString(array('required'=>true)),        
         'password' =>  new sfValidatorString(array('required'=>true)),
     ));
 }

}

フォームは、期待どおりにテンプレートページで正常にレンダリングされます。参考までに、フォームをエコーアウトする代わりに、$ form ['username']-> renderメソッドを使用して、好きな場所にメソッドを個別にレンダリングします。

投稿時に(認識されます)、次のように値をフォームにバインドします。

$this->form->bind($request->getParameter('login')); 

ただし、条件に反して失敗します

$this->form->isValid();

両方のフィールドが空のままになっておらず、クレデンシャルが正しいので、これは私にはもっと陰湿なようです。

var_dump($ this-> form-> getValues());を実行すると 空の配列を返します。これは、値が取得もバインドもされていないことを意味すると思います。

誰かが私が混乱している可能性のある場所を見つけることができますか?

ありがとう

4

3 に答える 3

2

symfony 1.3以降、csrf保護はデフォルトで有効になっています。これは、すべてのフォームがデフォルトで名前が付けられたcsrfトークンフィールドを取得することを意味します。これは_csrf_token、セッションと指定されたフォームタイプに固有の非表示フィールドです。

このフィールドをレンダリングしてフォームの残りの部分と一緒に送信しないと、無効になります。csrf攻撃が検出されるため、この方法が適しています。

簡単な修正は、トークンフィールドをレンダリングすることです。

echo $form["_csrf_token"]->render();

しかし、より良い方法は、すべての非表示フィールドを一度にレンダリングすることです(私は通常、送信ボタンの横でこれを行いました):

echo $form->renderHiddenFields();
于 2012-08-06T07:18:07.143 に答える
1

本当に必要な場合は、小さなスニペットを使用して次のようなエラーを表示できます。

foreach ($this->getErrorSchema() as $field => $error) {

    if ($error instanceof sfValidatorErrorSchema) {
        foreach ($error as $field => $error) break;
    }

    echo $field . ' => ' . $error; // e.g. "Field name" => "Error message".

}
于 2012-08-06T07:29:34.400 に答える
0

@Maerlynはこれを解決しました。将来の参考のために:

フォームフィールドは、vanilla echo $ formを使用する代わりに、個別にレンダリングされていました。このため、$ form ['_ csrf_token']-> render()をレンダリングしませんでした。ログインに失敗したため。csrf_tokenフィールドもレンダリングすれば、準備は完了です。

于 2012-08-06T06:57:05.720 に答える