Обновить
3.9

CMS *

Системы управления сайтом

Сначала показывать
Порог рейтинга

В Joomla 4 и Joomla 5 появилась концепция Web Assets и WebAssetManager, с помощью которого можно управлять подключениями css, js файлов, подключением. Все css и js файлы включаются в общий реестр ассетов, затем выстраивается граф зависимостей и в итоге на генерируемую страницу подключается только то что нужно на данной странице.

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

Одним из таких плагинов веб-ассетов является WT JSwiper.js. Плагин добавляет в Joomla Web Assets Registry ассет популярного скрипта swiper.js, который потом легко можно использовать в коде:

use Joomla\CMS\Factory;

$wa = Factory::getApplication()->getDocument()->getWebAssetManager();
// Локальный файл
$wa->useScript('swiper-bundle')->useStyle('swiper-bundle'); 
// Подключение из CDN
$wa->usePreset('swiper-bundle-remote'); 

😐 Например, было: иконочный шрифт могут использовать 2 разных модуля. CSS обычно подключается в шаблоне и он грузится везде, даже там, где не надо. Если же подключать CSS в одном модуле, а в другом нет - на странице стиль есть ровно до тех пор, пока опубликован модуль с этим подключением.

👍 Стало: теперь в макетах расширений мы просто пишем $wa->useStyle('my.style'); и за необходимостью подключения нужного ассета (в данном случае CSS с иконочным шрифтом) следит Web Asset Manager. Если мы снимем один модуль с публикации, то нужный ассет подключит другой модуль.

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

В этой версии, кроме обновления собственно ассета до версии 11.2.5 к нему добавился пока что частичный перевод документации Swiper на русский язык.

Также будет полезно:

Теги:
Всего голосов 1: ↑1 и ↓0+1
Комментарии0

Судьба плагина обратной совместимости в Joomla

Некоторых разработчиков и вебмастеров интересует останется ли плагин обратной совместимости в Joomla 6. Этот плагин был создан для того, чтобы сделать переход от версии к версии более гладким и бесшовным.
Подробнее почитать о роли плагина можно в официальной документации на manual.joomla.org: Compatibility Plugin.

Устаревший код МОЖЕТ быть перемещен в плагин совместимости. Плагин обеспечивает более плавное обновление между основными версиями. Он содержит код из предыдущей версии, который может сломать сайт после обновления, поскольку расширение использует устаревший код. Расширение полностью совместимо только тогда, когда оно работает без проблем с отключенным плагином совместимости.

От версии к версии часть кода ядра Joomla помечается как устаревшая, а затем, спустя некоторое время удаляется из основного ядра и МОЖЕТ быть перемещена в плагин обратной совместимости. Эта концепция появилась при переходе от Joomla 4 к Joomla 5.

Важным уточнением является то, что для новой мажорной версии (joomla 3, joomla 4, joomla 5 и т.д.) плагин содержит устаревший код предыдущей версии. То есть для Joomla 5 это код из Joomla 4. Для Joomla 6 - код из Joomla 5.

Таким образом расширения, использующие методы и функции ядра Joomla и всё ещё работающие даже с плагином обратной совместимости на Joomla 5 в Joomla 6 скорее всего работать уже не будут. В Joomla 6 из плагина обратной совместимости будет удален код, поддерживающий обратную совместимость с Joomla 4. Таким образом стабильно работать в Joomla 6 будет то, что сейчас стабильно работает на Joomla 5 с отключённым плагином обратной совместимости.

Чат русскоязычного Joomla-сообщества

Теги:
Всего голосов 1: ↑0 и ↓1-1
Комментарии0

Joomla-разработчикам: обращение к методам модели в HtmlView напрямую

Когда-то, давным-давно в одной далёкой галактике кто-то решил, что было бы неплохой идеей ввести в Joomla косвенный доступ к методам модели (MVC) для получения данных, добавив метод AbstractView::get(). Этот метод извлекает модель и затем запускает get(). Простыми словами, когда мы во View (файл HtmlView нашего компонента) видим конструкцию $this->item = $this->get('Item') это означает обращение к методу getItem() модели для текущего View.

Но такой подход исключает любую возможность подсказки типов, аргументов и т. д. и делает все излишне сложным. Поэтому разработчики ядра Joomla объявили этот метод устаревшим с этим PR 44162.

