За последние 24 часа нас посетили 22068 программистов и 1105 роботов. Сейчас ищут 706 программистов ...

Помогите доделать проверку данных из формы.

Тема в разделе "Yii", создана пользователем Artur_hopf, 5 июн 2019.

  1. Artur_hopf

    Artur_hopf Активный пользователь

    С нами с:
    7 май 2018
    Сообщения:
    2.266
    Симпатии:
    405
    Добрый день есть такая простоя форма:
    PHP:
    1. <?php $form = ActiveForm::begin(); ?>
    2.    <?= $form->field($model, 'name')->textarea(['rows' => '3'])->label('Введите описание операции:') ?>
    3.    <?= Html::submitButton('Добавить', ['class' => 'btn btn-primary', 'name' => 'login-button']) ?>
    4. <?php ActiveForm::end(); ?>
    есть проверка этой формы:
    PHP:
    1. class ModelCheckList extends ActiveRecord{
    2.  
    3.     public $name;
    4.  
    5.     public function rules(){
    6.         return [
    7.             ['name', 'required', 'message'=>'Не заполнено поле.'],
    8.             ['name', 'string', 'min' => 4, 'tooShort'=>'Описание должно содержать не менее 4 символов.'],
    9.             ['name', 'string', 'max' => 500, 'tooLong'=>'Описание должно содержать не более 500 символов.'],
    10.         ];
    11.     }
    12. }
    Теперь хочу добавить сообщение которое выходит если данные уже существую в бд, делаю так:
    PHP:
    1. class ModelCheckList extends ActiveRecord{
    2.  
    3.     public $name;
    4.  
    5.     public function rules(){
    6.         return [
    7.             ['name', 'required', 'message'=>'Не заполнено поле.'],
    8.             ['name', 'string', 'min' => 4, 'tooShort'=>'Описание должно содержать не менее 4 символов.'],
    9.             ['name', 'string', 'max' => 500, 'tooLong'=>'Описание должно содержать не более 500 символов.'    
    10.             ['name', 'unique', 'targetClass' => ModelCheckList::checkNameOperations() , 'message' => 'Данное описание уже существует'],
    11.         ];
    12.     }
    13.  
    14.     public function checkNameOperations(){
    15.          return false;
    16.      }
    17.  
    18. }
    Подскажите что не так, сообщение об ошибке не выходит =(

    вот инструкция к unique:
    Код (Text):
    1. targetClass: имя класса Active Record, который должен быть использован для проверки значения во входящих данных. Если не установлен, будет использован класс модели, которая в данный момент проходит проверку.
    2. targetAttribute: имя атрибута в targetClass, который должен быть использован для проверки на уникальность входящего значения. Если не установлено, будет использован атрибут, проверяемый в данный момент. Вы можете использовать массив для проверки нескольких столбцов таблицы на уникальность. Значения массива - это атрибуты, которые будут использованы для валидации, а ключи массива - это атрибуты, которые предоставляют данные для валидации. Если ключ и значение одинаковые, вы можете указать только значение.
    3. filter: дополнительный фильтр, который можно присоединить к запросу в БД, чтобы использовать его при проверке значения на уникальность. Это может быть строка или массив, представляющие дополнительные условия для запроса (см. yii\db\Query::where() о формате условий в запросе), или анонимная функция вида function ($query), где $query это объект Query, который вы можете изменить в функции.
    допрет до меня наверное, но так как примеров там нет, думаю долго буду втыкать =)
     
  2. mkramer

    mkramer Суперстар
    Команда форума Модератор

    С нами с:
    20 июн 2012
    Сообщения:
    8.555
    Симпатии:
    1.754
    Чувак, сам же цитируешь, что в targetClass должно быть имя класса ActiveRecord. А ты что туда пихаешь?
     
  3. Artur_hopf

    Artur_hopf Активный пользователь

    С нами с:
    7 май 2018
    Сообщения:
    2.266
    Симпатии:
    405
    @mkramer ну вот же имя класса ModelCheckList потом через двоеточие функция. Ща разберусь =)
     
  4. mkramer

    mkramer Суперстар
    Команда форума Модератор

    С нами с:
    20 июн 2012
    Сообщения:
    8.555
    Симпатии:
    1.754
    @Artur_hopf, имя класса передётся как строка, какое нафиг двоеточие, функция и т.п.? Ты передаёшь false вместо имени класса.
     
  5. Artur_hopf

    Artur_hopf Активный пользователь

    С нами с:
    7 май 2018
    Сообщения:
    2.266
    Симпатии:
    405
    @mkramer если я напишу так, он же не поймет в какой таблице искать данные :eek:
    PHP:
    1. public function rules(){
    2.         return [
    3.             ['name', 'required', 'message'=>'Не заполнено поле.'],
    4.             ['name', 'string', 'min' => 4, 'tooShort'=>'Описание должно содержать не менее 4 символов.'],
    5.             ['name', 'string', 'max' => 500, 'tooLong'=>'Описание должно содержать не более 500 символов.'],
    6.             ['name', 'unique', 'targetClass' => 'ModelCheckList', 'message' => 'Данное описание уже существует']
    7.         ];
    8.     }
    вот как сделать чтобы он понял?
     
  6. Artur_hopf

    Artur_hopf Активный пользователь

    С нами с:
    7 май 2018
    Сообщения:
    2.266
    Симпатии:
    405
    я понимаю что название класса должно быть одинаково с именем таблицы. Но к сожалению таблица может находится в другой базе данных, а так я назвать не могу:
    PHP:
    1. class database_1.dbo.CheckListNameOperations extends ActiveRecord{
    2.  
    3. }
     
  7. mkramer

    mkramer Суперстар
    Команда форума Модератор

    С нами с:
    20 июн 2012
    Сообщения:
    8.555
    Симпатии:
    1.754
    static tableName() для этого имеется, перекрываешь, пишешь своё имя таблицы. И getDb(), которая возвращает, в какой базе данных лазить.

    Имя класса должно быть полным, со всеми namespace. Начиная с php 5.5 для этого предусмотрена предопределённая константа ::class.

    unique не умеет без ActiveRecord по базам лазить
    --- Добавлено ---
    @Artur_hopf, что мешает прочитать от начала до конца документацию к Yii на великом и могучем?
     
    Artur_hopf нравится это.
  8. Artur_hopf

    Artur_hopf Активный пользователь

    С нами с:
    7 май 2018
    Сообщения:
    2.266
    Симпатии:
    405
    @mkramer спасибо большое. Скудоумие мешает читать инструкции :confused: Еще со времен работы на ТЭЦ от инструкций засыпаю, мозги сопротивляются как могут. Могу читать только по блочно, но не все сразу. Такой уж я, но справляюсь =)
    --- Добавлено ---
    Разобрался я в общем по своему, по скудоумский=)