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>
<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');
}
{
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');
}
{
$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>
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'],
],
],
];
}
{
$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 и не использовать локальные абсолютные пути.
Справка для сверки: формы админки 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.