---
title: "Как добавить свой таб или поле в интерфейс Joomla с помощью плагина. «Joomla way». - WebTolk"
description: "Статья о Joomla-разработке: рецепт добавления своих полей в формы Joomla стандартным для Joomla путём с помощью плагина."
url: "https://web-tolk.ru/blog/kak-dobavit-svoj-tab-ili-pole-v-interfejs-joomla-s-pomoshchyu-plagina-joomla-way"
date: "2024-10-25T06:45:43+00:00"
language: "ru-RU"
---

# Как добавить свой таб или поле в интерфейс Joomla с помощью плагина. «Joomla way».

 Автор: Сергей Толкачев Создано: 25 октября 2024 Обновлено: 01 сентября 2025 Просмотров: 1900    ![](https://web-tolk.ru/blog/images/blog/kak-dobavit-svoj-tab-ili-pole-v-interfejs-joomla-s-pomoshchyu-plagina-joomla-way/header.webp)

Задачи могут быть самые разные: поле аватара для пользователя в com_users, дополнительный таб в форму редактирования материала, поле связи одной сущности с другой и т.д. Сразу оговорюсь, что бывает и "non-Joomla way" - то есть подходы, которые не предполагаются ядром CMS, но при этом и явно не запрещаются. Сейчас речь пойдёт о традиционном.

Наиболее употребимый вариант добавления своего поля или даже формы сводится к 2 простым вещам:

1. Создать XML файл с нужной формой
2. На событии `onContentPrepareForm` плагином добавить свою форму в форму расширения.

Приведу пример из одного давнего проекта - добавление поля с id продаваемых курсов в Moodle в карточку товара компонента интернет-магазина RadicalMart Express.

 ![Структура плагина Joomla 5](https://web-tolk.ru/blog/images/blog/kak-dobavit-svoj-tab-ili-pole-v-interfejs-joomla-s-pomoshchyu-plagina-joomla-way/1.webp)Структура плагина в Joomla 5.

## XML файл с формой

Кто сильно заинтересуется - можно почитать [официальную документацию Joomla How Forms Work](https://manual.joomla.org/docs/general-concepts/forms/how-forms-work). В XML мы описываем филдсеты и поля, а также с помощью структуры создаем имена для полей.

```
<?xml version="1.0" encoding="utf-8"?>
<form>
    <fieldset name="wtradicalmartexpresstomoodle"
              label="PLG_WTRADICALMARTEXPRESSTOMOODLE_FIELDSET_LABEL"
              description="PLG_WTRADICALMARTEXPRESSTOMOODLE_FIELDSET_DESC">
        <fields name="plugins">
            <field addfieldprefix="Webtolk\JMoodle\Fields"
                   type="moodleinfo"
                   name="moodleinfo"/>
            <field addfieldprefix="Webtolk\JMoodle\Fields"
                   type="courseslist"
                   name="course_ids"
                   multiple="true"
                   layout="joomla.form.field.list-fancy-select"
                   filter="intarray"
                   label="PLG_WTRADICALMARTEXPRESSTOMOODLE_COURSE_ID"
                   description="PLG_WTRADICALMARTEXPRESSTOMOODLE_COURSE_ID_DESC"/>
        </fields>
    </fieldset>
</form>
```

Тег `<fieldset>` - это отображаемый таб формы. У него есть системное имя `name`, `label` - название таба для людей. `Description` - дополнительная информация в начале таба.

 ![Скриншот интернет-магазина RadicalMart Express](https://web-tolk.ru/blog/images/blog/kak-dobavit-svoj-tab-ili-pole-v-interfejs-joomla-s-pomoshchyu-plagina-joomla-way/2.webp)Скриншот интернет-магазина RadicalMart Express

### Вложенность в именах полей формы Joomla Form

В форме карточки товара RadicalMart Express для различной кастомной информации зарезервировано имя `plugins`, куда, собственно говоря, плагины и могут помещать всякую нужную им информацию. Поэтому мы создаем секцию `<fields name="plugins">`. а в ней уже помещаем описание нашего `select`, который по REST API получает список доступных курсов из стоящего рядом Moodle. В HTML-коде имя поля будет `jform[plugins][course_ids][]`. Если мы уберём секцию `<fields>`, то имя поля было бы `jform[course_ids][]`. Если нам нужно добавить уровень вложенности с именем `level2`, то в XML файле формы мы добавляем ещё один `<fields name="level2">`:

```
<?xml version="1.0" encoding="utf-8"?>
<form>
    <fieldset name="wtradicalmartexpresstomoodle"
              label="PLG_WTRADICALMARTEXPRESSTOMOODLE_FIELDSET_LABEL"
              description="PLG_WTRADICALMARTEXPRESSTOMOODLE_FIELDSET_DESC">
        <fields name="plugins">
            <fields name="level2">
                <field addfieldprefix="Webtolk\JMoodle\Fields"
                       type="courseslist"
                       name="course_ids"
                       multiple="true"
                       layout="joomla.form.field.list-fancy-select"
                       filter="intarray"
                       label="PLG_WTRADICALMARTEXPRESSTOMOODLE_COURSE_ID"
                       description="PLG_WTRADICALMARTEXPRESSTOMOODLE_COURSE_ID_DESC"/>
            </fields>
        </fields>
    </fieldset>
</form>
```

Дальше `<field>` описывает поле, которое может быть как стандартным, так и пользовательским: из 3d-party компонента, библиотеки или ваше собственно из вашего же плагина. Достаточно указать namespace этого поля. А имя поля = **имени класса + "Field"**. В нашем примере это `CourseslistField`.

**Стандартные поля Joomla Form**: [официальная документация старая](https://docs.joomla.org/Standard_form_field_types), [официальная документация новая](https://manual.joomla.org/docs/general-concepts/forms-fields/standard-fields/).

## Добавление поля Joomla Form плагином

В примере кода ниже представлен не весь плагин Joomla целиком, но только один важный для нас метод - `onContentPrepareForm`. Через это событие проходят все формы Joomla, поэтому нам важно проверять имя формы и добавлять свои поля только в нужную. Имя формы Joomla обычно строится по принципу `com_component.entity`.

```
<?php
use Joomla\CMS\Form\Form;
use Joomla\Event\Event;

public function onContentPrepareForm(Event $event): void
{
	$form     = $event->getArgument(0);
	$formName = $form->getName();
	// Проверяем имя формы, чтобы не добавить таб в материалы или ещё куда-нибудь
	if ($formName === 'com_radicalmart_express.product')
	{
		Form::addFormPath(JPATH_SITE . '/plugins/system/wtradicalmartexpresstomoodle/src/Xmlform');
		// fields - это имя файла в указанной папке - fields.xml
		$form->loadFile('fields', false);
		// грузим языковые константы для формы
		$lang      = $this->getApplication()->getLanguage();
		$extension = 'plg_system_wtradicalmartexpresstomoodle';
		$base_dir  = JPATH_ADMINISTRATOR;
		$reload    = true;
		$lang->load($extension, $base_dir, $lang->getTag(), $reload);
	}
}
```

## Обработка данных формы

Если компонент предусматривает поля в базе для сторонних данных, то возможно вам ничего и не придется дописывать, а всю работу сделает за вас модель компонента. Если же ваши данные хранятся не в стандартной таблице базы данных компонента, а в своей, то в плагине нужно использовать событие `onContentPrepareData`, то есть ДО `onContentPrepareForm`. В нём вы делаете запрос в свою таблицу и оперируете данными. Это событие вызывается ДО подготовки формы. То есть Joomla сначала собирает все данные, потом собирает форму, затем биндит данные в форму. Для сохранения данных в свою таблицу можно использовать события `onContentBeforeSave` или `onContentAfterSave`. Также у компонентов могут быть свои собственные события для плагинов, вызываемые в процессе работы компонента.

**Ну и всё...** Теперь чтобы добавить ещё одно поле в карточку товара нам достаточно описать поле в XML-форме.

В [хабе Joomla на Хабре](https://habr.com/ru/hubs/joomla/articles/) публиковал немало уже статей о разных видах плагинов. В них можно подчерпнуть информацию о структуре плагинов, логике и практике использования. Все эти статьи также доступны в блоге на этом сайте.

- [Первоначальная публикация на Хабре](https://habr.com/ru/articles/853196/)
- [Эта же статья на VC](https://vc.ru/dev/1611690-kak-dobavit-svoi-tab-ili-pole-v-interfeis-joomla-s-pomoshyu-plagina-joomla-way)

## Об авторе

![Толкачев Сергей Юрьевич](https://web-tolk.ru/images/uslugi/sergey-tolkachyov-apr-2023.webp)

### Толкачев Сергей Юрьевич

Joomla-разработчик. [Контрибьютер ядра Joomla](https://github.com/joomla/joomla-cms/pulls?q=is%3Apr+author%3Asergeytolkachyov+). Один из ведущих Telegram-канала русскоязычного Joomla-сообщества [JoomlaFeed](https://t.me/joomlafeed), один из модераторов [чата русскоязычного Joomla-сообщества](https://t.me/joomlaru). Мои расширения в официальном маркетплейсе расширений Joomla - [Joomla Extensions Directory](https://extensions.joomla.org/profile/profile/details/528051/). Имею публикации в [официальном журнале международного Joomla-сообщества - Joomla Community Magazine](https://magazine.joomla.org/authors/sergeytolkachyov) и на [официальном сайте русскоязычного Joomla-сообщества](https://joomlaportal.ru/users/sergey-tolkachyov).

Муж. Отец 3 детей.

Россия, Саратов.

## JSON-LD Schema

```json
{
    "@context": "https://schema.org",
    "@type": "BreadcrumbList",
    "@id": "https://web-tolk.ru/#/schema/BreadcrumbList/17",
    "itemListElement": [
        {
            "@type": "ListItem",
            "position": 1,
            "item": {
                "@id": "https://web-tolk.ru/",
                "name": "Главная"
            }
        },
        {
            "@type": "ListItem",
            "position": 2,
            "item": {
                "@id": "https://web-tolk.ru/blog",
                "name": "Блог"
            }
        },
        {
            "@type": "ListItem",
            "position": 3,
            "item": {
                "name": "Как добавить свой таб или поле в интерфейс Joomla с помощью плагина. «Joomla way»."
            }
        }
    ]
}
```

```json
{
    "@context": "https://schema.org",
    "@graph": [
        {
            "@type": "Organization",
            "@id": "https://web-tolk.ru/#/schema/Organization/base",
            "name": "WebTolk",
            "url": "https://web-tolk.ru/",
            "logo": {
                "@type": "ImageObject",
                "@id": "https://web-tolk.ru/#/schema/ImageObject/logo",
                "url": "images/webtolk-1080p.jpg",
                "contentUrl": "images/webtolk-1080p.jpg",
                "width": 1920,
                "height": 1080
            },
            "image": {
                "@id": "https://web-tolk.ru/#/schema/ImageObject/logo"
            },
            "sameAs": [
                "https://github.com/WebTolk",
                "https://github.com/sergeytolkachyov",
                "https://vk.com/web_tolk",
                "https://vk.com/webtolkru",
                "https://tenchat.ru/sergeytolkachyov",
                "https://t.me/sergeytolkachyov",
                "https://t.me/webtolkru"
            ]
        },
        {
            "@type": "WebSite",
            "@id": "https://web-tolk.ru/#/schema/WebSite/base",
            "url": "https://web-tolk.ru/",
            "name": "WebTolk",
            "publisher": {
                "@id": "https://web-tolk.ru/#/schema/Organization/base"
            }
        },
        {
            "@type": "WebPage",
            "@id": "https://web-tolk.ru/#/schema/WebPage/base",
            "url": "https://web-tolk.ru/blog/kak-dobavit-svoj-tab-ili-pole-v-interfejs-joomla-s-pomoshchyu-plagina-joomla-way",
            "name": "Как добавить свой таб или поле в интерфейс Joomla с помощью плагина. «Joomla way». - WebTolk",
            "description": "Статья о Joomla-разработке: рецепт добавления своих полей в формы Joomla стандартным для Joomla путём с помощью плагина. ",
            "isPartOf": {
                "@id": "https://web-tolk.ru/#/schema/WebSite/base"
            },
            "about": {
                "@id": "https://web-tolk.ru/#/schema/Organization/base"
            },
            "inLanguage": "ru-RU",
            "breadcrumb": {
                "@id": "https://web-tolk.ru/#/schema/BreadcrumbList/17"
            }
        },
        {
            "@type": "Article",
            "@id": "https://web-tolk.ru/#/schema/com_content/article/112",
            "isPartOf": {
                "@id": "https://web-tolk.ru/#/schema/WebPage/base"
            }
        }
    ]
}
```
