我有一个通用的 Image 模型,它由需要附加图像的其他模型链接到。在大多数地方,不需要图像,如果没有上传图像,我们有后备方案,但在一些特殊情况下,我需要强制上传图像以使表单验证,但我不确定如何验证通过另一个模型。例如,我的模型是这样的:
class Person extends AppModel
{
public $belongsTo = array(
'Image' => array(
'className' => 'Image',
'foreignKey' => 'image_id',
'type' => 'LEFT',
)
);
public $validate = array(
...
);
}
该Person
模型包含一些人们必须输入的文本字段以及一个redirect_url
字段。如果设置了重定向,页面逻辑将跳过尝试加载任何内容并直接重定向到该 URL。但是,如果未设置,则需要一堆其他字段。我已经在我的Person
模型中使用自定义验证方法正常工作,但是模型image_id
没有明确检查字段,Person
因为它只是指向Image
模型的指针。
我可以Image
在这种情况下以某种方式添加自定义/动态验证规则以检查是否Person.redirect_url
已设置?我唯一能做的就是将它添加到我的beforeSave()
并基本上手动检查它,$this->data
但如果可能的话,我想以“正确”的方式执行此操作,连接到 Validation 类。
我尝试了一些使用这样的东西的变体,到目前为止没有运气:
$this->Person->Image->validate['id']=array(...);
编辑:
这是我尝试过的,哪种有效:
public function beforeValidate($options=array()) {
parent::beforeValidate($options);
if(empty($this->data['redirect_url'])) {
if (!isset($this->data['Image']['filepath']) {
$this->invalidate('Image.filepath', 'Custom error message.');
return false;
}
}
}
这使我无需在其他地方添加额外的代码就可以使该字段无效,但是当在前端打印出表单字段时,我最终会得到一个通用的“此文件是必需的”错误,而不是我的“自定义错误消息”。我认为这可能是因为文件上传是由一个插件处理的,该插件将它们转移到 S3 而不是本地文件系统,并且它在链上的某个地方被覆盖。