0

我有一个通用的 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 而不是本地文件系统,并且它在链上的某个地方被覆盖。

4

0 回答 0