Отображение ошибок проверки формы в шаблоне (Symfony) - PullRequest
0 голосов
/ 07 апреля 2010

допустим, у меня есть блог с модулем "пост".

теперь я отображаю сообщение вроде этого: post / index? Id = 1

в index-action я генерирую новую CommentForm и передаю ее в виде $ this-> form в шаблон, и она отображается внизу поста (это просто текстовое поле, ничего особенного). Действие формы установлено на «post / addcomment». Как я могу отобразить ошибки проверки в этой форме? использование setTemplate ('index') не работает, потому что мне пришлось бы передать ему id = 1 ...

спасибо

UPDATE:

вот пример кода:

  public function executeIndex(sfWebRequest $request)
  {
      $post = Doctrine::getTable('Posts')->find($request->getParameter('id'));
      $this->post = $post->getContent();

      $comments = $post->getComment();

      if ($comments->count() > 0)
              $this->comments = $comments;

      $this->form = new CommentForm();
      $this->form->setDefault('pid', $post->getPrimaryKey());
  }

  public function executeAddComment(sfWebRequest $request) {
  $this->form = new CommentForm();

  if ($request->isMethod('post') && $request->hasParameter('comment')) {
      $this->form->bind($request->getParameter('comment'));
      if ($this->form->isValid()) {
          $comment = new Comment();
          $comment->setPostId($this->form->getValue('pid'));
          $comment->setComment($this->form->getValue('comment'));
          $comment->save();
          $this->redirect('show/index?id='.$comment->getPostId());
      }
  }

}

и моя форма комментария:

class CommentForm extends BaseForm {
    public function configure() {
        $this->setWidgets(array(
                'comment'       => new sfWidgetFormTextarea(),
                'pid'           => new sfWidgetFormInputHidden()
        ));

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

        $this->setValidators(array(
                'comment'   => new sfValidatorString(
                        array(
                            'required' => true,
                            'min_length' => 5
                            ),
                        array(
                            'required'   => 'The comment field is required.',
                            'min_length' => 'The message "%value%" is too short. It must be of %min_length% characters at least.'
                            )),
                'pid'       => new sfValidatorNumber(
                        array(
                            'required' => true,
                            'min'      => 1,
                            'max'      => 4294967295
                            ),
                        array(
                            'required'   => 'Some fields are missing.'
                            ))
        ));
    }
}

и, наконец, indexSuccess:

<?php echo $post; ?>

//show comments (skipped)

<h3>Add a comment</h3>

<form action="<?php echo url_for('show/addComment') ?>" method="POST">
    <table>
        <?php echo $form ?>
        <tr>
            <td colspan="2">
                <input type="submit" />
            </td>
        </tr>
    </table>
</form>

вот и все.

Ответы [ 3 ]

0 голосов
/ 13 апреля 2010

Если вы используете sf 1.4, просто соедините executeAddComments и executeIndex в одну функцию (например, executeIndex), и все будет в порядке. setTemplate здесь не будет работать.

0 голосов
/ 14 апреля 2010

Попробуйте изменить действие формы на

<?php echo url_for('show/addComment?id=' . $post->getId()) ?>

При этом ваш параметр идентификатора поста должен быть доступен даже по вашему запросу поста, и он должен работать с setTemplate ('index') или вперед в конце executeAddComment

0 голосов
/ 07 апреля 2010

Используете ли вы метод handleError в действии? Часть id = 1 вашего URL не должна изменяться, если внутри метода handleError вы делаете возврат sfView :: SUCCESS;

UPDATE:

Это на самом деле меняется, вам нужно отправить идентификатор вместе с комментарием [что, я уверен, вы уже делаете, потому что комментарий, не относящийся к сообщению, не имеет большого смысла] затем в вашем методе handleError создайте экземпляр объекта post.

...