symfony 1.4同时验证两个字段[是“修改processForm中的响应内容”]

时间:2011-02-15 23:02:21

标签: php symfony-1.4 httpresponse

我正在尝试修改Symfony 1.4中某些操作的响应内容。

当我处理某些表单时,在某些条件之后,在processForm方法中(一个调用表单绑定,并给出表单处理操作的最终结果)。

我试过

function processForm(sfWebRequest $request, sfForm $form)
{
   $form->bind(...);
   // ... some validations/operations ...

   $cont = $this->getResponse()->getContent();
   $this->getResponse()->setContent("MODIFICATION!" . $cont);
   $this->getResponse()->sendContent();
}

但是这个当前发送给我一个“无法修改标题信息 - 标题已经发送”错误...

这一切都可能吗?还是我在胡说八道? 有什么想法吗?

谢谢!

修改 我想要做的是以下几点。

在executeNew操作中,我必须进行一些验证。所有字段特定的验证都使用相应的表单验证器正确完成。

但是有一个验证同时考虑了2个字段的值,而不仅仅是其中一个。所以,还没有找到同时为这两个字段制作验证器的方法,我决定通过重写表单的isValid方法,调用parent :: isValid方法来验证,并验证我的2字段条件这里也。验证失败时,我返回false,因为isValid()应该。但是,当发生此特定错误时,我还没有找到如何在表单附近编写错误消息。这就是为什么我希望改变Response的内容,所以我可以为这个特定的错误条件添加一个自定义的错误消息,只有当它发生时......

希望这有助于澄清我的帖子......

1 个答案:

答案 0 :(得分:2)

修改

您需要做的是创建帖子或预验证器。这将允许您一次验证两个字段的某些附加条件。很难说如何实施,因为我们不知道您的验证规则,但以下文档应该有所帮助:http://www.symfony-project.org/more-with-symfony/1_4/en/06-Advanced-Forms#chapter_06_ignoring_embedded_forms

这将向您展示如何制作postValidator并在表单上使用它。有时虽然您不需要重用此代码,因此创建类是过度的。在这种情况下,您可以在表单上创建自定义方法并使用sfValidatorCallback ..例如:

class myForm {


  public function configure()
  {
     // normal config stuff

    $this->mergePostValidator(new sfValidatorCallback(array(
      'callback' => array($this, 'postValidate')
    )));
  }

  public function postValidate($validator, $values, $arguments)
  {
     // your post validator code
  }
}

这样做可以像通常那样为另一个验证器定义错误消息。


processForm不是您要转发的操作,因此调用它的操作仍将尝试发送内容以及不正常的内容。问题是sendContent实际上将内容回显给浏览器...所以当调用操作尝试再次按照预期发送标题和内容时,您会得到典型的标题已发送错误。

如果您需要立即发送内容,请在sfStopExecutionException后抛出sendContent。但我怀疑那是你真正想要做的。可能最好的做法是不发送内容但允许控制正常返回调用操作,然后处理从那里发送内容。

您还可以将监听器附加到response.filter_content事件,但在这种情况下我不确定这是否会带来很多好处。如果您更好地描述除了添加测试字符串之外您要完成的任务,我们可以为您提供更好的指导。