【发布时间】:2013-02-26 21:07:46
【问题描述】:
我有这个模型:
Banner:
columns:
filename: string(255)
url: string(255)
position:
type: enum
values: [top, right]
default: right
还有这个表格:
class BannerForm extends BaseBannerForm
{
public function configure()
{
$this->widgetSchema['filename'] = new sfWidgetFormInputFileEditable(array(
'file_src' => $this->getObject()->getThumbURL(),
'is_image' => true,
'edit_mode' => $this->getObject()->exists()
));
$validated_file_class = $this->getObject()->position === 'right' ? 'bannerRightValidatedFile' : 'bannerTopValidatedFile';
$this->validatorSchema['filename'] = new sfValidatorFile(array(
'path' => sfConfig::get('sf_upload_dir'),
'mime_types' => 'web_images',
'validated_file_class' => $validated_file_class',
'required' => $this->getObject()->isNew()
));
}
}
我使用不同的验证类,因为在其中我封装了缩略图操作,并且横幅的大小取决于它的位置字段。 问题是 $validated_file_class 始终是 bannerRightValidatedFile 类。 我怎样才能做到这一点?
【问题讨论】:
-
作为替代解决方案,您可以将图像调整大小放入
Banner类的preSave或postSave方法中,而无需使用验证器@kirugan -
@1ed 是的,我可以,但我认为这会导致代码错误
-
你为什么这么认为?我认为它比下面提到的验证器黑客要干净得多。
-
我更喜欢所有相同登录在一个地方的方式(在我的情况下是验证逻辑和一些特定的回调),将来可能很难重构您建议的代码样式。就个人而言,我使用 preSave 和 postSave 来处理与模型本身相关的事情。
-
我认为这不是验证逻辑,只是根据模型对象的当前状态调整文件大小......但无论如何,如果你想把它放在表单中,那么你应该更改验证文件类就在处理上传的文件之前。您可以通过覆盖
processValues方法或通过添加updateFilenameColumn方法更好地做到这一点。如果您有兴趣,我可以发布一个答案。
标签: forms symfony1 validation symfony-1.4