Это старая версия документа!


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

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

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

  • методы label и hint не заполняют $this→parts['{label}'] и $this→parts['{hint}'] отрендеренным HTML, а сохраняют текстовую часть в labelText и hintText атрибутах
  • в методе render мы уже формируем $this→parts['{label}'] на основании labelText и hintText. $this→parts['{hint}'] остается пустой
    • на самом деле в \yii\bootstrap5\ActiveField есть метод renderLabel и делаем всю магию там
  • $this→parts['{hint}'] можно заполнить методом classicHint, тогда можно отобразить и классическую подсказку после Input

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

  • textAutoresize
  • dokuwikiEdit
  • mardownEdit

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

'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

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

  • инвентаризация/dev/forms.1746120279.txt.gz
  • Последнее изменение: 2025/05/01 17:24
  • admin