Перейти к содержимому

RadicalMart 3: формы админки


Как добавить, изменить или заменить формы

Формы RadicalMart строятся поверх Joomla Form, но админский интерфейс RadicalMart добавляет свои правила расположения fieldset по вкладкам, колонкам, боковой панели и разделам настроек. Это руководство показывает, где подключаться плагином, как загрузить XML, как поменять поля и как добавить группы в настройках компонента.

Joomla Form здесь не пересказываем

Сами типы полей, фильтры, showon, validate, repeatable subform и другие базовые возможности описаны в документации Joomla. Здесь важна интеграция с RadicalMart: события, имена форм, вкладки, fieldset, группы настроек и практические сценарии изменения формы.

Выберите подход

Без своего кода

RadicalMart Forms
Для простого добавления или удаления XML-полей можно использовать готовый плагин RadicalMart Forms. Он загружает XML из папки forms по имени текущей формы.

Свой плагин

логика и условия
Используйте свой плагин, когда нужно учитывать данные товара или заказа, подключать JS, менять атрибуты существующих полей, добавлять группы настроек или вызывать дополнительные события для других плагинов.

Свой шаблон вкладки

tab_template
Если вкладка должна показывать не обычные поля, а специальный интерфейс view, задайте tab_template и подготовьте подшаблон текущего view.

Куда подключаться

СобытиеКогда использоватьЧто получает обработчик
onRadicalMartPrepareForm
любая форма RadicalMart
Вызывается для форм, имя которых содержит com_radicalmart. или com_radicalmart_. Обработчик получает Form $form и mixed $data. Подходит для универсального подключения XML, изменения полей и удаления лишних блоков.
onRadicalMartPrepareProductForm
форма товара
Специальное событие для com_radicalmart.product. Вызывается для групп radicalmart_payment, radicalmart_shipping, radicalmart_message, radicalmart_media, radicalmart и system. Подходит для интеграций, которые расширяют карточку товара.
onRadicalMartGetOrderForm
заказ и checkout
Используется для форм заказа, где важны товары, доставка, оплата и валюта. Обработчик получает context, Form, formData, products, shipping, payment и currency. Хорошее место для блоков скидок, бонусов, платежных и доставочных данных.
onRadicalMartPrepareConfigForm
настройки компонента
Добавляет XML-поля в форму настроек com_radicalmart.config. Само добавление XML еще не гарантирует красивое место в навигации настроек: для этого обычно добавляют группы через отдельное событие.
onRadicalMartPrepareConfigGroups
группы настроек
Меняет структуру левого меню и секций в настройках RadicalMart. Обработчик получает массив $groups по ссылке и может добавить группу, секцию, вкладки, fieldsets или отдельные fields.
onRadicalMartPrepareFormData
данные до заполнения
Используйте, когда нужно подготовить значения формы перед выводом: нормализовать массив plugins, добавить значения по умолчанию из внешней таблицы или преобразовать структуру данных.

Что можно сделать с формой

Добавить поля

loadFile или load
Подготовьте XML с fieldset и field, затем загрузите его через $form->loadFile(...). Для динамического XML можно собрать SimpleXMLElement и передать его через $form->load(...).

Изменить существующее поле

setFieldAttribute
Меняйте type, label, description, default, readonly, required, layout, showon и другие атрибуты через $form->setFieldAttribute(...). Это удобно, когда поле остается на месте, но его поведение должно зависеть от плагина.

Заменить поле

remove + add
Если нужно заменить тип или структуру поля радикально, удалите старое поле через $form->removeField(...) или группу через $form->removeGroup(...), затем загрузите свой XML.

Перенести блок в другое место

tab и fieldset-атрибуты
Для админских форм задавайте tab, tab_grid, full_width, column_class и class. Эти атрибуты управляют расположением, а не сохранением данных.

Вкладки и fieldset

