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

Ссылки: