Тип 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/joomla-4/joomla-dlia-rozrobnykiv/standartni-tipi-poliv-formi

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

Main Menu