Задать вопрос
  • Yii как сделать валидацию из другой Таблицы?

    myks92
    @myks92 Автор вопроса, куратор тега Yii
    slo_nik, с этим уже тогда разберусь. Но сейчас начал делать и скорее всего понял, что немного не правильно подсказали...

    Я вывожу
    $judgeComitets = $this->judgeComitets;
     var_dump($judgeComitets);


    и в массиве у меня получилось из-за связи hasMany дублирование массива. 5a0898a6d5d6b298240038.png

    Ещё раз попробую объяснить... У меня связь с таблицей должна быть hasOne. Так как у одного назначения может быть одна категория. У меня проблема была не в этом. Я нахожу через связь hasOne id выбранной категории
    $judgeComitets = $this->judgeComitet->judge_id; //ищем id судьи  у выбранной категории судьи.


    Затем мне надо по judge_id найти все категории в таблице"judge_сomitet" Например (Ворожцова Елена 1 категория, Oriental, Ворожцова Елена, 3 категория, Bollywood... ). Далее нужно найти в списках назначений сколько раз был назначен судья. Но искать нужно по id комитету (judge_сomitet_id), так как id судьи мы здесь не заносим. Вот такая сложная схема...

    < b >GredViev5a089ab885a2b586251294.pngДизайн связи5a089acb88e4d086298407.png
  • Yii как сделать валидацию из другой Таблицы?

    myks92
    @myks92 Автор вопроса, куратор тега Yii
    slo_nik, точнооо((( А подскажите ещё такой момент. Теперь я получаю данные по
    $judgeComitets = $this->judgeComitets;

    В результате выводится нужный массив данных из таблицы "judge_сomitet". Правильно ли я понял, что теперь нужно перебрать Массив через foreach? Либо тоже есть возможность вернуться в таблицу appointment и по полученным массиву найти данные?

    Например как-то так
    $this->judgeComitets->appointments->judge_comitet_id;
  • Yii как сделать валидацию из другой Таблицы?

    myks92
    @myks92 Автор вопроса, куратор тега Yii
    slo_nik,

    в модели Judge Comitet
    public function getAppointments()
        {
            return $this->hasMany(Appointment::className(), ['judge_comitet_id' => 'id']);
        }

    в модели Appointments
    public function getJudgeComitet()
        {
            return $this->hasOne(JudgeComitet::className(), ['id' => 'judge_comitet_id']);
        }
  • Yii как сделать валидацию из другой Таблицы?

    myks92
    @myks92 Автор вопроса, куратор тега Yii
    slo_nik, Есть. Подскажите, пожалуйста, как можно через связи получить все данные например судьи (judge_id)? Если я делаю

    $judgeID = $this->judgeComitet->judge_id, то получаю только id текущего судьи. А мне нужно все занчения колонки id выбранного судьи... Для меня правда пока что это ещё сложно. Начал изучать только пару недель назад

    я это делаю так

    $judge_comitetArray = JudgeComitet::find()->select('id')->where(['judge_id'=>$judgeID])->asArray()->all();
  • Yii как сделать валидацию из другой Таблицы?

    myks92
    @myks92 Автор вопроса, куратор тега Yii
    slo_nik Пытаюсь сделать так
    $judgeID = $this->judgeComitet->judge_id;
            $judge_comitetArray = JudgeComitet::find()->select('id')->where(['judge_id'=>$judgeID])->asArray()->all();
            $AppoinmentJudge = Appointment::find()->where(['judge_comitet_id'=>$judge_comitetArray])->count();
  • Yii как сделать валидацию из другой Таблицы?

    myks92
    @myks92 Автор вопроса, куратор тега Yii
    slo_nik, всё таки не могу разобраться... У меня две таблицы. Связи через модели имеются ($this->judgeComitet->id)

    Назначения
    5a0861a44f601745724175.pngКатегории
    5a0861d32a1da278867138.png

    1. Находим в таблице выбранного судью для проверки ($this->judgeComitet->judge_id).
    2. Далее мне нужно получить все id таблицы judge_comitet выбранного судьи и его комитетами для проверки по всем категориям судьи.
    3. Посчитаем все назначения текущего судьи. Если их больше 6 - выдаём ошибку
  • Yii как сделать валидацию из другой Таблицы?

    myks92
    @myks92 Автор вопроса, куратор тега Yii
    slo_nik, спасибо! Почему-то раньше это не видел.
  • Yii как сделать валидацию из другой Таблицы?

    myks92
    @myks92 Автор вопроса, куратор тега Yii
    slo_nik, а что значит when. Не встречал раньше. Спасибо)
  • Yii как сделать валидацию из другой Таблицы?

    myks92
    @myks92 Автор вопроса, куратор тега Yii
    Про это знаю, но мне немного не это нужно. Здесь идёт работа с двумя моделями одновременно... В моем случае модель одна. Но необходимо валидировать данные одной модели по другой. Не знаю как правильно описать, но попробую.

    Выбираем в таблице назначений idшник Таблицы судейских категорий. По этому айдишнику надо считать id судьи. По нему нужно смотреть в таблице назначений сколько раз этот судья назначался. Если больше 6 раз за 1 год и 2 месяца, то выдаём ошибку. Так же надо провалидировать и другие параметры, но по аналогии сделаю легко.

    В базе MySQL решить это можно просто. Соединить две Таблицы в одну через left join и уже через where выбрать судью и посчитать через count().
  • Yii сложная валидация данных, как реализовать?

    myks92
    @myks92 Автор вопроса, куратор тега Yii
    slo_nik, это на какой вопрос ответили?) Для чего scenarios использовать? Вместо валидации?
  • Yii сложная валидация данных, как реализовать?

    myks92
    @myks92 Автор вопроса, куратор тега Yii
    slo_nik,
    1) валидатор unique, проверяете по id или ещё по какому-то параметру.
    2) валидатор range.
    3) в форме не показывать тех судей, у которых срок действия категории истёк.
    4) опять же, перед выводом формы проверять этот параметр и не показывать в форме.
    ....
    Это первое, что пришло на ум, чтобы не писать кучу запросов в validator-ах.
    Делайте сразу с таблицами и связями, меньше мороки будет с валидацией.


    Часть функций и так будет реализовано, но почему пошёл путем валидации, потому что для того, кто имеет права Админа валидация не будет произведена. Если запрашивать сразу с такими данными, то не будет возможности исключений для админа, кроме как через саму базу

    Сейчас некоторые данные валидируются в рулез
    public function rules()
        {
            return [
                [['id_event', 'comitet_id', 'id_judge'], 'required'],
                [['id_event', 'comitet_id', 'id_judge', 'created_at', 'updated_at'], 'integer'],
                [['status'], 'string'],
                [['status'], 'default', 'value' => '0'],
                [['id_event'], 'exist', 'skipOnError' => true, 'targetClass' => Event::className(), 'targetAttribute' => ['id_event' => 'id']],
                [['id_judge'], 'exist', 'skipOnError' => true, 'targetClass' => Judge::className(), 'targetAttribute' => ['id_judge' => 'id']],
                [['comitet_id'], 'exist', 'skipOnError' => true, 'targetClass' => Comitet::className(), 'targetAttribute' => ['comitet_id' => 'id']],
    
                ['id_event', 'validateMaxJugle'],
                //['id_judge', 'validateActive'],
                ['id_judge', 'validateDateOpen'],
                [['id_event','comitet_id', 'id_judge'], 'unique', 'targetClass' => '\backend\models\Appointment', 'targetAttribute' => ['id_event', 'comitet_id', 'id_judge'], 'message' => 'Такое назначение уже существует!'],
            ];
        }
  • Yii сложная валидация данных, как реализовать?

    myks92
    @myks92 Автор вопроса, куратор тега Yii
    slo_nik ещё вопрос: "Как выводить все ошибки в сумме. В моём случае валидация проверяется, но доходит до первого вывода сообщения об ошибки и прекращает валидировать данные. Хочется чтобы сразу все ошибки выводились исходя из выбранных параметров.
    Вывожу с помощью
    $this->addError('', 'У выбранного судьи нет судейской категории выбранного комитета!');


    Возможно использовать нужно "addErrors"
    $this->addErrors('У выбранного судьи нет судейской категории выбранного комитета!');


    Только как это использовать в $form->errorSummary($model)
  • Yii сложная валидация данных, как реализовать?

    myks92
    @myks92 Автор вопроса, куратор тега Yii
    slo_nik Выводить ошибку получилось. А как при этом сделать поля с ошибками красными? Чтобы пользователь видел где исправить данные...

    echo $form->errorSummary($model);
  • Yii сложная валидация данных, как реализовать?

    myks92
    @myks92 Автор вопроса, куратор тега Yii
    slo_nik, вот что нужно для валидации

    1. Нельзя назначить одного судью на одно и то же событие несколько раз
    2. Назначить можно только судью, который имеет судейскую категорию текущего ранга
    3. У судьи должна быть действующая категория (действует 1 год 2 мес) и статус активен
    4. Судью можно назначать ее более 6 раз в течении в течении срока действия лицензии (1 года 2 месяца)
    5. Нельзя назначить одного и тоже судью на одни и те же даты на разные события
    6. Судью можно назначить на одно событие и с разными комитетами
    7. Категории судей которые допускаются к назначениям привязанные к рангу событий
    8. Нельзя назначать одного и того же судью на одно и тоже событие 2 года подряд
    9. VIP судей может быть не более чем указано в настройках
    10. Максимальное кол-во судей может быть только столько, сколько указано в настройках
    11. Присутсвие городов и округов считывается из настроек и проверяется. Например, на Рейтинговые события могут быть только 5 судей из разных городов и Округов. Если один из округа уже имеет назначения - выдаём ошибку

      В кратце написал сколько валидаций нужно, но возможно добавится. В будущем планирую сделать форму, которая автоматически будет выдавать данные по текущим критериям (связанные списки). Но пока что нужно выдать через валидацию

  • Yii сложная валидация данных, как реализовать?

    myks92
    @myks92 Автор вопроса, куратор тега Yii
    slo_nik это только часть данных. Ещё будет примерно 4 таких... Подскажите как улучшить всё это дело.. В принципе всё работает.

    reules
    ['id_event', 'validateMaxJugle'],
                //['id_judge', 'validateActive'],
                ['id_judge', 'validateDateOpen'],
  • Yii сложная валидация данных, как реализовать?

    myks92
    @myks92 Автор вопроса, куратор тега Yii
    public function validateDateOpen()
        {
            $dateToday = date("d-m-Y");//Текущая дата
    
            //Если судья имеет категории, то проверяем на срок действия
            if ( $judgeComitets =  $this->idJudge->judgeComitets ) {
    
                foreach ( $judgeComitets as $judgeComitet ) {
                    //Если у выбранного судьи имеется судейская категории выбранного комитета, то узнаём дату сдачи
                    if ( $judgeComitet->comitet_id == $this->comitet_id ) {
    
                        $dateFrom = $judgeComitet->date_from;//Считываем дату сдачи
                        $date = date_create($dateFrom);//Создаем дату для рассчёта срока
                        date_modify($date, '1 year 2 month');//Прибавляем дату к текущей
                        $dateToCategory = date_format($date, 'd.m.Y');//Форматируем дату
    
                        //Если срок лицензии закончился, то выводим ошибку!
                        if ( $dateToday>$dateToCategory ) {
                            $this->addError('id_judge', 'У выбранного судьи закончился срок действия судейской категории! Срок действия выбранной категории до: '.$dateToCategory.'!');
                        }
    
                    }
                }
    
                if ( empty($dateFrom) ) {
                    $this->addError('comitet_id', 'У выбранного судьи нет судейской категории выбранного комитета!');
                }
    
            }
        }
    
    
        public function validateMaxJugle()
        {
            //Посчитаем общее колличество назначений на текущее событие с учетом статуса "проверяется"
            $aEventCount = Appointment::find()->where(['id_event' => $this->id_event,'status'=>'0','status'=>'1'])->count();
            //Максимальное кол-во судей для назначения по текущеме рангу
            $rangEvent = RangEvent::find()->where(['id' => $this->idEvent->id_rang_event])->one();
            $maxJugle = $rangEvent->col_judge;
            //Если назначений больше, то выдаем ошибку
            if ($aEventCount > $maxJugle) {
                $this->addError('id_event', 'На данное событие нельзя назначить больше '.$maxJugle.' судей!');
            }
        }
  • Yii как сделать автоматическую регистрацию пользователей по Email?

    myks92
    @myks92 Автор вопроса, куратор тега Yii
    slo_nik, тоже не плохое решение. Я изначально также же думал. Обычно логин всегда используется по почте. Думаю, что это не плохой вариант. Попробую, посмотрим как будет лучше. Спасибо за советы)
  • Yii как сделать автоматическую регистрацию пользователей по Email?

    myks92
    @myks92 Автор вопроса, куратор тега Yii
    slo_nik, пока что не приступал. Есть несколько нюансов, которые могу не предусмотреть. Поэтому думал возможно у кого-то есть готовое решение... Например, ребята в комментариях хорошую подсказку дали как генерировать логин. Попрбую реализовать и выложить как готовое решение
  • Yii как сделать автоматическую регистрацию пользователей по Email?

    myks92
    @myks92 Автор вопроса, куратор тега Yii
    Артем, благодарю за помощь) В целом понятно. Попробую реализовать