Содержание

, ,

Инвентаризация: DEV: Forms

ActiveField

Поскольку у нас шаблон ввода в форме не стандартный, а
{Label} с иконкой и {hint} завернутым в tooltip, {input}, {error}

Переделываем (наследуем) Activefield (от \yii\bootstrap5\ActiveField) следующим образом

Text

Сделал метод для ввода текста →text($options=[]), который может вызывать

В зависимости от настройки

'textFields'=>[
		'default'=>'text',
		'Aces.ips'=>'text',	//IP адреса хранить иначе чем текст нет смысла
		'Aces.notepad'=>'markdown',
		'Acls.notepad'=>'markdown',
		'Comps.ip'=>'text',
		'Comps.mac'=>'text',
		'Comps.raw_hw'=>'text',
		'Comps.raw_sw'=>'text',
		'Comps.external_links'=>'text',
		'MaintenanceReqs.description'=>'markdown',
		'MaintenanceReqs.links'=>'text',
		'LicTypes.links'=>'text',
		'Networks.notepad'=>'markdown',
	],

Была следующая проблема: если у формы явно не задан ID, то он (т.к. форма наследуется от виджета) формируется как префикс (w) + индекс (0), поэтому по умолчанию у формы ID = w0.
И если на страницу, в которой уже есть форма, через Popup + Ajax подгрузить еще одну форму, то она соответственно тоже будет w0, т.к. она была первой на подгруженной странице. И тут возникает проблема с инициализацией JavaScript, т.к. к форме прилагается скрипт инициализации, и если формы называются одинаково, то возникает коллизия.

пример скрипта инициализации

во избежание подобных коллизий мы делаем в init по умолчанию id вида className-id-form
Для этого во всех формах желательно указывать модель через конфиг

Placeholders

Во-первых у ArmsModel есть метод getAttributePlaceholder($attribute), который возвращает плейсхолдер для поля ввода атрибута.
Если атрибут отмечен как is_inheritable, то возвращает унаследованное значение (либо указанное в inheritablePlaceholder параметре атрибута (может быть и функцией))
Во вторых в ActiveField все методы для вывода инпутов переопределены для подгрузки плейсхолдеров
В третьих в форме по умолчанию включена Ajax валидация, которая в ArmsBaseController тоже переопределена и к данным валидации добавляет значения плейсхолдеров для валидируемого набора значений модели. Зачем? Меняем родителя - меняются унаследованные значения, которые видно в плейсхолдерах
В четвертых, чтобы обрабатывать передаваемые плейсхолдеры к форме прикрепляется обработчик события OnAjaxComplete

Валидация

По умолчанию формы включают ajax валидацию, но чтобы сгенерировать url валидации по умолчанию (который обслуживается через ArmsBaseController) нужно указывать модель в конфигурацию формы