#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()
Комментариев нет:
Отправить комментарий