АтрибутПримерНазначение
tab
general
Помещает fieldset в существующую вкладку или служебную область. Стандартные области: header, top, sidebar, bottom. Стандартные вкладки: settings, general, content, fields, media, prices, after_payment, seo, integrations, plugins, display.
tab_grid
md:12;lg:12;xxl:6
Задает ширину колонок для fieldset внутри кастомной вкладки. Из примера получится col-md-12 col-lg-12 col-xxl-6.
tab_full_width
true
Применяется к контенту вкладки, который выводится через template или layout. Не заменяет full_width у конкретного fieldset.
tab_template
bonuses_report
Заставляет вкладку рендерить подшаблон текущего view. Для layout edit имя обычно соответствует файлу вида edit_bonuses_report.php.
full_width
true
Делает внешний контейнер fieldset шириной col-md-12, даже если сетка вкладки делит блоки на несколько колонок.
column_class
col-md-12 col-xl-8
Полностью задает класс внешней колонки fieldset. Имеет приоритет над сеткой вкладки и над full_width.
class
options-form form-horizontal
Добавляется к самому тегу fieldset. Если class задан, стандартные классы не добавляются автоматически, поэтому укажите их явно, если нужен обычный вид формы.
hidden
true
Скрывает fieldset в интерфейсе. Для служебных значений все равно используйте обычные hidden-поля Joomla.

Группы в настройках компонента

Настройки RadicalMart имеют отдельную навигацию: слева группы, внутри группы секции, внутри секции могут быть fieldsets, fields или tabs. XML-поля добавляются через onRadicalMartPrepareConfigForm, а место в навигации задается через onRadicalMartPrepareConfigGroups.
КлючГде используетсяЧто означает
group
$groups['bonuses']
Верхний пункт навигации настроек. У группы есть title, key, sections и при необходимости available.
section
sections[]
Экран внутри группы. Тип секции задается ключом type: fieldsets, fields или tabs.
tabs
type='tabs'
Секция с внутренними вкладками. Каждая вкладка тоже имеет title, key, type и список fieldsets или fields.
fieldsets
['orders_behavior']
Список fieldset-ов из формы config. Можно передавать строки или массивы с name и available.
fields
permissions.com_radicalmart_bonuses
Список отдельных полей. Если строка содержит точку, RadicalMart разделяет ее по последней точке: часть слева становится group, часть справа - name.
available
access, shop, remove
Условие показа группы, секции, вкладки, fieldset или поля. Поддерживаются значения вроде remove, shop, multilanguage, associations и проверка прав через access.

Если fieldset не указан в группах

Настройки, добавленные в форму config, но не привязанные к группе, RadicalMart собирает в служебную группу “Другие / Расширения”. Это удобно для простых плагинов, но для публичной интеграции лучше явно добавить свою группу или секцию.

Примеры

Минимальный XML для товара

добавить fieldset во вкладку plugins
<form addfieldprefix='Joomla\Component\RadicalMart\Administrator\Field'>
  <fieldset name='my_plugin'
    tab='plugins'
    label='PLG_EXAMPLE_FIELDSET'
    class='options-form form-horizontal'>
    <fields name='plugins'>
      <fields name='example'>
        <field name='enabled' type='radio' label='JSTATUS' />
      </fields>
    </fields>
  </fieldset>
</form>

Загрузка XML в своем плагине

onRadicalMartPrepareForm
public function onRadicalMartPrepareForm(Form $form, mixed $data = []): void
{
  if ($form->getName() !== 'com_radicalmart.product') {
    return;
  }

  $form->loadFile($this->formsPath . '/com_radicalmart.product.xml');
}

Изменить или убрать поле

setFieldAttribute / removeField
public function onRadicalMartPrepareProductForm(Form $form, mixed $data = []): void
{
  $form->setFieldAttribute('code', 'required', 'true');
  $form->setFieldAttribute('code', 'label', 'PLG_EXAMPLE_PRODUCT_CODE');

  $form->removeField('seo_product_robots', 'params');
}

Группа указывается вторым аргументом, если поле лежит внутри <fields name='params'>, plugins или другого контейнера.

