0

我是 CakePHP 的菜鸟,我一直在尝试在这里做一些复杂的验证:

我有以下模型: - 字体(名称,文件);- 设置(value1,value2,value3,type_id,script_id);- 类型(名称)

每当我创建一个字体时,我也会创建一个与之关联的默认设置。此外,此设置具有关联的类型。创建字体后,我可以将更多设置与其关联(Font hasMany Settings),但我需要确保没有将两个相同类型的设置添加到该字体中。我不知道如何处理这种情况。任何帮助表示赞赏。谢谢。

4

1 回答 1

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');

并在控制器中捕获它。

实际上,更好的做法是甚至不向用户显示具有相同类型和字体的设置,因此他甚至没有选择的选项。但也需要这种幕后验证。

于 2013-07-08T20:35:03.583 回答