4

Собственно ситуация такая:

Есть некоторая модель, в которой прописано следующее (делал по примеру):

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. Заранее извиняюсь, если объяснил не совсем внятно.

Deleted
  • 371

2 Answers2

2

я бы сделал что-то типа этого.

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' //при изменении записи
zenith
  • 2,434
  • 2
  • 27
  • 47
  • Если делать так, то courses_id и end_at будут проверять на уникальность по отдельности. А мне надо чтобы их сочетание было уникальным – arivlaver Aug 01 '13 at 13:13
  • Так я именно по этому примеру и делал))) и вот возник такой глюк – arivlaver Aug 01 '13 at 15:26
  • Короче не знаю куда написать, но кому то может пригодится. На собственные вопросы отвечать пока не могу. Нашел самое простое на мой взгляд решение (много не думать) http://yiihaa.com/validate-unique-constraints-with-more-then-one-attribute . Работает все супер. Только в параметре 'with'=>'атрибу1,атрибут2,...' указывайте все без пробелов – arivlaver Aug 02 '13 at 06:37
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()

Demyan112rv
  • 1,440