我有一个通用的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
的指针1}}模型。
我可以以某种方式在此实例中向Image
添加自定义/动态验证规则,以检查是否设置了Person.redirect_url
吗?我唯一可以做的就是将它添加到我的beforeSave()
并基本上使用$this->data
手动检查它,但如果可能的话,我想以“正确”的方式执行此操作,挂钩到验证类。
我尝试使用类似的东西做了一些变化,到目前为止没有运气:
$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而不是本地文件系统,并且它在链的某个地方被覆盖。