#yii
Собственно ситуация такая: Есть некоторая модель, в которой прописано следующее (делал по примеру): public function rules() { return array( array('begin_at', 'uniqueBeginAndEnd', 'message'=>'Сроки проведения с такими условиями уже заданы'), ); } public function uniqueBeginAndEnd($attribute,$params=array()) { if(!$this->hasErrors()) { $params['criteria']=array( 'condition'=>'courses_id=:courses_id AND end_at=:end_at', 'params'=>array(':courses_id'=>(int)$_GET['id'], ':end_at'=>$this->end_at), ); $validator=CValidator::createValidator('unique',$this,$attribute,$params); $validator->validate($this,array($attribute)); } } Т.е. если я буду пытаться создать новую или редактировать уже существующую запись, а запись с такими датами уже есть в таблице, то мне выдастся сообщение 'Сроки проведения с такими условиями уже заданы'. Так вот в чем проблема: на добавление новой записи валидация работает, а на редактирование нет (т.е. update проходит в любом случае). Что добавление, что редактbрование делается стандартным $model->save() P.S. Заранее извиняюсь, если объяснил не совсем внятно.
Ответы
Ответ 1
я бы сделал что-то типа этого. public function rules() { return array( array( 'courses_id, end_at', 'unique', 'className' => 'название модели через которую ищем значение', 'attributes' => array('первовый атрибут', 'второй атрибут'), 'message' => 'Сроки проведения с такими условиями уже заданы'), array('courses_id, end_at', 'required'), array('courses_id, end_at', 'numerical'), ); } UPDATE И в таком случае стоит проверять что было передано от юзера, для этого нужны последние два правила. Я предположил что end_at это число. Если это дата то нужен валидатор date UPDATE 2 С учётом вашего комментария: На хеш-коде уже есть похожий вопрос с принятым ответом (легко ищется через яндекс по запросу "yii проверить уникальность") Коротко: вам нужно указать в правиле 'on'=>'add' //сработает при выполнении сценария добавления записи 'on'=>'edit' //при изменении записиОтвет 2
Я делаю немного по другому валидацию, отличную от стандартных. Вот пример валидации имени товара: public function rules() { return array( array('name', 'filter', 'filter' => 'strip_tags'), array('name', 'filter', 'filter' => 'trim'), array('name', 'validItemName') ); } public function validItemName($attribute,$params=array()) { $pattern = "/[\!\?\"\'\+\_\/\|]/"; preg_match($pattern, $this->name, $matches); if($matches){ $this->addError('name', 'Недопустимый символ '.$matches[0]); } } Возможно и Вам следует добавлять самостоятельно ошибку через $this->addError()
Комментариев нет:
Отправить комментарий