Кастомная вкладка с сеткой

tab_grid + tab_ordering
<fieldset name='example_tab'
  label='PLG_EXAMPLE_TAB'
  tab_grid='md:12;lg:12;xxl:6'
  tab_ordering='450' />

<fieldset name='example_main'
  tab='example_tab'
  label='PLG_EXAMPLE_MAIN'>
  <field name='title' type='text' label='JGLOBAL_TITLE' />
</fieldset>

Добавить настройки компонента

ConfigForm + ConfigGroups
public function onRadicalMartPrepareConfigForm(Form $form, mixed $data = []): void
{
  $form->loadFile($this->formsPath . '/com_radicalmart.config.xml');
}

public function onRadicalMartPrepareConfigGroups(array &$groups): void
{
  $groups['example'] = [
    'title' => 'PLG_EXAMPLE_CONFIG',
    'key' => 'example',
    'sections' => [
      'general' => [
        'title' => 'COM_RADICALMART_CONFIG_GENERAL',
        'key' => 'example-general',
        'type' => 'fieldsets',
        'fieldsets' => ['example_settings'],
      ],
    ],
  ];
}

Готовый RadicalMart Forms

для совсем ленивых

Установите RadicalMart Forms и редактируйте XML-файлы в его папке forms. Плагин сам подхватывает файл по имени формы: com_radicalmart.product.xml, com_radicalmart.order.xml, com_radicalmart.config.xml, com_radicalmart.checkout.xml и другие.

Подход хорош для простых XML-добавлений. Если нужны условия, свои группы настроек, сохранение в отдельные таблицы или логика по товарам заказа, лучше делать полноценный плагин.

Практические правила

  • Храните данные плагина в plugins.<plugin_name>, если они логически принадлежат интеграции и должны жить внутри основной сущности RadicalMart.
  • Для настроек компонента не ограничивайтесь загрузкой XML: добавьте группу или секцию через onRadicalMartPrepareConfigGroups, чтобы администратор понимал, где искать настройки.
  • Для заказа используйте onRadicalMartGetOrderForm, потому что там доступны товары, валюта, доставка и оплата. Это безопаснее, чем пытаться угадать состояние заказа в универсальном событии формы.
  • Если задаете class у fieldset, добавляйте стандартные классы вручную, когда нужен обычный внешний вид RadicalMart.
  • Длинные имена форм, полей, классов и путей в документации и подсказках лучше выводить как переносимый текст, чтобы мобильная админка не распиралась по ширине.

ТЗ для генерации плагина ИИ

Если задачу нужно передать ИИ, описывайте ее как спецификацию Joomla-плагина. В ТЗ должны быть имена форм RadicalMart, действия с полями, место вывода, место хранения значений и ожидаемый набор файлов. Такой формат помогает сгенерировать плагин без правки компонента и без доступа к его внутренним файлам.
Что указатьПримерЗачем это нужно
Имя формы
com_radicalmart.product
ИИ должен понимать, к какой форме подключаться и как назвать XML-файл в папке forms. Для заказа и checkout отдельно указывайте com_radicalmart.order, com_radicalmart.order_site или com_radicalmart.checkout.
Действие
add, change, replace, remove
Для каждого поля или fieldset укажите, нужно ли добавить новый элемент, изменить атрибуты существующего, заменить блок своим XML или удалить лишнее через методы Joomla Form.
Хранение данных
plugins.example.enabled
Опишите, где должны жить значения: в корневых полях формы, в params, в plugins.<plugin_key> или в настройках компонента. Если нужна отдельная таблица, это уже задача не только про форму.
Место вывода
tab='plugins', fieldset='example'
Укажите вкладку, fieldset, sidebar или группу настроек. Для настроек компонента отдельно задайте структуру group / section / type / fieldsets или fields.
Поля
name, type, label, default
Для каждого поля перечислите имя, тип, label, description, default, filter, required, showon и варианты option. Синтаксис JForm отдельно объяснять не нужно, но значения должны быть однозначными.
События
PrepareForm, GetOrderForm, ConfigGroups
Попросите ИИ подписаться только на нужные события. Универсальные формы меняются через onRadicalMartPrepareForm, заказ и checkout - через onRadicalMartGetOrderForm, настройки компонента - через onRadicalMartPrepareConfigForm и onRadicalMartPrepareConfigGroups.

