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






Вам необходимо отобразить текст ошибки внутри атрибута 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 toattributeDefaultsfor 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.
этот код правильный, я думаю, ваша проблема в ваших модельных правилах, проверьте его