Страницы

Поиск по вопросам

пятница, 10 января 2020 г.

Почему валидация выполняется, хотя должна выдавать ошибку?

#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()

Комментариев нет:

Отправить комментарий