Класс 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);
