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

Скачивания 9 Просмотры 6 CTR 150% Plg Free

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

Описание

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

Поле Joomla:

  • сканирует указанные папки с PHP-лейаутами;
  • показывает в выпадающем списке варианты с учетом переопределений шаблона (/templates/<template>/html/...);
  • сохраняет выбранное значение в rawvalue поля с layout и basePath (JSON);
  • отдает вычисленное значение в value (layout_id), пригодное для Joomla LayoutHelper::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/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/multizone/html/com_content/article/sections JPATH_ROOT/templates/multizone/html/com_content/article/sections/pricelist.php basePath=templates/multizone/html/com_content/article/sectionslayout=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/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 Категорий
520 Выпущено версий
656121 Всего скачиваний