Как разместить ошибку формы yii2 в заголовке тега привязки

как разместить ошибку формы yii2 в заголовке тега привязки

Это мой код

$form = ActiveForm::begin([
    'id' => 'login-form',
    'options' => ['class' => 'form-horizontal'],
    'fieldConfig' => [
        'template' => '
            {label}
            <div class = "error-block">
                <a href = "#" title = "{error}">error</a>
            </div>
            {input}
            ',
        'errorOptions' => ['tag' => null]
    ],
]);

Я хочу добавить ошибку в заголовке тега привязки в YII2

<a href = "#" title = "{error}">error</a>

этот код правильный, я думаю, ваша проблема в ваших модельных правилах, проверьте его

ttrasn 04.12.2018 11:09

Думаю, так не пойдет. Я проверил источник Yii2 и кажется, что {error} по умолчанию использует \yii\helpers\BaseHtml::error(), который генерирует разметку HTML вместо обычной строки ...

Damian Dziaduch 04.12.2018 12:48
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Установка и настройка Nginx и PHP на Ubuntu-сервере
Установка и настройка Nginx и PHP на Ubuntu-сервере
В этот раз я сделаю руководство по установке и настройке nginx и php на Ubuntu OS.
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Как установить PHP на Mac
Как установить PHP на Mac
PHP - это популярный язык программирования, который используется для разработки веб-приложений. Если вы используете Mac и хотите разрабатывать...
2
2
430
1

Ответы 1

Вам необходимо отобразить текст ошибки внутри атрибута title тегов привязки, и использование параметра template не поможет вам добиться этого автоматически.

Несколько моментов в вашем подходе.

  • Вы указываете "tag"=>null под errorOptions, который не создает HTML-код по умолчанию <p class = "help-block help-block-error"></p>.

  • Даже если вы укажете тег как div или span, даже тогда он сломает HTML, поскольку заголовок атрибута имеет двойные кавычки <a href = "#" title = "{error}">error</a>, а созданный тег также будет иметь двойные кавычки <div class = "help-block help-block-error"></div>.

  • Затем, если вы измените <a href = "#" title = "{error}">error</a> на <a href = "#" title=\'{error}\'>error</a>, чтобы исправить сломанный HTML, javascript не сможет обнаружить элемент.

Тогда вам на помощь придет событие afterValidateAttribute, которое срабатывает после проверки всей формы и каждого атрибута.

The signature of the event handler should be:

function (event, attribute, messages)

where

  • event: an Event object.

  • attribute: the attribute being validated. Please refer to attributeDefaults for the structure of this parameter.

  • messages: an array to which you can add additional validation error messages for the specified attribute.

Теперь измените template под fieldConfig на следующий и удалите {error} из шаблона и errorOptions, так как он не нужен, и просто оставьте пользовательский элемент ошибки внутри шаблона.

'fieldConfig' => [
    'template' => '
        {label}
        <div class = "error-block">
            <a href = "#" title = "">error</a>
        </div>
        {input}
        ',
],

Теперь добавьте приведенный ниже javascript вверху вашего представления, где вы визуализируете форму.

$js = <<< JS
$("#login-form").on(
    'afterValidateAttribute',
    function (event,attribute,messages) {
        let input=attribute.input;
        $(input).siblings('.error-block').find('a').attr('title',messages.join(','));
    }
);
JS;
$this->registerJs($js, \yii\web\View::POS_READY);

Теперь, если вы выберете focus из полей или нажмете кнопку отправки, вы увидите, что сообщения об ошибках заполняются атрибутом title тега a.

Другие вопросы по теме