我正在尝试修改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的内容,所以我可以为这个特定的错误条件添加一个自定义的错误消息,只有当它发生时......
希望这有助于澄清我的帖子......
答案 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
事件,但在这种情况下我不确定这是否会带来很多好处。如果您更好地描述除了添加测试字符串之外您要完成的任务,我们可以为您提供更好的指导。