---
title: "Совет по Joomla: рендер пользовательского поля внутри другого пользовательского поля - WebTolk"
description: "Как создать нестандартный HTML макет в шаблоне Joomla с помощью пользовательских полей и собственных макетов вывода? Примеры HTML и PHP кода. Веб-разработка."
url: "https://web-tolk.ru/blog/sovet-po-joomla-render-polzovatelskogo-polya-vnutri-drugogo-polzovatelskogo-polya"
date: "2025-03-25T09:28:12+00:00"
language: "ru-RU"
---

# Совет по Joomla: рендер пользовательского поля внутри другого пользовательского поля

 Автор: Сергей Толкачев Создано: 25 марта 2025 Обновлено: 01 сентября 2025 Просмотров: 907

Иногда дизайнеры рисуют непростые макеты. Внешне в них выглядит всё просто и красиво. Но ты смотришь на них и думаешь: "А с помощью чего я буду реализовывать это?".

Эта каруселька - плагином [WT Content Image gallery](https://web-tolk.ru/dev/joomla-plugins/wt-content-image-gallery). Эта карусель фото и видео в виде формата сторис - тоже им же. Вставляем просто шорткодами в материал.

Но между ними оказывается большой объём текста с описанием проекта, внутри которого ещё и блок с повторяемыми элементами - ассортимент проекта. Скрыт этот большой текст под спойлер с большой же синей кнопкой. Всё должно раскрываться / открываться, А заполнять всё это нужно далеко не программистам...

Размещать адаптивную вёрстку в материал - можно, но в данном случае не нужно. Кто-нибудь обязательно накосячит при копировании или правке шаблона текста. Поэтому решаем задачу с **помощью пользовательских полей Joomla**.

Вставить поля в материал Joomla можно с помощью кнопки редактора "Поле".

 ![joomla insert field editor button](https://web-tolk.ru/blog/images/blog/sovet-po-joomla-render-polzovatelskogo-polya-vnutri-drugogo-polzovatelskogo-polya/joomla-insert-field-editor-button.webp)Кнопка редактора Joomla для вставки шорт-кода поля

И в открывшемся модальном окне можно выбрать или конкретное поле или сразу группу полей.

![joomla insert field editor modal window](https://web-tolk.ru/blog/images/blog/sovet-po-joomla-render-polzovatelskogo-polya-vnutri-drugogo-polzovatelskogo-polya/joomla-insert-field-editor-modal-window.webp)

Для содержимого спойлера мы создаем пользовательское поле типа редактор. В тело материала вставляем шорт код (с помощью кнопки редактора "поля") виде . Создаём собственный **макет вывода для поля Joomla** (писал об этом в [Telegram-канале](https://t.me/webtolkru/511) и в статье [Как происходит рендер пользовательских полей в Joomla?](https://web-tolk.ru/blog/index.php?option=com_content&view=article&id=56&catid=10&lang=ru-RU)). В нём оборачиваем содержимое в собственно спойлер. В моём случае это Bootstrap collapse.

 ![](https://web-tolk.ru/blog/images/blog/sovet-po-joomla-render-polzovatelskogo-polya-vnutri-drugogo-polzovatelskogo-polya/joomla-article-layout-with-field-shortcode.webp)Cтатья Joomla с шорткодами плагинов WT Content image gallery и стандартного плагина вставки полей.

Теперь любой текст, который мы наберём в поле редактора будет скрыт по умолчанию и будет раскрываться по нажатию на большую синюю кнопку. Содержимое поля пропускаем через `HTMLHelper::_('content.prepare', $field->value);`, чтобы работали шорт-коды, если вдруг потребуются. Стало так:

```
<?php
// мы в файле своего макета поля
// /templates/[ВАШ_ШАБЛОН]/html/layouts/com_fields/field/etapy-raboty-nad-proektom.php

use Joomla\CMS\HTML\HTMLHelper;
// типичный код макета поля пропускаем
// тут куча вёрстки
// и самое важное - вывод содержимого поля.

// $value - это текст из поля редактора
echo HTMLHelper::_('content.prepare', $value);
```

## Отображение пользовательского поля Joomla внутри другого пользовательского поля

Теперь принимаемся за адаптивную сетку с повторяемыми элементами - ассортимент проекта. Создаём 2 поля: типа **text** - для заголовка элемента, и **textarea** - для описания. Обоим полям ставим галочку "только в дочерней форме". Создаём 3-е поле - дочернюю форму, в настройках которой выбираем созданные заголовок и описание. Форма повторяемая, отключаем автоматическое отображение. Создаём свой макет вывода для поля и выбираем его в настройках.

![joomla 5 поле дочерняя форма с выбором полей](https://web-tolk.ru/blog/images/blog/sovet-po-joomla-render-polzovatelskogo-polya-vnutri-drugogo-polzovatelskogo-polya/joomla-5-subform-field-params.webp)

Казалось бы - всё. Но нам нужно этот макет выводить ВНУТРИ предыдущего поля. Простая вставка шорт-кода типа  в содержимое поля не заработала. Поэтому я решил напрямую вызвать метод `onContentPrepare` плагина **Поля** группы контент, убрав при этом обработку `HTMLHelper`. Чтобы плагин заработал - нужно передать ему объект со свойством `text`, в котором находится содержимое поля для обработки и свойство `id`, означающее **id материала Joomla**. Не забыть указать нужный контекст для поля.

```
<?php
// мы находимся в файле макета поля
use Joomla\CMS\Factory;

$app = Factory::getApplication();
$fakeItem = new \stdClass();
// Получаем id текущего материала из объекта Input
$fakeItem->id = $app->getInput()->getInt('id');
//  - это шорт код вставки поля с id 29 - "ассортимент проекта"
// к содержимому поля конкатенируем шорт-код для обработки
$fakeItem->text = $field->value . '';
// Получаем объект плагина
$joomlaFieldContentPlugn = $app->bootPLugin('fields', 'content');
// вызываем метод обработки напрямую
$joomlaFieldContentPlugn->onContentPrepare('com_content.article', $fakeItem, $app->getParams());
// выводим оба поля
echo $fakeItem->text;
```

Теперь всё работает.

Минусы такого подхода - хардкод. В случае, когда шорт-код поля виден в админке - проще понять что там нагорожено. Но в данном случае сайт веду я и никто кроме меня.

## Почему не заработал content.prepare HTMLHelper?

Под капотом метод **HTMLHelper::_('content.prepare', $text)** делает в то же самое, что и сделал я: создаёт объект, эмулирующий объект материала, а потом возвращает обработанное свойство. За одним исключением - он не добавляет в него `id`. А `id` материала необходим контент-плагину **Поля** для того, чтобы получить значения полей конкретного материала. Поэтому, когда мы сами сделали то же самое, но добавив id - плагин заработал.

## Изменения в Joomla 5.3+

Joomla постепенно переходит от простого указания аргументов для триггеров плагинов к собственным классам событий. Это позволяет не запоминать порядок передачи аргументов класса и использовать человекопонятные методы `$event->getContext()`, `$event->getItem()` и т.д. А то в одном месте в Joomla было `$article`, в другом - `$item`, в третьем ещё как-то... Порядку больше становится.

После обновления сайта клиентов до Joomla 5.3 обновился и контент-плагин **fields** и описанный выше способ с вызовом метода плагина отвалился потому, что я передавал в нём 3 аргумента, вместо одного. И для события `onContentPrepare` это должен быть объект класса `ContentPrepareEvent`.

Как меняется фрагмент кода из предыдущего поста:

```
<?php
// мы находимся в файле макета поля

use Joomla\CMS\Event\Content\ContentPrepareEvent;
use Joomla\CMS\Factory;

$app = Factory::getApplication();
$fakeItem = new \stdClass();
// Получаем id текущего материала из объекта Input
$fakeItem->id = $app->getInput()->getInt('id');
//  - это шорт код вставки поля с id 29 - "ассортимент проекта"
// к содержимому поля конкатенируем шорт-код для обработки
$fakeItem->text = $field->value . '';
// Получаем объект плагина
$joomlaFieldContentPlugn = $app->bootPLugin('fields', 'content');
// вызываем метод обработки напрямую
// вместо 3-х аргументов теперь указываем один
// это объект класса ContentPrepareEvent
$joomlaFieldContentPlugn->onContentPrepare(new ContentPrepareEvent('onContentPrepare', [
            'context' => 'com_content.article',
            'subject' => $fakeItem,
            'params'  => $app->getParams(),
            'page'    => 0,
        ]));
// выводим оба поля
echo $fakeItem->text;
```

## Об авторе

![Толкачев Сергей Юрьевич](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: рендер пользовательского поля внутри другого пользовательского поля"
            }
        }
    ]
}
```

```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/sovet-po-joomla-render-polzovatelskogo-polya-vnutri-drugogo-polzovatelskogo-polya",
            "name": "Совет по Joomla: рендер пользовательского поля внутри другого пользовательского поля - WebTolk",
            "description": "Как создать нестандартный HTML макет в шаблоне Joomla с помощью пользовательских полей и собственных макетов вывода? Примеры HTML и 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/128",
            "isPartOf": {
                "@id": "https://web-tolk.ru/#/schema/WebPage/base"
            }
        }
    ]
}
```