Что должен вернуть ИИ

минимальный комплект
Попросите сгенерировать manifest XML, services/provider.php, класс расширения в src/Extension, XML-файлы в forms и языковые файлы. Если есть условия показа или подготовка значений, отдельно запросите обработчик данных.

Что ИИ не должен делать

границы задачи
Не править файлы RadicalMart, не подставлять локальные пути разработчика, не добавлять SQL без необходимости, не использовать tab_template без реального шаблона view и не прятать настройки config без группы, если они должны быть видны администратору.

Когда хватит RadicalMart Forms

самый короткий путь
Если нужно только добавить или убрать XML-поля без условий и отдельной логики, ИИ можно попросить подготовить XML-файлы для RadicalMart Forms. Полноценный плагин нужен для групп настроек, динамических условий, заказа, checkout и собственной обработки данных.

Что дать ИИ для сверки

источники
Добавьте в задачу ссылку на этот гайд по формам админки, документацию по событиям RadicalMart, RadicalMart Forms как пример простого XML-плагина, репозиторий joomla/joomla-cms и страницу Joomla Manual: Standard Form Fields. Это помогает проверить правила форм RadicalMart, названия событий, готовый подход к загрузке XML, структуру Joomla-плагина, стандартные типы полей JForm и стандартные файлы расширения.

Готовый промпт

Создай Joomla 5 плагин группы radicalmart с element exampleforms.
Справка для сверки: формы админки RadicalMart - https://radicalmart.ru/baza-znanij/razrabotchikam/radicalmart-admin-forms; события RadicalMart - https://radicalmart.ru/baza-znanij/razrabotchikam/radicalmart-plugins-events; пример простого XML-плагина - https://github.com/RadicalMart/RadicalMart-Forms; Joomla CMS - https://github.com/joomla/joomla-cms; стандартные поля Joomla Form - https://manual.joomla.org/docs/general-concepts/forms-fields/standard-fields/
Назначение: изменить формы RadicalMart без правки компонента.

Формы:
1. com_radicalmart.product: добавить fieldset example_settings во вкладку plugins. Поля хранить в plugins.example. Поле enabled: type radio, label PLG_EXAMPLE_ENABLED, default 0.
2. com_radicalmart.config: загрузить forms/com_radicalmart.config.xml, добавить fieldset example_config и отдельную группу настроек example через onRadicalMartPrepareConfigGroups.
3. com_radicalmart.order: если нужна форма заказа, подключаться через onRadicalMartGetOrderForm и проверять $form->getName().

Требования:
- Extension implements SubscriberInterface.
- formsPath = JPATH_PLUGINS . '/radicalmart/exampleforms/forms'.
- XML хранить в forms/{formName}.xml.
- При необходимости использовать addfieldprefix='Joomla\Component\RadicalMart\Administrator\Field'.
- Вернуть manifest XML, services/provider.php, src/Extension/ExampleForms.php, forms/*.xml и language/*.ini.
- Не менять файлы RadicalMart и не использовать локальные абсолютные пути.
  • Перед установкой на рабочий сайт проверьте плагин на локальной или отдельной копии сайта: включение, открытие нужных форм, сохранение значений и отсутствие ошибок в админке.
  • Если поле добавляется в настройки компонента, проверьте не только XML, но и место в навигации настроек: группа, секция, вкладка или список fieldset-ов должны ссылаться на добавленный fieldset или field.
  • Если задача зависит от товара, заказа, валюты, доставки или оплаты, попросите ИИ явно описать условие в обработчике события, а не только добавить XML.