Symfony表单绑定问题:空数组

时间:2010-03-01 13:49:10

标签: forms binding symfony1

我在理解为什么我的symfony表单与请求中的数据没有正确绑定时遇到了一些困难......

行动:

public function executeSendEmail(sfWebRequest $request)
  {
      $history_id = $request->getParameter('id');

      if($request->isMethod(sfRequest::POST))
      {
            print_r("POST");

            $this->form = new SendEmailForm();

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

            if(!$this->form->isBound())
                    die('!isBound()');

            print_r($this->form->getValues());

            if($this->form->isValid())
            {
                die('form is Valid!');
            }
            die('after isValid...');
      }

      die('redirect !');

      $this->redirect('history/show?id='.$history_id);
  }

表格类:

class SendEmailForm extends sfForm
{
   public function setup()
   {
    $this->setWidgets(array(
      'author'  => new sfWidgetFormInputText(),
      'email'   => new sfWidgetFormInputText(),
      'subject' => new sfWidgetFormInputText(),
      'body'    => new sfWidgetFormTextarea(),
    ));

    $this->setValidator('email', new sfValidatorEmail());


    $this->widgetSchema->setLabels(array(
          'author'  =>  'Autor',
          'email'   =>  'E-mail',
          'subject' =>  'Tytuł',
          'body'    =>  'Treść wiadomości'
    ));

    $this->widgetSchema->setNameFormat('email_form[%s]');

    $this->errorSchema = new sfValidatorErrorSchema($this->validatorSchema);

    parent::setup();
   }
}

输入操作时,$request->getParameter('email_form')包含:

Array ( 
        [author] => RRr 
        [email] => rr@rrr.com 
        [subject] => rrrr 
        [body] => rrrr 
        [_csrf_token] => 73881c1b6217e221c4d25c065ec93052 ) 

所以它看起来是正确的,但是绑定失败,因为$this->form->getValues()返回空数组()而我不知道为什么; s ?! 有什么建议 ? Thx提前

4 个答案:

答案 0 :(得分:2)

您必须在之后使用getValues() 检查表单是否有效。否则将返回一个空数组。

答案 1 :(得分:2)

您可以测试以查看错误是什么:

  if($this->form->hasErrors())
  {
    echo $this->form->renderGlobalErrors();
  }

如果您自己生成表单,而不是使用Symfony帮助程序,则可能没有包含/禁用csrf标记。

答案 2 :(得分:1)

您的表单类似乎没问题。

在您的行动中尝试此操作:

$this->form = new SendEmailForm();
if($request->isMethod('post')) 
{
    $this->form->bind($request->getParameter('email_form'));
    if($this->form->isValid()) 
    {
        $values = $this->form->getValues();
        var_dump($values['author']);

答案 3 :(得分:0)

bind()方法正在执行类似下面的操作,因此如果您的表单无效,您将获得一个空数组。

try
{
  $this->doBind(...);
  ...
}
catch (sfValidatorErrorSchema $e)
{
  $this->values = array(); //here
  $this->errorSchema = $e;
}