Проблема привязки формы Symfony: пустой массив

у меня есть некоторые трудности с пониманием того, почему моя форма 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] => [email protected] 
        [subject] => rrrr 
        [body] => rrrr 
        [_csrf_token] => 73881c1b6217e221c4d25c065ec93052 ) 

так что это выглядит правильно, но, тем не менее, привязка не выполняется, потому что $this->form->getValues() возвращает пустой массив(), и я не знаю, почему ;s ?! Какие-либо предложения ? Спасибо заранее


person Meph87    schedule 01.03.2010    source источник


Ответы (4)


Вы должны использовать getValues() после проверки правильности формы. В противном случае in вернет пустой массив.

person Darmen Amanbayev    schedule 20.10.2011

Вы можете проверить, какие ошибки выглядят следующим образом:

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

Если вы создаете форму самостоятельно, а не используете помощник Symfony, возможно, вы не включили/отключили токен csrf.

person Tetragon    schedule 19.03.2012

Ваш класс формы кажется прекрасным.

Попробуйте это в своем действии:

$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']);
person Tom    schedule 01.03.2010

Метод bind() делает что-то вроде ниже, поэтому, если ваша форма недействительна, вы получите пустой массив.

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