Класс JForm + валидация форм
Этот класс реализует надежные API для построения, заполнения, фильтрации и валидации форм. Он использует XML-файл определения для построения поля формы и разнообразные поля и правила классы визуализации и проверки форм.
Шаблон xml-файла:
<?xml version="1.0" encoding="UTF-8"?>
<form>
<fields name="myGroupOfFields">
<fieldset name="myFieldSet">
<!-- Fields go here -->
</fieldset>
<fieldset name="myOtherFieldSet">
<!-- Fields go here -->
</fieldset>
</fields>
</form>
Подключение:
$form = JForm::getInstance('myform', __DIR__ ."/test.xml"); echo $form->renderFieldset('myFieldSet');
Пример использования в триггере onContentPrepareFrom (например, для изменения стандартной формы без правки xml).
Еще пример использования:
$element = new SimpleXMLElement('Все'); $form = JForm::getInstance('', __DIR__ ."/form.xml"); $form->setField($element); $field = $form->getField($prefix.$field->engtitle); echo @$field->input; echo @$field->label;
XML-файл может быть пустой болванкой при этом:
<?xml version="1.0"?>
<form>
<fields/>
</form>
Пример использования для быстрого рендеринга поля (выбор цвета):
<?php
$form = new JForm('');
$form->load('<form><field name="color" type="color" default="#eee" format="hex" label="Выбор цвета" description="" /></form>');
echo $form->renderField('color');
?>
Пример из плагина (добавление поля перед имеющимся):
// Поиск в форме блоков fieldset с заданным именем $xmlMetaData = $form->getXml()->xpath('//fieldset[@name="jmetadata"]'); // Добавление нового поля $element = new SimpleXMLElement('<fieldset name="jmetadata"><field name="title" type="textarea" label="JFIELD_PAGE_TITLE_LABEL" description="JFIELD_PAGE_TITLE_DESC" rows="2" cols="30" /></fieldset>'); $form->setField($element); // Поиск в форме добавленного поля (по xpath) $xmlElement = $form->getXml()->xpath('//fieldset[@name="jmetadata"]/field[@name="title"]'); // В случае успешных поисков (имеем массивы результатов) конвертируем xml-объекты в dom-оъекты и делаем добавление нового поля перед первым чилдом блока if($xmlElement && $xmlMetaData){ $domMetaData = dom_import_simplexml($xmlMetaData[0]); $domField = dom_import_simplexml($xmlElement[0]); $domMetaData->insertBefore($domField, $domMetaData->firstChild); }
Зависимые поля
Для указания зависимости одного поля от другого используется параметр showon
. При этом на странице с формой необходимо подключить скрипт /media/jui/js/cms.js
(если форма подгружается динамически, то скрипт следует подгрузить после интеграции формы на страницу - поиск зависимых полей там автоматический после загрузки).
В Joomla 5 необходимо подключать другой скрипт (даже два):
- Если стандартные скрипты джумлы (core.js) не подключены, то необходимо вставить заглушку:
<script> if(!window.Joomla) window.Joomla = new Object(); </script>
- Далее подключить скрипт <script src="/media/system/js/showon.min.js" type="module"></script>
- При необходимости можно добавить обработчики событий joomla:showon-show и joomla:showon-show.
- Если правило прописывается не через xml, а непосредственно в html-коде формы, то добавить атрибут data-showon в тег можно так:
.use Joomla\CMS\Form\FormHelper; ... echo htmlspecialchars(json_encode(FormHelper::parseShowOnConditions('departs:1')));
Валидация форм
JHtml::_('behavior.formvalidator');
Добавление полей в форму редактирования объектов в админке
Легко реализовать с помощью плагина с типом Content
в обработчике события onContentPrepareForm
public function onContentPrepareForm( $form, $data ){ if (!($form instanceof JForm)) return false; $formName = $form->getName(); if(file_exists($formFile = __DIR__.'/forms/'.$formName.'.xml')) $form->loadFile($formFile, false); return true; }
Для красивой стилизации селектов (поля с типом list
) можно использовать класс поля chzn-color-state
, а для стилизации радио-групп (поля с типом radio
) - классы btn-group btn-group-yesno radio
Если есть необходимость вывода полей в стандартные области (например, на первую закладку), то необходимо, во-первых, посмотреть в админке view-шаблон редактирования для объекта интересующего компонента - там можно увидеть вызовы метода JLayoutHelper::render( 'joomla.edit.global', $this );
. Во-вторых, найти тот Layout
, который там рендерится и посмотреть какие поля (с какими именами) он выводит, например: /layouts/joomla/edit/global.php
и использовать незанятые имена полей. Это не единственный, но более легкий путь.
Поле Media
Значение поля Media (выбор файла через медиа-менеджер) имеет вот такой вид: [imagefile] => images/product/brus.png#joomlaImage://local-images/product/brus.png?width=274&height=225
Для получения обычной ссылки на файл можно применить вот это:
use Joomla\CMS\Helper\MediaHelper; ... $src = MediaHelper::getCleanMediaFieldValue($imagefile);