yii2-multiple-input. Отображение ошибки с html

Общие вопросы по использованию второй версии фреймворка. Если не знаете как что-то сделать и это про Yii 2, вам сюда.
Ответить
yura1976
Сообщения: 134
Зарегистрирован: 2012.08.06, 13:24

yii2-multiple-input. Отображение ошибки с html

Сообщение yura1976 »

Добрый день!
Использую unclead yii2-multiple-input. Хочу реализовать следующее: Когда пользователь вводит email, происходит проверка, существует ли такой email в базе. Если не существует, то выводится сообщение "Автор с таким e-mail еще не зарегистрирован. Вы можете добавить его, перейдя по ссылке". Но вместо "ссылке" отображается <a href="my_url">ссылке</a>. Как сделать, чтобы отображался не html-код ссылки, а непосредственно ссылка?

Вот что у меня в форме:

Код: Выделить всё

<?= $form->field($model, 'authors')->widget(MultipleInput::class, [
                    'min' => 1,
                    'max' => 5,
                    'enableError' => true,
                    'columns' => [
                        [
                            'name' => 'emails',
                            'errorOptions' => [
                                'class' => 'invalid-feedback',
                                'encode' => false
                            ],
                        ],
                        // и т.д.
 
В модели:

Код: Выделить всё

 public function rules()
    {
        return [
        	...
        	['author', 'validateAuthors'],
        	...
        ]
        ...
    ]

Код: Выделить всё

    public function validateAuthors($attribute)
    {
        $emailValidator = new EmailValidator();
        $emailValidator->enableIDN = true;

        foreach($this->$attribute as $index => $row) {
            $error = null;
            $emailValidator->validate($row['emails'], $error);
            if (!empty($error)) {
                $key = $attribute . '[' . $index . '][emails]';
                $this->addError($key, $error);
            }
            $authors = Author::find()->where(['email' => $row['emails']])->exists();
            if ($authors === false) {
                $key = $attribute . '[' . $index . '][emails]';
                $link = Html::a('ссылке',['author/authorcreate']);
                $this->addError($key, 'Автор с таким email не зарегистрирован. Вы можете добавить его, перейдя по '.$link);
            }
        }
    }
Для обычных полей textInput() мою проблему решает 'encode' => false. Но в multiinput'е у меня это не сработало. Подскажите, пожалуйста, что я делаю не так. В какую сторону копать?
unknownby
Сообщения: 749
Зарегистрирован: 2019.11.05, 16:34
Контактная информация:

Re: yii2-multiple-input. Отображение ошибки с html

Сообщение unknownby »

yura1976 писал(а): 2024.02.26, 11:56 Подскажите, пожалуйста, что я делаю не так. В какую сторону копать?
Попробуйте сделать идентично, как в примере в rules:
https://forum.yiiframework.com/t/how-to ... ge/79525/4
yura1976
Сообщения: 134
Зарегистрирован: 2012.08.06, 13:24

Re: yii2-multiple-input. Отображение ошибки с html

Сообщение yura1976 »

unknownby писал(а): 2024.02.26, 22:51 Попробуйте сделать идентично, как в примере в rules:
https://forum.yiiframework.com/t/how-to ... ge/79525/4
Если делать одно поле textInput, то в rules вполне можно указывать все как в примере по ссылке. Я так пробовал, работает отлично, но для одного инпута. Но нужно тоже самое применить не к одному полю, а к множественным полям. Атрибут name у каждого из этих полей - элемент массива

Код: Выделить всё

name="UserArticles[authors][0][emails]"
name="UserArticles[authors][1][emails]"
 и т.д. 
В случае с обычным textInput атрибут name выглядит как UserArticles[email].
Вот я поэтому и сделал валидацию в отдельном методе, и там перебрал все эти email'ы в цикле.
unknownby
Сообщения: 749
Зарегистрирован: 2019.11.05, 16:34
Контактная информация:

Re: yii2-multiple-input. Отображение ошибки с html

Сообщение unknownby »

Есть ещё такое замечательное правило
https://www.yiiframework.com/doc/api/2. ... tvalidator

И ещё есть each
Я бы в первую очередь пробовал правила, чем совмещать сразу несколько проверок в одном валидаторе.
Пробуйте разделить задачу на несколько мелких
caHek2x
Сообщения: 1242
Зарегистрирован: 2016.04.12, 20:41

Re: yii2-multiple-input. Отображение ошибки с html

Сообщение caHek2x »

повторил ваш код:

Код: Выделить всё

class FormTest extends Model
{
   public $authors = [
      [
         'emails'=>"куку",
         'names'=>"куку"
      ]
   ];


   public function rules()
   {
      return [
         ['authors', 'validateAuthors'],
      ];
   }

   public function validateAuthors($attribute)
   {
      foreach($this->$attribute as $index => $row) {
         $key = $attribute . '[' . $index . '][emails]';
         $link = Html::a('ссылке',['test']);
         $this->addError($key, 'Автор с таким email не зарегистрирован. Вы можете добавить его, перейдя по '.$link);
      }
   }

   public function attributeLabels()
   {
      return [
         'authors'      => 'Автор',
      ];
   }
}

Код: Выделить всё

<?php $form = ActiveForm::begin() ?>

<?= $form->field($model, 'authors')->widget(MultipleInput::class, [
    'iconSource' => MultipleInput::ICONS_SOURCE_FONTAWESOME,
    'min'         => 1,
    'max'         => 5,
    'enableError' => true,
    'columns'     => [
        [
            'name'         => 'emails',
            'errorOptions' => [
                'encode' => false
            ],
        ],
        [
            'name'         => 'names',
            'errorOptions' => [
                'encode' => false
            ],
        ],

    ]
]); ?>

<button type="submit" class="btn">вперед</button>


<?php ActiveForm::end() ?>
Изображение

дебажьте в vendor/unclead/yii2-multiple-input/src/components/BaseColumn.php есть метод public function renderError($error) он как вы и рассчитыаете использует encode ...
yura1976
Сообщения: 134
Зарегистрирован: 2012.08.06, 13:24

Re: yii2-multiple-input. Отображение ошибки с html

Сообщение yura1976 »

Честно говоря, я в ступоре.
caHek2x
Сообщения: 1242
Зарегистрирован: 2016.04.12, 20:41

Re: yii2-multiple-input. Отображение ошибки с html

Сообщение caHek2x »

почему ? открываете компонент BaseColumn ставите брейк поинты .... включаете дебаг и смотрите что приходит в ошибке что приходит в errorOptions и тд ... и отсюда и делаете вывод что у вас идет не так ...
unknownby
Сообщения: 749
Зарегистрирован: 2019.11.05, 16:34
Контактная информация:

Re: yii2-multiple-input. Отображение ошибки с html

Сообщение unknownby »

caHek2x писал(а): 2024.02.28, 11:57 открываете компонент BaseColumn ставите брейк поинты
Если по-правильному делать, то ему нужно сделать свой компонент BaseColumn и унаследоваться от текущего BaseColumn, переопределить нужный метод у себя в компоненте (скопировать нужный метод) и реализовать нужную логику, которая нужна под проект, в том числе и дебажить через свой компонент.
Думаю одним BaseColumn не обойтись. ;)

Тогда при обновлении проекта его изменения останутся :D
caHek2x
Сообщения: 1242
Зарегистрирован: 2016.04.12, 20:41

Re: yii2-multiple-input. Отображение ошибки с html

Сообщение caHek2x »

зачем ? всё и так работает (выше в чистом проекте я кидал пример что все работает как и требуется автору без никаких наследований и переопределений), просто ему надо понять где у него затык вот и пусть продебажит(дебажить в вендоре это тоже нормально что бы понять логику) ... я же не сказал дебажить и менять чтото внутри вендора ... он или данные не так передает или ошибку не туда вставляет или конфигурирует компонент не так, вот для этого надо это все отдебажить и посмотреть на каком этапе теряется ошибка ...
unclead
Сообщения: 162
Зарегистрирован: 2015.03.13, 19:44

Re: yii2-multiple-input. Отображение ошибки с html

Сообщение unclead »

@yura1976 удалось разобраться?
unclead
Сообщения: 162
Зарегистрирован: 2015.03.13, 19:44

Re: yii2-multiple-input. Отображение ошибки с html

Сообщение unclead »

Чтобы заработали ссылки в тексте ошибки в случае, если используется ajax валидация, нужно использовать attributeOptions

Код: Выделить всё

    
    echo $form->field($model, 'emails')->widget(MultipleInput::className(), [
        'max'  => 6,
        'allowEmptyList' => false,
        'sortable' => true,
        'columns' => [
            [
                'name' => 'emails',
                'options' => [
                    'placeholder' => 'E-mail'
                ],
                'enableError' => true,
                'attributeOptions' => [
                    'encodeError' => false,
                ]
            ]
        ],
 
в документации это указано (здесь), но конечно без хороших примеров это все неочевидно

Если же обычная валидация, то как указано выше через свойство encode в errorOptions
Ответить