Описание
- Совместимость с версией Joomla!:
- 5.x
- Лицензия:
- GPLv2 or later
- Домашняя страница:
- https://web-tolk.ru/
- Оплата:
- Бесплатное
- Тип расширения:
- Плагин
- Системные требования:
- Joomla 5+
Плагин добавляет тип пользовательского поля wtlayoutselect.
Поле Joomla:
- сканирует указанные папки с PHP-лейаутами;
- показывает в выпадающем списке варианты с учетом переопределений шаблона (/templates/<template>/html/...);
- сохраняет выбранное значение в rawvalue поля с layout и basePath (JSON);
- отдает вычисленное значение в value (layout_id), пригодное для Joomla LayoutHelper::render().
Зачем это нужно?
Поле удобно, когда нужно дать контент-менеджеру выбор варианта верстки без правки шаблона:
2 основных варианта использования поля
- материалы (com_content): секции статьи, карточки, блоки CTA;
- контакты (com_contact): разные шаблоны карточки контакта;
- категории и списки: разные макеты частей страницы под контекст;
- зоны вывода модулей: включение контента/модулей в нужном варианте макета;
- возможность создавать переиспользуемые блоки вёрстки для создания лендингов на Joomla.
Вы используете это поле в своих переопределениях макета материалов, контактов Joomla или тех компонентов, которые их поддерживают.
Чтобы значение поля не отображалось автоматически, рекомендуется указать это в настройках поля.
Само поле играет роль логического переключателя макетов частей страницы, и его вывод ($field->value) имеет ценность в первую очередь для разработчика.
Вариант 1: рендер по вычисленному $field->valueКод (PHP):
<?php use Joomla\CMS\Layout\LayoutHelper; $field = $this->item->jcfields[14] ?? null; if ($field && !empty($field->value)) { echo LayoutHelper::render($field->value, ['item' => $this->item]); }
Или доступ по имени (алиасу) поля:
Вариант 2: рендер из rawvalue с basePathКод (PHP):
<?php defined('_JEXEC') or die; use Joomla\CMS\Factory; use Joomla\CMS\Layout\LayoutHelper; // Rebuild custom fields by field alias $customFields = []; foreach ($this->item->jcfields as $f) { $customFields[$f->name] = $f; } echo LayoutHelper::render( layoutFile: $customFields['layout-select']->value, displayData: ['item' => $this->item, 'jcfields' => $customFields] );Как указывать папки в параметрах поля и какой будет вычисленный layout_idКод (PHP):
<?php use Joomla\CMS\Layout\LayoutHelper; $field = $this->item->jcfields[14] ?? null; if ($field && !empty($field->rawvalue)) { $raw = json_dephp($field->rawvalue); if (!empty($raw->layout) && !empty($raw->basePath)) { echo LayoutHelper::render($raw->layout, ['item' => $this->item], $raw->basePath); } }
Ниже примеры для поля wtlayoutselect, если выбран файл pricelist.php.
Пример 1
Папка в параметрах поля: layouts/com_content/article/sections
Где реально лежит файл: JPATH_ROOT/layouts/com_content/article/sections/pricelist.php
rawvalue (ключевая часть): basePath=layouts/com_content/article/sections, layout=pricelist
Вычисленный layout_id в $field->value: com_content.article.sections.pricelist
Пример 2
Папка в параметрах поля: layouts/com_content/article/sections
Где реально лежит файл: templates/<template>/html/com_content/article/sections/pricelist.php (override)
rawvalue (ключевая часть): basePath=layouts/com_content/article/sections, layout=pricelist
Вычисленный layout_id в $field->value: com_content.article.sections.pricelist
Пример 3
Папка в параметрах поля: templates/multizone/html/com_content/article/sections
Где реально лежит файл: JPATH_ROOT/templates/multizone/html/com_content/article/sections/pricelist.php
rawvalue (ключевая часть): basePath=templates/multizone/html/com_content/article/sections, layout=pricelist
Вычисленный layout_id в $field->value: templates.multizone.html.com_content.article.sections.pricelist
Пример 4
Папка в параметрах поля: components/com_contact/layouts/contact/parts
Где реально лежит файл: JPATH_ROOT/components/com_contact/layouts/contact/parts/pricelist.php
rawvalue (ключевая часть): basePath=components/com_contact/layouts/contact/parts, layout=pricelist
Вычисленный layout_id в $field->value: components.com_contact.layouts.contact.parts.pricelist
Важно:
- Для путей, начинающихся с layouts/..., плагин убирает префикс layouts. в $field->value, чтобы layout_id можно было сразу передавать в LayoutHelper.
- Для путей вне JPATH_ROOT/layouts (например, templates/... и components/...) layout_id включает весь путь в dot-формате.
- В таких случаях обычно надежнее рендерить через rawvalue с явным basePath (вариант 2 выше).
Пример вызова в переопределении материала (/templates/<template>/html/com_content/article/default.php):
Примеры лейаутов: когда передается item материалаКод (PHP):
<?php use Joomla\CMS\Layout\LayoutHelper; $field = null; foreach (($this->item->jcfields ?? []) as $f) { if (($f->name ?? '') === 'article_layout_variant') { $field = $f; break; } } if ($field && !empty($field->value)) { echo LayoutHelper::render($field->value, ['item' => $this->item]); }
Ниже примеры layout-файлов (например, в layouts/com_content/article/sections/...), когда вы передали ['item' => $this->item].
Пример 1: базовый layout секции статьи
Файл: layouts/com_content/article/sections/lead.php
Пример 2: как получить поля статьи внутри layoutКод (PHP):
<?php /** @var array $displayData */ defined('_JEXEC') or die; extract($displayData); if (empty($item)) { return; } ?> <section class="article-lead"> <h2><?php echo htmlspecialchars($item->title ?? '', ENT_QUOTES, 'UTF-8'); ?></h2> <?php if (!empty($item->images)) : $images = json_dephp($item->images); $intro = $images->image_intro ?? ''; ?> <?php if (!empty($intro)) : ?> <img src="/<?php echo htmlspecialchars($intro, ENT_QUOTES, 'UTF-8'); ?>" alt=""> <?php endif; ?> <?php endif; ?> <div> <?php echo $item->introtext ?? ''; ?> </div> </section>
Файл: layouts/com_content/article/sections/specs.php
Рендер модульной позиции через ModuleHelper в переопределениях JoomlaКод (PHP):
<?php /** @var array $displayData */ defined('_JEXEC') or die; extract($displayData); if (empty($item)) { return; } $fields = $item->jcfields ?? []; $sku = null; $price = null; foreach ($fields as $f) { if (($f->name ?? '') === 'sku') { $sku = $f->rawvalue; } if (($f->name ?? '') === 'price') { $price = $f->rawvalue; } } ?> <div class="product-specs"> <?php if (!empty($sku)) : ?><p>SKU: <?php echo htmlspecialchars($sku, ENT_QUOTES, 'UTF-8'); ?></p><?php endif; ?> <?php if (!empty($price)) : ?><p>Price: <?php echo htmlspecialchars($price, ENT_QUOTES, 'UTF-8'); ?></p><?php endif; ?> </div>
Файл: layouts/com_content/article/sections/sidebar-modules.php
Код (PHP):
<?php /** @var array $displayData */ defined('_JEXEC') or die; use Joomla\CMS\Helper\ModuleHelper; extract($displayData); // При желании можно выбирать позицию по материалу/категории $position = 'article-sidebar'; $modules = ModuleHelper::getModules($position); if (empty($modules)) { return; } ?> <aside class="article-sidebar-modules"> <?php // Выводим все модули из этой позиции foreach ($modules as $module) : ?> <div class="article-sidebar-module"> <?php echo ModuleHelper::renderModule($module, ['style' => 'none']); ?> </div> <?php endforeach; ?> </aside>
WT Layout select - плагин выбора файла макета 2026-02-26
Плагин пользовательского поля Joomla: выпадающий список PHP-лейаутов из указанных папок с учетом пер