Новый способ выглядит так:

// Файл HtmlView компонента

    public function display($tpl = null)
    {
        $model = $this->getModel();
        $this->items = $model->getItems();

        parent::display($tpl);
    }

Старый подход (то есть метод get() во View) будет удалён в Joomla 7. Памятуя о релизном цикле Joomla, это означает, что:

  1. осенью 2025г выйдет Joomla 6.

  2. 2 года она будет основной веткой. Joomla 5 будет в режиме поддержки

  3. через 2 года, в 2027 выйдет Joomla 7, в которой будет удалён этот метод.

  4. но Joomla 6 будет ещё 2 года в режиме тех.поддержки и в ней (до 2029 года) этот метод останется.

Таким образом у разработчиков есть от 2,5 до 4,5 лет (на момент написания этого поста) на то, чтобы сделать этот рефакторинг.

Пруф [5.3] Deprecate AbstractView::get() #44162

Чат русскоязычного Joomla-сообщества

Теги:
Всего голосов 2: ↑1 и ↓1+1
Комментарии0

Совет по Joomla: показ уведомлений Joomla.renderMessages.

Пользователь совершает какие-то действия на сайте и получает сообщения об успешном или не успешном их результате, а также просто информационные сообщения. В php коде мы привыкли использовать для этого метод enqueueMessage():

use Joomla\CMS\Factory;

$html = 'Message';
Factory::getApplication()->enqueueMessage($html, 'warning');

Чаще всего в качестве сообщения используются языковые константы, чтобы пользователи могли получать сообщения на своём языке:

use Joomla\CMS\Factory;
use Joomla\CMS\Language\Text;

Factory::getApplication()->enqueueMessage(Text::_('SOME_LANG_CONSTANT'), 'info');

Рендер сообщений Joomla во фронтенде.

Здесь нам потребуется файл подключённые файлы ядра core.js и messages.js. Немного выдержки из кода:

/**
* Рендер сообщений, отправленных через  JSON
* Используется некоторыми javascript, в частности validate.js
*
* @param   {object}  messages JavaScript объект, содержащий сообщения для рендера.
* Пример:
*    const messages = {
*        "message": ["Это будет зелёное сообщение", "И это тоже"],
*        "error": ["Это будет красное сообщение", "И это тоже"],
*        "info": ["Это будет синее сообщение", "И это тоже"],
*        "notice": ["Какое-то информационное сообщение", "И это тоже"],
*        "warning": ["Оранжевое сообщение", "И это тоже"],
*        "my_custom_type": ["Такое же как инфо-сообщение", "И это тоже"]
*    };
* @param  {string} selector CSS-селектор контейнера для рендера сообщений
* @param  {bool}   keepOld  Удалить предыдущие сообщения? Да, если true
* @param  {int}    timeout  Таймаут исчезновения сообщения в миллисекундах
* @return  void  Метод ничего не возвращает
*/

Вот как это выглядит на практике:

Joomla.renderMessages({
    message: [Joomla.Text._('COM_SWJPROJECTS_USER_KEYS_KEY_SUCCESSFULLY_COPYED')]
});

Теперь мы видим, что в качестве сообщения мы и в Javascript можем использовать языковые константы. Для этого мы используем метод Joomla.Text._() (по аналогии с Text::_() в PHP). Но Javascript откуда-то должен получить значения этих языковых констант. И для этого в php коде нашей страницы мы должны позаботиться о нём и добавить нужные для js языковые константы с помощью метода Text::script().

use Joomla\CMS\Language\Text;

Text::script('SOME_LANG_CONSTANT_SUCCESS');
Text::script('SOME_LANG_CONSTANT_FAIL');

Таким образом я смогу получить в js доступ к значениям языковых констант SOME_LANG_CONSTANT_SUCCESS и SOME_LANG_CONSTANT_FAIL.

Источник

Теги:
Всего голосов 2: ↑2 и ↓0+2
Комментарии0

Событие Pizza, Bugs & Fun приближается - 22 февраля 2025 года

