Тип subform поля формы Joomla

Тип subform поля формы предоставляет метод для использования форм XML внутри друг друга или повторного использования форм внутри существующей формы. Если для атрибута Multiple установлено значение true, включенная форма будет повторяемой.

Поле имеет два «предустановленных» макета для отображения подчиненной формы в виде таблицы или контейнера div, а также поддержку пользовательских макетов.

Пример XML определения поля для одиночного режима

<field name="field-name" type="subform"
    formsource="path/to/exampleform.xml"
    label="Subform Field" description="Subform Field Description" />

Пример XML определения поля для множественного режима

<field name="field-name" type="subform"
    formsource="path/to/exampleform.xml" multiple="true"
    label="Subform Field" description="Subform Field Description" />

Пример XML файла exampleform.xml

<?xml version="1.0" encoding="UTF-8"?>
<form>
    <field name="example_text" type="text" label="Example Text" />
    <field name="example_textarea" type="textarea" label="Example Textarea" cols="40" rows="8" />
</form>

Пример XML файла exampleform.xml с наборами полей

<?xml version="1.0" encoding="UTF-8"?>
<form>
    <fieldset name="section1" label="Section1">
        <field name="example_text" type="text" label="Example Text" />
        <field name="example_textarea" type="textarea" label="Example Textarea" cols="40" rows="8" />
    </fieldset>
    <fieldset name="section2" label="Section2">
        <field name="example_list" type="list" default="1" class="advancedSelect" label="Example List">
            <option value="1">JYES</option>
            <option value="0">JNO</option>
        </field>
    </fieldset>
</form>

XML-код подчиненной формы также может быть указан встроенным в качестве альтернативы размещению XML-файла подчиненной формы в отдельном файле. Следующий пример иллюстрирует это:

<?xml version="1.0" encoding="UTF-8"?>
<field
	name="field-name"
	type="subform"
	label="Subform Field"
	description="Subform Field Description"
	multiple="true"
	min="1"
	max="10"
	>
	<form>
		<field
			name="example_text"
			type="text"
			label="Example Text"
			/>
		<field
			name="example_textarea"
			type="textarea"
			label="Example Textarea"
			cols="40"
			rows="8"
			/>
	</form>
</field>

Атрибуты поля subform

  • type (обязательно) — должен быть subform.
  • name  (обязательно) — уникальное имя поля.
  • label (обязательно) (разрешается переводить) - описательный заголовок поля.
  • description (необязательно) (разрешается переводить) — это текст, который будет отображаться в виде всплывающей подсказки, когда пользователь наводит указатель мыши на раскрывающийся список.
  • required (необязательно) — поле необходимо заполнить перед отправкой формы.
  • message (необязательно) — сообщение об ошибке, которое будет отображаться вместо сообщения по умолчанию.
  • default (необязательно) — это значение по умолчанию, строка JSON.
  • formsource (обязательно) — источник формы, который будет включен. Относительный путь к файлу xml (относительно корневой папки для установленного сайта Joomla), или допустимое имя формы, которое можно найти с помощью JForm::getInstance().
  • multiple (необязательно) — многократный режим независимо от того, являются ли поля подчиненной формы повторяемыми или нет.
  • min (необязательно) — счетчик минимального повторения в многократном режиме. По умолчанию (Дефолт): 0.
  • max (необязательный) — счетчик максимального повторения в многократном режиме. По умолчанию (Дефолт): 1000.
  • groupByFieldset (необязательно) — следует ли группировать поля подчиненной формы по ее набору полей (true или false). По умолчанию (Дефолт): false.
  • buttons (необязательно) — какие кнопки показывать в множественном режиме. По умолчанию: add (добавить), remove (удалить), move (переместить).
  • layout (необязательно) — имя макета для использования при отображении полей подчиненной формы.
  • validate (необязательно) — должно быть установлено в SubForm (обратите внимание, что этот параметр чувствителен к регистру!), чтобы гарантировать, что поля в подчиненной форме проверяются индивидуально. По умолчанию: поля в подчиненной форме не проверяются, даже если указаны правила проверки.

Доступные макеты

  • joomla.form.field.subform.default отображать подчиненную форму в контейнере div без поддержки повторения. По умолчанию для одиночного режима.
  • joomla.form.field.subform.repeatable отображать подчиненную форму в контейнере div, используемом для множественного режима. Поддержка groupByFieldset.
  • joomla.form.field.subform.repeatable-table визуализировать подчиненную форму в виде таблицы, используемой для множественного режима. ПоддерживаетroupByFieldset. По умолчанию каждое поле отображается как столбец таблицы, но если groupByFieldset=true, то каждый набор полей отображается как столбец таблицы.

Имейте ввиду.

Если ваше поле в подчиненной форме имеет дополнительную логику JavaScript, то оно может не работать в множественном режиме, потому что не видны поля, добавленные полем подчиненной формы динамически. Если это произошло, вам нужно настроить свое поле, чтобы поддерживать его. Следующий пример может помочь:

jQuery(document).ready(function(){
    ... here the code for setup your field as usual...

    jQuery(document).on('subform-row-add', function(event, row){
        ... here is the code to set up the fields in the new row ...
    })
});

Из-за этого некоторые дополнительные Joomla! поля пока могут не работать.

Проверка полей и фильтры

Поле формы subform не предоставляет проверки и фильтры для дочерних полей.

Дополнение: После исправления безопасности в Joomla 3.9.7 атрибуты filter="example" в дочерних полях подчиненной формы поддерживаются, и поля будут проверены, но НЕ в настраиваемых полях формы, которые расширяют класс JFormFieldSubform. Вы должны адаптировать такие настраиваемые поля самостоятельно!

Внимание!

Все расширения, которые используют поля subform, ДОЛЖНЫ добавлять фильтр атрибутов к своим дочерним полям подчиненной формы редактора типов, текстовой области, текста (возможно, и других), начиная с Joomla 3.9.7, как это обычно делается для «обычных» полей JForm, если вы хотите разрешить HTML Вход. В противном случае проверка возвращается к STRING, что является обычным поведением для "обычных" полей JForm. Примеры:

filter="safehtml"
filter="JComponentHelper::filterText"
filter="raw" (bad decision in most cases)

Пример

Проблема

После добавления новых строк выборки не являются "выбранными".

Решение

Вот пример повторной инициализации jQuery Chosen для вновь добавленных повторяющихся строк: 

jQuery(document).ready(function(){
    jQuery(document).on('subform-row-add', function(event, row){
        jQuery(row).find('select').chosen();
    })
});

Или фрагмент PHP, который будет использоваться, например. ваш плагин в методе **onBeforeCompileHead** или в представлении вашего компонента.

$doc = JFactory::getDocument();
$js = '
	jQuery(document).on(\'subform-row-add\', function(event, row){
		jQuery(row).find(\'select\').chosen();
	})
';
$doc->addScriptDeclaration($js);

Итак, недавно добавленные строки теперь "выбраны".

Проблема

Данные подчиненной формы не сохраняются в базе данных на пользовательском компоненте.

Решение

Добавьте следующую строку в начало соответствующего класса таблицы:

protected $_jsonEncode = array('fieldnamehere');

Посмотреть все стандартные типы полей формы можно здесь: https://d-nik.site/ru/joomla-4/joomla-dlya-razrabotchikov/standartnye-tipy-polej-formy

Источник: https://docs.joomla.org/Subform_form_field_type

Main Menu