我是CakePHP的菜鸟,我一直在尝试做一些复杂的验证:
我有以下型号: - 字体(名称,文件); - 设置(value1,value2,value3,type_id,script_id); - 类型(名称)
每当我创建一个Font时,我也会创建一个与之关联的默认设置。此外,此设置具有关联的类型。创建字体后,我可以将更多设置关联到它(字体有多个设置),但我需要确保相同类型的两个设置不会添加到该字体。我不知道如何处理这个案子。任何帮助表示赞赏。感谢。
答案 0 :(得分:0)
我使用简单的beforeSave验证
//in setting.php model
public function beforeSave($options = array()) {
if (isset($this->data[$this->alias]['font_id']) && isset($this->data[$this->alias]['type_id']) {
$otherSettings = $this->find('all', array('conditions'=>
array('type_id'=>$this->data[$this->alias]['type_id'],
'font_id'=>$this->data[$this->alias]['font_id']);
//check if it's insert or update
$updated_id = null;
if ($this->id)
$updated_id = $this->id;
if (isset($this->data[$this->alias][$this->primaryKey]))
$updated_id = $this->data[$this->alias][$this->primaryKey];
if (count($otherSettings) > 0) {
if ($updated_id == null)
return false; //it's not an update and we found other records, so fail
foreach ($otherSettings as $similarSetting)
if ($updated_id != $similarSetting['Setting']['id'])
return false; //found a similar record with other id, fail
}
}
return true; //don't forget this, it won't save otherwise
}
这会阻止将新设置插入相同类型的相同字体。请记住,如果验证不正确,此验证将返回false,但您必须处理警告用户错误的方式。您可以从beforeSave中抛出异常并在控制器中捕获它们以向用户显示闪存消息。或者您可以不保存这些设置并让用户弄清楚(不好的做法)。
您也可以在模型中创建一个类似的函数,如checkPreviousSettings
,其逻辑与我上面写的类似,检查要保存的设置是否有效,如果没有向用户显示消息在尝试保存之前。
我更喜欢的选项是异常处理错误,在这种情况下,您必须将return false
替换为
throw new Exception('Setting of the same type already associated to the font');
并在控制器中捕获它。
实际上,更好的方法是甚至不向用户显示具有相同类型和字体的设置,因此他甚至没有选择的选项。但是也需要这种幕后验证。