Уже несколько лет в мире Joomla проводятся мероприятия "Pizza, Bugs & Fun" (#PBF), где каждый может посвятить несколько часов своего мозгового времени тому, чтобы наша любимая CMS стала ближе к идеалу.

Видео из этого поста рассказывает об организационных вопросах, которые пригодятся для участия в PBF:

  • как создать аккаунт в Mattermost (чат международного Joomla-сообщества)

  • как создать аккаунт в Joomla! Documentation

  • как написать статью в Joomla! Documentation

  • как создать аккаунт на GitHub (у разработчиков обычно уже он есть)

  • как настроить патч тестер

  • как протестировать патч

  • как получить вознаграждение

В рамках события PBF все желающие могут собираться в общий онлайн чат, обсудить вопросы Joomla и приложить к их разрешению свою руку. Самый классный вариант, когда эта встреча происходит оффлайн: тогда организовывается пицца, напитки по вкусу и несколько часов совместного творчества.

Каждый помогает тем, что он умеет:

  • кто-то пишет недостающую документацию,

  • кто-то пишет код,

  • кто-то тестирует как исправлены ошибки или сделан новый функционал.

На сайте события есть карта, можно "захостить" свою локацию. Практически все движки в мире развиваются за счёт спонсирующих их компаний. Joomla одна из немногих, где развитие идёт только усилиями международного сообщества энтузиастов.

На момент написания данного поста в репозитории Joomla 752 открытых Issue (как правило это баги) и 223 Pull request (PR, исправление багов и новый функционал). Все PR обязательно тестируются минимум двумя участниками сообщества, дабы в конечный код движка не проскочила ошибка.

Если каждый из участников только нашего сообщества сделает даже одно тестирование, то, боюсь, PR и Issue на всех не хватит 😀

Смотреть видео

Сайт

Joomla по-русски: чат сообщества

Теги:
Рейтинг0
Комментарии0

Совет по Joomla: программный рендер модулей

Модули порой удобно использовать в местах, которые в Joomla не всегда предназначены для этого 😀. Например, в переопределениях макета. Из материала делаем посадочную страницу: часть инфы находится в самом материале, часть - в полях, а часть удобно вывести модулем. При этом модуль этот должен находиться между телом материала и данными из пользовательских полей.

Для реализации берём в руки ModuleHelper и приступаем.

<?php
use \Joomla\CMS\Helper\ModuleHelper;

$modules = ModuleHelper::getModules('landing-masonry');
if(!empty($modules))
{
    foreach ($modules as $module)
    {
        // рендерим всё, что нашли в позиции landing-masonry
        echo ModuleHelper::renderModule($module);
    }
}

А что если посложнее?

В этом случае всё просто. Но здесь в тему будет упомянуть ещё один способ работы с модулями. Контекст: магазин одежды. В карточке товара нужно вывести информацию о размерной сетке, типовые рекомендации по уходу и т.д. Это короткие тексты, которые повторяются из товара в товар и не нужно их копировать многажды. Эти тексты отображались простым аккордеоном Bootstrap.

Вид карточки товара JoomShopping. Все тексты, кроме описания товара - одинаковые во всех товарах. Описание товара уникальное для каждого товара.

Но! В этот же аккордеон нужно было добавить и описание товара JoomShopping. Поэтому я сделал с помощью своего модуля WT Quick links следующее.

  1. Создал модуль типа WT Quick Links, в котором в список элементов занёс все нужные тексты.

  2. Не стал назначать модуль какой-либо позиции. В шаблоне JoomShopping захардкодил id модуля. Хотя лучше было бы назначить модуль в некой уникальной позиции, которая встречалась бы только в нужном нам месте на сайте.

  3. Программным способом в данные модуля добавил нужные данные из JoomShopping так, как мне нужно (в начало списка - описание товара).

  4. Отрендерил модуль с помощью ModuleHelper в product_default.php шаблона JoomShopping.

<?php
use Joomla\CMS\Helper\ModuleHelper;
use Joomla\Registry\Registry;

// Модуль id 136 - Доставка, оплата и гарантии в карточку товара + ОПИСАНИЕ ТОВАРА JoomShopping
$module = ModuleHelper::getModuleById('136');

$module_params = new Registry($module->params);
// Формируем новые параметры модуля перед рендером. 
$new_module_params = [];
$i = 1;

// Помещаем описание товара в самое начало

if (!empty($this->product->description)){
    $new_module_params['fields']['fields0'] =  (object) [
        'item_header' => Text::_('JSHOP_DESCRIPTION'),
        'item_text'   => $this->product->description
    ];
}
// Переименовываем все остальные ключи массива элементов из модуля
foreach ($module_params->get('fields') as $key => $value)
{
    $new_module_params['fields']['fields' . $i] = $value;
    $i++;
}
$new_module_params = new Registry($new_module_params);
// Соединяем старые и новые параметры модуля.
$module_params->merge($new_module_params);

$module->params = $module_params->toString();

// Всё готово! Рендерим модуль.
echo ModuleHelper::renderModule($module);

Теги:
Всего голосов 3: ↑1 и ↓2+1
Комментарии0

Совет по Joomla: метод debug() для отладки лейаутов

В Joomla есть понятие layout. Это кусочек вёрстки, который можно многажды использовать в любом месте сайта: как в панели администратора, так и во фронтенде. Можно рассматривать лейауты как оторванные от контекста элементы дизайна. Находятся они в папке layouts в корне сайта. Также, в случае с модулями они могут находиться в папке tmpl модуля. А в случае с плагинами - в tmpl плагина.

Их можно переопределять в шаблонах, в чём и заключается одна из главных фишек Joomla. Лейауты чаще всего рендерятся с помощью классов LayoutHelper или напрямую FileLayout. Писал о них ранее тут и тут.

А вот как увидеть какой именно файл переопределения используется? Сколько их вообще есть и по каким путям идёт поиск макетов? Для этого есть метод debug() (и у LayoutHelper и у FileLayout).

<?php
/**
* Method to render a layout with debug info
*
* @param   string  $layoutFile   Dot separated путь к файлу относитеьлно basePath
* @param   mixed   $displayData  Объект с данными для рендера
* @param   string  $basePath     Base path, где будет поиск файлов лейаутов
* @param   mixed   $options      Дополнительные опции для FileLayout
*
* @return  string
*
* @since   3.5
*/
public static function debug($layoutFile, $displayData = null, $basePath = '', $options = null)
{
 // Так проще показать параметры метода.
}

То есть мы в можем проверить следующим образом:

<?php
/**
 * Получаем параметры баннера
 */
$wt_custom_menu_item_banner = $menu->getParams()->get('wt_custom_menu_item_banner');

echo \Joomla\CMS\Layout\LayoutHelper::debug(
        ($wt_custom_menu_item_banner?->pluginlayout ?? 'default'),
        ['wt_custom_menu_item_banner' => $wt_custom_menu_item_banner],
        JPATH_SITE.'/plugins/system/wt_custom_menu_item_banner/tmpl'
    );

И увидим результат как на скриншоте в начале поста.

Чат русскоязычного Joomla-сообщества.

Теги:
Всего голосов 1: ↑0 и ↓1-1
Комментарии2

E-mail шаблоны Joomla 5: добавление и просмотр своих переменных

В Joomla 5 появились настраиваемые email-шаблоны, как системные, так и сторонних компонентов. Их нельзя (пока что) добавить самостоятельно, они добавляются расширениями при установке. Но их можно отредактировать в Система - Шаблоны - Шаблоны писем. В настройках шаблонов писем (кнопка настроек компонента в верхнем правом углу) мы выбираем формат писем текст или HTML. Тогда становятся доступны настройки макетов шаблонов писем Joomla. Эти глобальные параметры можно переопределить в каждом конкретном email-шаблоне. Таким образом для каждого из email-шаблонов можно указать свою вёрстку и настройки логотипа.
Это, конечно, требует отдельной подробной статьи...

Для разработчиков: как добавить свои переменные для e-mail шаблонов Joomla?

Полезны окажутся 2 триггера для плагинов: onMailBeforeTagsRendering и onMailBeforeRendering.

onMailBeforeRendering - триггер, который позволяет добавлять свои шорт-коды для строковой замены в плагине. Отдать туда надо массив вида [ variable_name => variable_value ]. Из админки свои переменные нужно добавлять уже с фигурными скобками: {variable_name} заменится на variable_value. Аргументом $event плагина является экземпляр класса BeforeRenderingMailTemplateEvent, в котором есть кроме прочих 2 метода: getTemplate() (получение объекта мейлера, куда можно добавлять свои данные) и getTemplateId() (получение id шаблона письма вида com_users.registration.admin.new_notification), по которому мы определяем нужный ли это для нас email-шаблон или нет. Аналогично контексту в контент-плагинах.

Также полезное свойство класса для передачи данных из плагина в лейаут письма для рендера - $layoutTemplateData. Это ассоциативный массив.

// Получаем текущий мейлер 
$mailTemplate = $event->getTemplate();
$data = [
   'variable_name' => 'variable_value'
];
// с Joomla 4 для всех типов писем. 2-й аргумент - plain - текстовый формат письма 
$mailTemplate->addTemplateData($data, false);
// с Joomla 5.2 - для HTML-писем
$mailTemplate->addLayoutTemplateData($data);

// пример из ядра Joomla
// Add additional data to the layout template
$this->addLayoutTemplateData([
    'siteName' => $app->get('sitename'),
    'lang'     => substr($this->language, 0, 2),
]);

onMailBeforeTagsRendering - триггер, который добавляет ваши переменные в список доступных переменных для замены в окне редактирования email шаблона Joomla. Отдать туда нужно массив с переменными, но без их значений.

Чат Joomla-сообщества в Telegram

Мой личный Telegram-канал

Теги:
Рейтинг0
Комментарии0

Shopify's Sidekick — так себе

❗️ Дисклеймер: Я не обижаю ИИ от Shopify, а высказываю опыт работы с ним. Если тон поста показался грубым, то вам показалось.

Я отестировал Sidekick (https://www.shopify.com/magic) — ИИ менеджер встроенный в Shopify и мне не понравилось. Во-первых, что он вообще умеет на данный момент?

Я пробовал давать простые команды по типу:
“Убери скидки со всех товаров, где она есть”

Задачи посложнее, например:
“Сделай скидки и создай новую колелкцию под них”

Но пока что всё, что делает Sidekick это отображает данные. К примеру, он может показать какие товары в магазине имеет скидочную цену. Это, конечно, хорошо. Но это можно сделать зайдя во все продукты в админ-панеле.

Во-вторых, долгое ожидание. Я бы, может, не прикапывался если бы его выпустили год назад. Но его не выпустили год назад, а он появился в большинстве магазинов только две недели назад.

Поэтому этот искуственный менеджер уже не кажется вау обновлением. Ну добавили и добавили, к сожалению, пока что ничего интересного Sidekick не умеет.

Будем ждать. Возможно, скоро он выйдет из беты и тогда начнётся.

Теги:
Всего голосов 1: ↑1 и ↓0+3
Комментарии0

Подготовка расширений к Joomla 6: CMSObject -> stdClass

В Joomla 6 метод getItem() в Adminmodel будет возвращать \stdClass вместо CMSObject. Это означает, что все устаревшие функции этого класса будут недоступны.

Разработчики в Joomla 6 должны напрямую работать со свойствами объекта item и не использовать устаревшие методы set() и get().

Устаревший способ

<?php
$article = $app->bootComponent('content')->getMVCFactory()->createModel('Article', 'Administrator')->getItem(1);
echo $article->get('title');

Как будет в Joomla 6

<?php
$article = $app->bootComponent('content')->getMVCFactory()->createModel('Article', 'Administrator')->getItem(1);
echo $article->title;

Соответствующий Pull Request уже принят в ветку Joomla 6.

PR на GitHub

Теги:
Рейтинг0
Комментарии0

Запуск выполнения задач планировщика задач Joomla из консоли (CLI)

Чтобы запустить выполнение задач планировщика с помощью CLI Вам нужно подключиться к своему серверу по SSH и выполнить команду:

php /path/to/site/public_html/cli/joomla.php scheduler:run

Если требуется запустить конкретную задачу, то посмотреть список можно с помощью команды

php /path/to/site/public_html/cli/joomla.php scheduler:list

а затем запустить задачу по её id

php /path/to/site/public_html/cli/joomla.php scheduler:run --id=XXX

В некоторых случаях на сервере может быть не доступна просто команда php и может потребоваться указание пути к php. Начиная с Joomla 4 у неё под капотом консоль от Simfony.

Теги:
Всего голосов 1: ↑0 и ↓1-1
Комментарии0

Совет по Joomla: используем Promise в Ajax-запросах

В статье Ajax-запросы нативными средствами Joomla было подробно разобрано, как с помощью Joomla.request можно легко создавать Ajax-запросы в Joomla.

В одном из комментариев был вопрос по поводу Promise, а умеет ли Joomla? Умеет, но начиная с Joomla 4. Достаточно при создании запроса выставить флаг promise в true и результатом выполнения запроса будет Promise:

Joomla.request({
    url: Joomla.getOptions('system.paths', '').root+'/index.php?option=com_ajax&format=json&module=example',
    method: 'POST',
    promise: true
})
.then(response => {
    let text = JSON.parse(response.text);
    return text.data;
})
.catch(error => {
    console.log(error);
});

Таким образом мы можем эффективно строить асинхронные цепочки, добавив всего один флаг к вызову Joomla.request.

Теги:
Всего голосов 8: ↑8 и ↓0+11
Комментарии0

Совет о Joomla: использование FileLayout для рендера элементов макета.

Этот механизм используется под капотом Joomla для рендера отображения почти всех элементов интерфейса как фронта, так и админки. Обычно переиспользуемые "запчасти" выносятся в отдельные файлы: кнопки, тулбары, меню, табы и т.д. Для унификации отображения каждого элемента нужны некие данные данные и/или параметры: например, заголовок таба, надпись или onclick для кнопки, CSS класс и т.д.

<?php
use Joomla\CMS\Layout\FileLayout;

/**
 * Method to instantiate the file-based layout.
 *
 * @param   string  $layoutId  Dot separated путь к файлу, включая имя файла относительно base path
 * @param   string  $basePath  Основной путь к папке с макетами
 * @param   mixed   $options   Данные, нужные для работы макета. Registry или массив
 *
 * @since   3.0
 */
 $layout = new FileLayout('layout_file_name', JPATH_SITE . '/path/to/your/layout', ['buttonName' => 'Button name']);
// Рендерим наш макет
echo $layout->render();

Внутрь файла (/path/to/your/layout/layout_file_name.php в нашем случае) передаются данные и параметры для рендера. Получить эти данные можно следующим образом.

<?php
// Это содержимое файла /path/to/your/layout/layout_file_name.php
// Переданные данные приходят в формате Registry. Можно указать значение по умолчанию
$buttonName = $this->options->get('buttonName', 'Default name if value is empty');
?>
<button class="btn btn-primary"><?php echo $buttonName;?></button>

Теги:
Всего голосов 2: ↑1 и ↓1+2
Комментарии0

Ближайшие события

Совет по Joomla: атрибут showon в XML-формах Joomla Form

При создании расширений Joomla порой набирается куча полей, которые загромождают экран. Их можно группировать в fieldset, а можно скрывать, если одно поле зависит от значения другого (как на видео). Разработчики используют в XML описаниях полей атрибут showon.Например, мы спрашиваем у пользователя является ли атрибут JoomShopping цветом и если да, то показываем поле для ввода цвета в HEX (как на видео).

Пример использования:

<field type="radio"
       name="is_color"
       label="Атрибут является цветом?"
       class="btn-group btn-group-yesno"
       description="Если да, то указываем код цвета в HEX или CSS-класс"
       default="0">
    <option value="0">JNO</option>
    <option value="1">JYES</option>
</field>
<field type="color"
       name="attr_color_code"
       label="Код цвета в HEX"
       showon="is_color:1"/>

Если поле is_color имеет значение "1", то поле с атрибутом showon="is_color:1" будет видно пользователю. Поддерживается логика И, ИЛИ, НЕ и несколько полей в условии. Работает даже для текстовых полей. Например, если не заполнен пароль для подключения к внешнему сервису - нет смысла показывать все остальные поля.

Почитать: Официальная документация Joomla по атрибуту showon.

Также использовать этот атрибут можно в пользовательских полях Joomla. Во вкладке "Параметры" поля укажите правило следующим образом field + ID:

field36:value1

где 36 - это id поля, от состояния которого зависит видимость данного.

Теги:
Всего голосов 2: ↑2 и ↓0+4
Комментарии2

Совет по Joomla: как изменить вывод полей в админке?

Сегодня в Joomla-чате встретился вопрос:

Можно ли как-то убрать поля "Описание" и "Без описания" у пользовательского поля "Медиа (media)"?

Это поле типа AccessibleMedia, которое создаётся плагином группы Fields. Поле этого типа создаётся в админке для материалов, контактов и любых других компонентов, поддерживающих. В нём всегда есть поле для заполнения атрибута alt и галочка "без описания".

В админке Joomla действуют ровно те же правила, что и во фронтенде: практически всё можно переопределить в папке html шаблона. Шаблон админки Joomla по умолчанию - Atum. Поле AccessibleMedia использует для рендера layout joomla.form.field.media.accessiblemedia. Это dot-separated путь в папке layouts в корне сайта. Значит мы берём файл layouts/joomla/form/field/media/accessiblemedia.php и копируем его в папку html шаблона админки: administrator/templates/atum/html/layouts/joomla/form/field/media/accessiblemedia.php. Всё. Дальше в скопированном файле делаем всё, что хотим, не боясь при обновлении Joomla потерять наши исправления. В данном случае можно вывести рендер одного поля вместо трёх.

Теги:
Всего голосов 1: ↑1 и ↓0+3
Комментарии0

Совет по Joomla: использование методов плагинов в любом месте Joomla 4 / Joomla 5.

Нередко расширения Joomla в готовом виде состоят из пакета - комплекта плагинов, модулей, библиотек. Расширения из одного пакета могут нуждаться в одном и том же методе. В Joomla 4 и старше новая (хм-м, 2 года уже прошло...) архитектура плагинов позволяет обращаться к методам плагина откуда угодно, что может стать удобным решением задачи.

Обращение к методу "Сделать хорошо"
Обращение к методу "Сделать хорошо"

Такой подход можно использовать везде: в компонентах, плагинах, библиотеках, модулях и т.д. Например, если в настройках компонента можно переключить источник данных - плагин-провайдер, то один путь - триггерить событие для группы этих плагинов. А можно вызвать нужный метод напрямую.

<?php
use Joomla\CMS\Factory;
use Joomla\CMS\Component\ComponentHelper;
use Joomla\CMS\Plugin\PluginHelper;

// Получим параметры компонента
$component_params = ComponentHelper::getParams('com_mycomponent');
// Получим имя плагина-провайдера
$plugin_name = $component_params->get('data_provider');
// Проверим, а включён ли плагин?
if(PluginHelper::isEnabled('system', $plugin_name))
{
     // Загрузим плагин
     $plugin_provider = Factory::getApplication()->bootPlugin($plugin_name, 'system');
     // Получим данные из него напрямую
     $external_data = $plugin_provider->getExternalData($any_id);
}

Теги:
Всего голосов 1: ↑1 и ↓0+3
Комментарии1

Обновление компонента SW JProjects v.2.0.0

Скриншот панели администратора компонента SW JProjects в Joomla 5
Скриншот панели администратора компонента SW JProjects в Joomla 5

Компонент позволяет создать свой собственный каталог расширений Joomla (и не только) и предоставляет возможность скачивания, в том числе с использованием лицензионных ключей. Для разработчиков Joomla есть возможность для каждого расширения указать сервер обновлений, changelog url для отображения изменений прямо в панелях администратора сайтов ваших клиентов.

v.2.0.0. Что нового?

Joomla 5 ready. Сделан большой рефакторинг. Компонент переписан на архитектуру расширений Joomla 5 и работает без плагина обратной совместимости.

Новый дизайн. Для большинства разделов обновлён дизайн. Вы также можете создать свои собственные макеты и выбрать их в настройках компонента.

Оглавление в документации. Теперь при чтении документации вам доступны все разделы, связанные с данным расширением.

Плагины для вставки проекта в контент. Добавлено 2 плагина: контент плагин и плагин кнопки редактора. Контент плагин позволяет превращать non-SEF ссылки вида index.php?option=com_swjprojects... в SEF. А также обрабатывает шорт-коды вида {swjprojects project_id=1 tmpl=your_tmpl_name}. Таким образом вы можете вставлять информацию о проектах везде, где работают плагины контента. Плагин кнопки редактора позволяет легко вставлять ссылки или шорт-коды с выбранным макетом.

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

Страница расширения

GitHub расширения

Joomla Extensions Directory

Теги:
Всего голосов 2: ↑1 и ↓1+2
Комментарии0

Скрипт для отключения расширений, не входящих в ядро Joomla 3 (для обновления на Joomla 5+)

Перед обновлением сайта с Joomla 3 на Joomla 4 и выше нужно обновить все старые расширения до последних (для Joomla 3) версий. Затем отключить их, особенно системные плагины. Это делается для того, чтобы ничто не мешало процессу обновления. Для того, чтобы сделать это быстро - накидал скрипт, который отключает нестандартные расширения в Joomla 3.

➡️ Получить код скрипта (GitHub gist)

Файл disable_non_joomla3_extensions.php нужно положить в папку administrator вашего сайта и перейти по нему в браузере - yoursite.ru/administrator/disable_non_joomla3_extensions.php. Если всё успешно отключилось - выйдет сообщение.

XXX extensions that are not included in the Joomla 3 core have been detected and disabled. Make sure that they are disabled in the Site Admin Panel: Extensions - Extension Manager - Management.

Проверяем работу в менеджере расширений и после этого обновляем Joomla до Joomla 4 с помощью пакета обновлений Joomla 4.0.0. Обновляем Joomla 4 находясь на PHP 7.4 до конца. Меняем базу данных на MySQL 8+ (импорт-экспорт базы), поднимаем PHP до 8.1.

⚠️ Всё это делаем находясь ещё на Joomla 4. Обновиться нужно минимум до Joomla 4.4.0. Только после этого можно обновляться на Joomla 5 пакетом обновления 5.0.0. Затем обновляем все расширения и постепенно включаем их.

Теги:
Всего голосов 4: ↑4 и ↓0+6
Комментарии3

Совет по Joomla: как получать данные из суперглобальных массивов $_POST, $_GET и других?

На основе данных из $_GET, $_POST порой строится логика работы кода начиная от шаблона Joomla и кончая модулями и плагинами. Для работы с этими данными используется объект Input, который мы получаем из Приложения Joomla.

Приведу пример, часто использующийся при разработке шаблонов Joomla

<?php
/** @var \Joomla\CMS\Application\CMSApplication $app */
$app   = Factory::getApplication();
/** @var \Joomla\Input\Input $input */
$input = $app->getInput();

// Имя параметра и его значение по умолчанию
$option   = $input->get('option','');
$view     = $input->get('view', 'category');
$layout   = $input->getCmd('layout', 'edit');
$task     = $input->getString('task', '');
$itemid   = $input->getInt('Itemid', '');

В методе $input->get() 2-й аргумент - это значение по умолчанию на случай, если данных не обнаружено. 3-й аргумент - параметры фильтрации данных - будьте с ним внимательны. Например, вы хотите получить данные, отправленные на ендпоинт в виде JSON.stringify.

<?php
/** @var \Joomla\Input\Input $input */
$input->json->get('title', '', 'RAW')
// ИЛИ
$data = $input->json->getArray();

Если вы уверены, что данные должны быть именно в $_POST и нигде более, то получайте их именно оттуда.

<?php
/** @var \Joomla\Input\Input $input */
$title = $input->post->get('title', '', 'RAW');

Подробнее в файле libraries/vendor/joomla/input/src/Input.php.

Теги:
Всего голосов 1: ↑1 и ↓0+3
Комментарии0

Список устаревших классов ядра Joomla 1.6-3.10 и их современные аналоги в ядре Joomla 5.x

Разработчикам при обновлении расширений на архитектуру Joomla 4 / Joomla 5 нередко не сразу удаётся найти аналоги устаревших методов ядра. Особенно, если под рукой нет современной среды разработки (IDE), например PHP Storm, который подсказывает нужные методы ядра Joomla. Без него, конечно, разработка для Joomla становится непростым делом. В этой статье вы найдете табличку соответствия старых и новых названий PHP классов ядра Joomla и её расширений для того, чтобы быстрее и легче было обновить свои расширения. Эти классы пока что можно использовать в случае, если включён плагин обратной совместимости Joomla 4 / Joomla 5. Но в Joomla 6 или последующих версиях он может быть удалён.

Подробнее: Список устаревших классов ядра Joomla 1.6-3.10 и их современные аналоги в ядре Joomla 5.x.

Теги:
Всего голосов 4: ↑2 и ↓2+2
Комментарии0