WT Layout select - плагин выбора файла макета

Скачивания 297 Просмотры 172 CTR 173% Plg Free

Плагин пользовательского поля Joomla: выпадающий список PHP-лейаутов из указанных папок с учетом переопределений активного шаблона сайта.

Описание

Плагин добавляет тип пользовательского поля wtlayoutselect.

Поле Joomla:

  • сканирует указанные папки с PHP-лейаутами;
  • показывает в выпадающем списке варианты с учетом переопределений шаблона (/templates/<template>/html/...);
  • сохраняет выбранное значение в rawvalue поля с layout и basePath (JSON);
  • отдает вычисленное значение в value (layout_id), пригодное для Joomla LayoutHelper::render().

Зачем это нужно?

Демо видео переключения макетов блоков в материалах Joomla из панели администратора

Поле удобно, когда нужно дать контент-менеджеру выбор варианта верстки без правки шаблона:

  • материалы (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]);
}

Или вариант того же кода с доступом по имени (алиасу) поля:

<?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]);

Вариант 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/sectionslayout=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/sectionslayout=pricelist com_content.article.sections.pricelist
templates/webtolk/html/com_content/article/sections JPATH_ROOT/templates/webtolk/html/com_content/article/sections/pricelist.php basePath=templates/webtolk/html/com_content/article/sectionslayout=pricelist templates.webtolk.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/partslayout=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

Что нового

Добавлено

Опция По умолчанию для выпадающего списка

Добавлена подключаемая опция по умолчанию для выпадающего списка.

Расширения Joomla WebTolk

103 Всего расширений
12 Категорий
524 Выпущено версий
670966 Всего скачиваний