---
title: "Как добавить свой повторяемый элемент интерфейса в класс HTMLHelper Joomla 4+ - WebTolk"
description: "Статья о классе HTMLHelper в API Joomla 5. Он выводит HTML-элементы интерфейса с нужными параметрами: модальные окна, аккордеоны, табы, изображения и т.д. Как создать свой собственный элемент интерфейса с его помощью расскажет эта статья. Joomla, разработка, php."
url: "https://web-tolk.ru/blog/kak-dobavit-svoj-povtoryaemyj-element-interfejsa-v-klass-htmlhelper-joomla-4"
date: "2024-11-20T05:21:05+00:00"
language: "ru-RU"
---

# Как добавить свой повторяемый элемент интерфейса в класс HTMLHelper Joomla 4+

 Автор: Сергей Толкачев Создано: 20 ноября 2024 Обновлено: 01 сентября 2025 Просмотров: 945    ![](https://web-tolk.ru/blog/images/blog/kak-dobavit-svoj-povtoryaemyj-element-interfejsa-v-klass-htmlhelper-joomla-4/header.webp)

В API Joomla есть полезный инструмент - класс **HTMLHelper**. Он выводит HTML-элементы интерфейса с нужными параметрами: модальные окна, аккордеоны, табы, изображения и т.д. Для рендера мы передаём все нужные данные: заголовки окон, содержимое табов, атрибуты изображений. Плюс использования **HTMLHelper в Joomla** - это его универсальность, оторванность от контекста, а это значит, что его можно использовать везде. А также возможность использования логики при рендере в зависимости от вводных данных. Опубликовал эту статью на Хабре. Копирую к себе.

**Ранее писал о том как:**

- использовать HTMLHelper для рендера ссылок, изображений ([источник](https://t.me/webtolkru/239))
- использовать HTMLHelper::image() для рендера изображений - подробнее ([источник](https://t.me/webtolkru/252))
- [Совет о Joomla: использование FileLayout для рендера элементов макета](https://web-tolk.ru/blog/index.php?option=com_content&view=article&id=105:sovet-o-joomla-ispolzovanie-filelayout-dlya-rendera-elementov-maketa&catid=10:blog&lang=ru-RU&Itemid=114).
- [Layouts и subLayouts в Joomla](https://web-tolk.ru/blog/index.php?option=com_content&view=article&id=100:layouts-i-sublayouts-v-joomla&catid=10:blog&lang=ru-RU&Itemid=114)

Но это был обзор возможностей стандартных классов **HTMLHelper**. А что если нам нужно создать свой?

## Создание собственного класса HTMLHelper в Joomla 4 / Joomla 5

Прежде всего посмотрим на то, как оно работает в **Joomla** 4+. Типичный вывод с помощью **HTMLHelper** выглядит так:

```
<?php
use Joomla\CMS\HTML\HTMLHelper;

$img_src = 'images/banner.webp';
$img_attribs = [
    'loading' => 'lazy',
    'class'=>'img-fluid',
    'data-custom-attr'=>'your-custom-data-attr-value',
    'title'=> 'Title attribute for image'
];
echo HTMLHelper::_('image', $img_src, 'Alt text for image', $img_attribs, true, 1);

// или вот так

$identifier = 'elementId';
$params = ['array'=> 'of params'];
echo HTMLHelper::_('bootstrap.renderModal', $identifier, $params);
```

Нас интересует 2-й вариант - метод `HTMLHelper::_()`. Ссылки на метод: `\Joomla\CMS\HTML\HTMLHelper::_ ()`, файл **libraries/src/HTML/HTMLHelper.php**. Это метод-загрузчик классов.

### Аргументы метода HTMLHelper::_()

`$key` - имя ресурса в реестре классов для `HTMLHelper`, которое выглядит следующим образом: **(prefix).(class).function**. **Prefix** - это неймспейс класса, если нужен. **Class** - собственно имя файла и класса по PSR-4. **Prefix** и **Class** являются опциональными. Главное, чтобы имя ресурса было уникальным. **Function** - имя метода в классе. Так, пример с `HTMLHelper::_('bootstrap.renderModal')` будет искать в реестре ресурс с именем `bootstrap` и найдет его.

 ![Класс HTMLHelper Bootstrap Joomla 5 скриншот в PHPStorm](https://web-tolk.ru/blog/images/blog/kak-dobavit-svoj-povtoryaemyj-element-interfejsa-v-klass-htmlhelper-joomla-4/1.webp) Класс HTMLHelper Bootstrap Joomla 5 скриншот в PHPStorm

И в классе `\Joomla\CMS\HTML\Helpers\Bootstrap` будет вызывать метод `renderModal`, куда и будут переданы дальнейшие аргументы метода `HTMLHelper::_()`.

### Создаём свой класс

Таким образом наша задача сводится к тому, чтобы написать класс с методами для рендера HTML нужных элементов интерфейса и с помощью системного плагина подключить его в реестр ресурсов HTMLHelper. В методах нашего класса HTMLHelper мы будем использовать стандартный механизм Joomla Layouts.

**Почитать:** [Создание плагинов с учётом новой структуры Joomla 4](https://web-tolk.ru/blog/index.php?option=com_content&view=article&id=80:sozdanie-plaginov-s-uchjotom-novoj-struktury-joomla-4&catid=10:blog&lang=ru-RU&Itemid=114). Также в [хабе Joomla на Хабре](https://habr.com/ru/hubs/joomla/articles/) есть ещё ряд статей, рассказывающих о создании различных типов плагинов.

#### Системный плагин

Если мы работаем с Joomla 4+, то нам подойдёт событие `onAfterRoute()`. В Joomla 5 появилось событие `onAfterInitialiseDocument`, которое было создано специально для подобных случаев. Используем метод `HTMLHelper::getServiceRegistry()` для добавления своего класса в реестр классов Joomla `HTMLHelper`.

```
<?php
namespace Joomla\Plugin\System\Myplugin\Extension;

defined('_JEXEC') or die;

use Joomla\CMS\Plugin\CMSPlugin;
use Joomla\Event\SubscriberInterface;

class Myplugin extends CMSPlugin implements SubscriberInterface
{

	public static function getSubscribedEvents(): array
	{
		return [
			'onAfterRoute' => 'onAfterRoute',
		];
	}

	/**
	 * @return void
	 *
	 * @since 1.0.0
	 *
	 */
	public function onAfterRoute(): void
	{
		HTMLHelper::getServiceRegistry()
			->register(
				'webtolk',
				\Joomla\Plugin\System\Myplugin\HTML\Webtolk::class
			);
	}
}
```

#### Пользовательский класс HTMLHelper в плагине

В нашем плагине в папке **src** создадим папку **HTML**, в которой будет лежать класс, например, `Webtolk`.

 ![Файловая структура плагина Joomla 5 для регистрации собственного класса HTMLHelper](https://web-tolk.ru/blog/images/blog/kak-dobavit-svoj-povtoryaemyj-element-interfejsa-v-klass-htmlhelper-joomla-4/2.webp)Файловая структура плагина Joomla 5 для регистрации собственного класса HTMLHelper

Код пользовательского класса `HTMLHelper` будет выглядеть следующим образом:

```
<?php
namespace Joomla\Plugin\System\Myplugin\HTML;

use Joomla\CMS\Layout\LayoutHelper;

defined('_JEXEC') or die;

/**
 * @since  1.0.0
 */
abstract class Webtolk
{
	/**
	 * @param  int  $key  Any digit
	 *
	 * @return string
	 *
	 * @since 1.0.0
	 */
	public static function indicator(int $key): string
	{
		$html = '';
		if (!empty($key))
		{
			$html = LayoutHelper::render(
				'indicator.green',
				['key' => $key],
				JPATH_SITE . '/plugins/system/myplugin/layouts'
			);
		}

		return $html;
	}
}
```

Таких методов в классе может быть несколько и каждый из них будет оперировать своими входными данными и возвращать свои макеты.

**Отличительная особенность классов HTMLHelper состоит в том, что в них можно реализовывать логику**, которая напрямую влияет на отображение. Это могут быть дочерние элементы, значения по умолчанию, подключение необходимых Web Assets и так далее. Таким образом логика остаётся в классах, а вёрстка остаётся в макетах (layouts).

#### Файл макета вывода пользовательского класса HTMLHelper

Осталось создать макет вывода, где собственно будет находиться вёрстка. Мы реализуем его с помощью стандартного для Joomla механизма Layouts ([Layouts и subLayouts в Joomla](https://web-tolk.ru/blog/index.php?option=com_content&view=article&id=100:layouts-i-sublayouts-v-joomla&catid=10:blog&lang=ru-RU&Itemid=114)). В Joomla есть понятие **layout**. Это кусочек вёрстки, который можно многажды использовать в любом месте сайта: как в панели администратора, так и во фронтенде. Можно рассматривать лейауты как оторванные от контекста элементы дизайна. Находятся они в папке **layouts** в корне сайта. Как их использовать? Один из вариантов - использование `LayoutHelper`.

```
<?php
use Joomla\CMS\Layout\LayoutHelper;

// $item - ваш объект или массив с данными, которые нужно использовать  в верстке

echo LayoutHelper::render('components.swjprojects.project.icons', ['item' => $item]);
```

1-й аргумент - это dot-separated (разделенный точками) путь к файлу лейаута. Название папки "**layouts**" в данном случае пропускается как само собой разумеющееся. Внутрь файла приходит массив `$displayData`, в котором будут лежать наши данные - `$key`- `$displayData['key']`. Но в нашем плагине мы сказали `LayoutHelper` искать макет не только по стандартным путям (в папке **layouts** от корня), но и в папке плагина:

```
<?php
use Joomla\CMS\Layout\LayoutHelper;

$html = LayoutHelper::render(
				'indicator.green', // Путь к файлу [$basePath]/indicator/green.php
				['key' => $key], // массив данных $displayData
				JPATH_SITE . '/plugins/system/myplugin/layouts' //[$basePath] для поиска макетов
			);
```

3-й аргумент `LayoutHelper::render()` - `$basePath` - это путь, относительно которого будет применяться dot-separated путь, последняя часть которого - имя файла без расширения.

Само содержимое файла **/plugins/system/myplugin/layouts/indicator/green.php** примитивно:

```
<?php
/** @var array $displayData  Массив с данными для рендера */
extract($displayData);
/** @var int $key  Переменная $key, которую передавали в echo HTMLHelper::_('webtolk.indicator',1111); */
dump($key);
```

## Результат

Теперь абсолютно везде в Joomla мы можем использовать простой рендер нужного элемента интерфейса одной строчкой:

```
<?php
use Joomla\CMS\HTML\HTMLHelper;
defined('_JEXEC') or die;

$key = 1111;
echo HTMLHelper::_('webtolk.indicator', $key);
```

## Заключение

В заключение хочу сказать спасибо Joomla-разработчику [Виталию Некрасову](https://habr.com/users/vitaliynekrasov), у которого я частично подглядел этот подход и это способствовало появлению данной статьи.

- [Эта статья на Хабре](https://habr.com/ru/articles/859612/)

## Об авторе

![Толкачев Сергей Юрьевич](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": "Как добавить свой повторяемый элемент интерфейса в класс HTMLHelper Joomla 4+"
            }
        }
    ]
}
```

```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-povtoryaemyj-element-interfejsa-v-klass-htmlhelper-joomla-4",
            "name": "Как добавить свой повторяемый элемент интерфейса в класс HTMLHelper Joomla 4+ - WebTolk",
            "description": "Статья о классе HTMLHelper в API Joomla 5. Он выводит HTML-элементы интерфейса с нужными параметрами: модальные окна, аккордеоны, табы, изображения и т.д. Как создать свой собственный элемент интерфейса с его помощью расскажет эта статья. Joomla, разработка, php.",
            "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/114",
            "isPartOf": {
                "@id": "https://web-tolk.ru/#/schema/WebPage/base"
            }
        }
    ]
}
```
