WT Layout select - плагин выбора файла макета
- Категория: Плагины Joomla
- Версия: 1.0.0
- Дата:
Плагин пользовательского поля Joomla: выпадающий список PHP-лейаутов из указанных папок с учетом переопределений активного шаблона сайта.
Описание
Плагин добавляет тип пользовательского поля wtlayoutselect.
Поле Joomla:
- сканирует указанные папки с PHP-лейаутами;
- показывает в выпадающем списке варианты с учетом переопределений шаблона (
/templates/<template>/html/...); - сохраняет выбранное значение в
rawvalueполя сlayoutиbasePath(JSON); - отдает вычисленное значение в
value(layout_id), пригодное для JoomlaLayoutHelper::render().
Зачем это нужно?
Поле удобно, когда нужно дать контент-менеджеру выбор варианта верстки без правки шаблона:
- материалы (
com_content): секции статьи, карточки, блоки CTA; - контакты (
com_contact): разные шаблоны карточки контакта; - категории и списки: разные макеты частей страницы под контекст;
- зоны вывода модулей: включение контента/модулей в нужном варианте макета.
- возможность создавать переиспользуемые блоки вёрстки для создания ледингов на Joomla
2 основных варианта использования поля
Вы используете это поле в своих переопределениях макета материалов, контактов Joomla или тех компонентов, которые их поддерживают. Для того, чтобы значение поля не отображалось автоматически - рекомендуется указать это прямо в настройках поля. Само поле играет роль логического переключателя макетов частей страницы и его вывод ($field->value) имеет ценность только для разработчика.
Вариант 1: рендер по вычисленному $field->value
<?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
use Joomla\CMS\Layout\LayoutHelper;
$field = $this->item->jcfields[14] ?? null;
if ($field && !empty($field->rawvalue)) {
$raw = json_decode($field->rawvalue);
if (!empty($raw->layout) && !empty($raw->basePath)) {
echo LayoutHelper::render($raw->layout, ['item' => $this->item], $raw->basePath);
}
}
Как указывать папки в параметрах поля и какой будет вычисленный layout_id
Ниже примеры для поля wtlayoutselect, если выбран файл pricelist.php.
| Папка в параметрах поля | Где реально лежит файл | rawvalue (ключевая часть) | Вычисленный layout_id в $field->value |
|---|---|---|---|
layouts/com_content/article/sections |
JPATH_ROOT/layouts/com_content/article/sections/pricelist.php |
basePath=layouts/com_content/article/sections, layout=pricelist |
com_content.article.sections.pricelist |
layouts/com_content/article/sections |
templates/<template>/html/com_content/article/sections/pricelist.php (override) |
basePath=layouts/com_content/article/sections, layout=pricelist |
com_content.article.sections.pricelist |
templates/multizone/html/com_content/article/sections |
JPATH_ROOT/templates/multizone/html/com_content/article/sections/pricelist.php |
basePath=templates/multizone/html/com_content/article/sections, layout=pricelist |
templates.multizone.html.com_content.article.sections.pricelist |
components/com_contact/layouts/contact/parts |
JPATH_ROOT/components/com_contact/layouts/contact/parts/pricelist.php |
basePath=components/com_contact/layouts/contact/parts, layout=pricelist |
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):
<?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]);
}
Примеры лейаутов: когда передается item материала
Ниже примеры самих layout-файлов (например, в layouts/com_content/article/sections/...), когда вы передали ['item' => $this->item].
Пример 1: базовый layout секции статьи
Файл: layouts/com_content/article/sections/lead.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_decode($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>
Пример 2: как получить поля статьи внутри layout
Файл: layouts/com_content/article/sections/specs.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>
Рендер модульной позиции через ModuleHelper в переопределениях Joomla
Файл: layouts/com_content/article/sections/sidebar-modules.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>
Joomla
- Тип расширения:
- Плагин
- Каталог:
- Fields
- Версия Joomla:
- 6.0.3