Subform - Подчиненная форма
Тип поля Subform дает возможность использовать XML-формы внутри друг друга или использовать существующие формы внутри вашей текущей формы. Поле позволяет включить любую существующую форму в текущую форму. Если атрибут multiple - true тогда включеная форма будет повторяемой.
Поле имеет несколько "предопределенных" макетов для отображения подчиненной формы в виде таблицы или в виде div контейнера, и, конечно можно использовать свой собственный макет.
Поле поддерживает значения по умолчанию из включенной формы и из json строки в атребуте default. Последнее имеет более высокий приоритет.
Пример определения 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>
Атрибуты поля:
- type (обязательно) должно быть subform.
- name (обязательно) уникальное имя поля.
- label (обязательно) (переводимое) описательное название поля.
- description (необязательно) (переводимое) это текст, который будет показан в подсказке, когда пользователь перемещает курсор на раскрывающемся списке.
- required (необязательно) Поле должно быть заполнено перед отправкой формы.
- message (необязательно) Сообщение об ошибке, которое будет отображаться вместо сообщения по умолчанию.
- default (необязательно) значение по умолчанию, строка в формате JSON.
- formsource (обязательно) источник формы для включения.Путь к XML-файлу или имя формы для поиска с помощью JForm::getInstance().
- multiple (необязательно) многократное состояние для поля формы. Будет ли подформа повторяемой или нет.
- min (необязательно) минимальное количество повторений в multiple режиме. По умолчанию: 0.
- max (необязательно) максимальное количество повторений в multiple режиме. По умолчанию: 1000.
- groupByFieldset (необязательно) будет ли группа полей подформы организованна как fieldset (true или false). По умолчанию: false.
- buttons (необязательно) какие кнопки показывать в режиме multiple. По умолчанию: add,remove,move.
- layout (необязательно) имя макета для рендеринга полей inputs подформы.
- validate (необязательно) должно быть установлено значение SubForm (обратите внимание, что это чувствительно к регистру!), чтобы поля в подчиненной форме были индивидуально проверены. По умолчанию: поля в подчиненной форме не проверяются, даже если указаны правила проверки.
Доступные макеты:
- joomla.form.field.subform.default рендерит подформу в div контейнер, без поддержки повторений. По умолчанию для одиночного режима
- joomla.form.field.subform.repeatable рендерит подформу в div контейнер, используется для режима multiple. Поддержка groupByFieldset.
- joomla.form.field.subform.repeatable-table рендерит подформу в виде таблицы, можно использовать для multiple режима. Поддержка groupByFieldset. По умолчанию рендеринг каждого поля в качестве столбца таблицы, но если groupByFieldset=true то рендеринга каждый fieldset как столбец таблицы.
Если поле в подчиненной формы имеет дополнительную JavaScript логику, то она не может работать в multiple режиме, потому что не видит поля, добавленные полем подчиненной формы динамически. Если это произошло, то вам нужно настроить поле, чтобы поддержать его.
Следующий пример может помочь:
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! могут не работать на данный момент.
Валидация полей и фильтры.
Поле формы субформы не обеспечивает валидацию и фильтры для дочерних полей.
Добавление: С момента исправления безопасности в Joomla 3.9.7 filter="example"
атрибуты в дочерних полях субформы поддерживаются, и поля будут проверены; но НЕ в полях пользовательской формы, которые расширяют класс JFormFieldSubform
. Вы должны сами адаптировать такие пользовательские поля!
Осторожно!
Все расширения, использующие поля подчиненной формы, ДОЛЖНЫ добавить атрибут filter
к своим дочерним полям подчиненной формы типов editor
, textarea
, text
(возможно, и других), начиная с Joomla 3.9.7, как это обычно бывает для «нормальных» полей JForm, если вы хотите разрешить ввод HTML. В противном случае проверка возвращается к STRING, что является общим поведением для «нормальных» полей JForm.
Examples:
filter="safehtml" filter="JComponentHelper::filterText" filter="raw" (bad decision in most cases)
Примеры.
Проблема.
После добавления новых строк выбранные строки не являются «выбранными».
Решение.
Вот пример того, как повторно инициализировать jQuery Selected в недавно добавленных повторяющихся строках:
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');
Более подробная информация здесь.