WebTolkRu
99 subscribers
618 photos
72 videos
2 files
643 links
Joomla-разработчик. Контрибьютер ядра Joomla. https://web-tolk.ru. Разработка Joomla на заказ. Также пишу в @JoomlaFeed.
@sergeytolkachyov Хабр: https://habr.com/ru/users/sergeytolkachyov/posts/
Download Telegram
Forwarded from Joomla Feed (Sergey Tolkachyov)
Триггеры ядра Joomla при CRUD-операциях

CRUD - аббревиатура основных операций с данными: создание (Create), чтение (Read), изменение (Update) и удаление (Delete). Практически все действия на сайте как в админке, так и пользовательской части можно описать этими действиями. Разработчикам при создании функционала часто в какие-то моменты этих действий нужно проделать некие действия с участием данных или без них.

Как найти нужное событие для своего плагина в Joomla подскажет эта статья.

Читать статью на Хабре

@joomlafeed

#разработка #php #development
👍1
Forwarded from Joomla Feed (Sergey Tolkachyov)
Переменная RETURN или как вернуть пользователя в свой компонент

Нетривиальная задача. Необходимо было из условного компонента «А» отправить пользователя в форму редактирования контента компонента «Б». При этом сделать так, чтобы при нажатии кнопки «Закрыть» в компоненте «Б», пользователь возвращался в компонент «А». Всё вышеописанное происходило в в административной панели сайта.

По условиям задачи автор не мог вносить изменения в компонент «Б», поскольку он поставлялся в пакете с Joomla и любые изменения исчезли бы в момент обновления системы.

Полезная заметка от участника нашего сообщества Владимира Егорова (@sitogon)

Читать заметку

@joomlafeed

#разработка #joomla #php #development
👍1
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. Отдать туда нужно тот же самый массив, который отдавали в предыдущем триггере.

P.S. Выложил текст на сайт + немного дополнил скриншотами.

@webtolkru

#joomla #разработка #php #development #webdev
👍4
👩‍💻 Совет по Joomla: метод debug() для отладки лейаутов

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

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

Лейауты чаще всего рендерятся с помощью классов LayoutHelper или напрямую FileLayout. Писал о них ранее тут и тут.

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

/**
* Method to render a layout with debug info
*
* @param string $layoutFile Dot separated path to the layout file, relative to base path
* @param mixed $displayData Object which properties are used inside the layout file to build displayed output
* @param string $basePath Base path to use when loading layout files
* @param mixed $options Optional custom options to load. Registry or array format
*
* @return string
*
* @since 3.5
*/
public static function debug($layoutFile, $displayData = null, $basePath = '', $options = null)
{
//
}


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

/**
* Получаем параметры баннера
*/
$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'
);


Для тех, кто с php не очень знаком, конструкция со знаком вопроса $wt_custom_menu_item_banner?->pluginlayout говорит о том, что свойства pluginlayout может и не существовать. Оператор Nullsafe (знак вопроса) позволяет не делать проверку.
if ($wt_custom_menu_item_banner?->pluginlayout) {
$layout = $wt_custom_menu_item_banner->pluginlayout;
}

Насколько помню, так можно поступать с объектами начиная с PHP 8.
@webtolkru

#php #development #webdev #joomla
Please open Telegram to view this post
VIEW IN TELEGRAM
👍4
Forwarded from Joomla Feed (Sergey Tolkachyov)
SW JProjects v.2.3.0 - обновление менеджера цифровых проектов для Joomla разработчиков
Компонент позволяет разработчикам сайтов на Joomla вести свой собственный сервер обновлений для своих расширений Joomla (шаблонов, модулей, плагинов etc), что позволяет доносить обновления сразу всем своим клиентам. Возможность скачивания по лицензионным ключам.

👩‍💻 v.2.3.0. Что нового?
Поле домен для ключа. В форму создания ключа добавлено поле домен. Поле хранится в отдельной ячейке таблицы базы данных.
Новый раздел: ключи пользователя. Во фронтенд добавлен новый раздел - ключи пользователя. Вы можете создать пункт меню для пользователя, где он сможет увидеть список всех своих лицензионных ключей. Раздел доступен только авторизованным пользователям сайта.
Мелкие исправления и рефакторинг. Несколько мелких исправлений ошибок и улучшений.

Страница расширения
GitHub расширения
Joomla Extensions Directory

@joomlafeed

#расширения #joomla #php #разработка #development
Please open Telegram to view this post
VIEW IN TELEGRAM
👍3
Выбор типов файлов (не только изображений) для пользовательских полей Joomla

В Joomla можно создать пользовательское поле типа media для материалов, категорий, контактов и любых других компонентов, которые поддерживают функционал создания пользовательских полей. Если разработчик создаёт это поле в XML-коде, то можно указать допустимые для выбора типы файлов: images (все картинки), documents (pdf, docx и т.д.), audios (mp3 и т.д.), videos (mp4, webm и т.д.). Однако, если создавать это поле из админки, то оно позволяет выбрать только картинки. Поэтому многие пользовались сторонними плагинами полей или файловыми браузерами.

Я добавил функционал указания типа поля (на скриншоте) и сделал Pull Request в ядро. Если в Joomla добавят этот функционал, то можно будет указывать тип выбираемых файлов. Если вы выберете файл типа document, то снаружи будет отрендерена ссылка на файл. Если audio или video - то будет отрендерен HTML5 плеер. Естественно, что в своих переопределениях можно будет творить вообще всё что угодно. Главное, чтоб админка позволяла выбрать не только картинки.

Однако, при тестировании зарубежные коллеги нашли баг, который напрямую не связан с моим кодом, но тем не менее (с их точки зрения) он мешает включению кода в состав ядра. А именно метод MediaHelper::getMimeType() выкидывает PHP warning о том, что не найден файл. Ошибка возникает на файлах НЕ-картинках. Однако, я не смог воспроизвести проблему ни на windows-машине, ни на linux.

Я очень надеялся, что успею и новинку внедрят уже в Joomla 5.3 (выйдет в апреле 2025), но её перекинули в ветку Joomla 6.0 (выйдет в октябре 2025).

👩‍💻 Поэтому прошу у участников сообщества помощи с тестированием. Всё обсуждение, скриншоты и инструкции по тестированию находятся на GitHub Joomla.

Joomla GitHub: Add file types for media custom field plugin. #45013

#joomla #php #разработка #github #development #community
Please open Telegram to view this post
VIEW IN TELEGRAM
👍4❤11
Forwarded from Joomla Feed (Sergey Tolkachyov)
SW JProjects v.2.4.0 - обновление менеджера цифровых проектов для Joomla разработчиков

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

👩‍💻 v.2.4.0. Что нового?
Плагин логирования действий пользователя. Добавлен плагин группы Лог действий, записывающий все основные действия пользователя в компоненте SW JProjects в лог действий пользователя.
Мультиязычность. Улучшена работа компонента (панель администратора) на мультиязычных сайтах.
Исправление ошибок и рефакторинг. Проведен текущий рефакторинг и исправление некоторых ошибок.

Страница расширения
GitHub расширения
Joomla Extensions Directory

@joomlafeed

#расширения #joomla #php #разработка #development
Please open Telegram to view this post
VIEW IN TELEGRAM
👍2
Продолжаю делать библиотеку для двухсторонней интеграции AmoCRM и Joomla. Сделано очень много всего, описывать в документации придётся долго.
Краткий список:
- Глобальный рефакторинг. Почти всё переписано с нуля
- Новые методы.
- поддержка новых сущностей AmoCRM
- внедрение триггера onAmocrmIncomingWebhook для плагинов на входящие вебхуки
- WebhookEvent класс с методами на получение данных из вебхуков
- двухсторонняя синхронизация пользователей Joomla и контактов AmoCRM
- если нет email у пользователя - создаём временный контакт
- новые поля с данными AmoCRM для Joomla Form
- поля Joomla Form используют Joomla layouts, что даёт возможность переопределять макеты или управлять ими программно

🙏 Нужна помощь тестеров.

➡️ Новая версия библиотеки доступна в dev-ветке репозитория на GitHub.
⚠️ Это НЕ стабильный релиз. Не рекомендую использовать на боевых сайтах.

#joomla #php #development #разработка #amocrm
Please open Telegram to view this post
VIEW IN TELEGRAM
❤3
This media is not supported in your browser
VIEW IN TELEGRAM
👩‍💻 Совет по Joomla: подсказки в поле-разделителе (тип spacer).
В своих расширениях мы делим простыню настроек на группы и логические блоки. Для этого можно использовать филдсеты, а порой можно обойтись и визуальным разделением на блоки. Для этого есть поле разделителя - type="spacer".

Оно обычно ничего не выводит - пустоту. Или если задать ему атрибут hr="true" - горизонтальную линию. Сегодня полюбопытствовал и оказалось, что оно может выводить не только свой label, но и подсказки к нему в виде Bootstrap popover.
<field type="spacer"
label="Заголовок поля Spacer"
class="h3"
description="Атрибут description. Тут можно какой-то текст из языковых констант Joomla."
/>

При этом, если атрибут hr="true" всё-таки стоит, то у него приоритет и вы ничего не увидите.

@webtolkru

#joomla #разработка #webdev #development
Please open Telegram to view this post
VIEW IN TELEGRAM
👍2
Forwarded from Joomla Feed (Sergey Tolkachyov)
👩‍💻 Совет по Joomla: несколько значений по умолчанию в XML-формах для стандартных полей типа list.
При работе над плагином возникла необходимость указать стандартный набор из нескольких элементов стандартного поля списка. И хотелось указать их в стандартном же атрибуте default для полей.

❓ Когда это нужно?
Когда Ваши пользователи устанавливают плагин и НЕ заходят в настройки - в коде вы можете использовать значения по умолчанию с помощью класса Registry (писал об этом ранее) и всегда быть уверенным, что хоть какие-то жизненно необходимые параметры к вам придут всегда.

🧐 Но как сделать то же самое для интерфейса админки?
Пользователя нужно направлять, предлагать очевидный работоспособный сценарий для начала, а дальше он уже сам разберется. Когда человек заходит в параметры свежеустановленного плагина в Form ещё нет данных и параметры по умолчанию выставляются из атрибутов default в xml-полях.
<field name="showdesc" type="radio"
label="PLG_CFI_PARAM_SHOWDESC"
class="btn-group btn-group-yesno"
default="1">
<option value="0">JNO</option>
<option value="1">JYES</option>
</field>

Здесь по умолчанию будет включено "Да". И если пользователь не переключит параметр, то при сохранении мы ожидаемо получим "да" в params плагина.
Для поля списков type="list" можно указать значение по умолчанию и многие знают, что его можно указать только одно.
<field type="list"
name="article_fields"
label="article_fields"
description="article_fields_desc"
layout="joomla.form.field.list-fancy-select"
multiple="true"
default="id"
>
<option value="id">id</option>
<option value="title">title</option>
<option value="alias">alias</option>
<option value="introtext">introtext</option>
<option value="fulltext">fulltext</option>
<option value="state">state</option>
</field>

Но у нас поле с множественным выбором (атрибут multiple) и хотелось бы указать несколько значений по умолчанию...
Оказывается, так можно сделать. Для этого в атрибуте default нужно указать json с нужными параметрами в виде {int}key : {string} value.
Например, default='{"0":"id","1":"title"}'.
<field type="list"
name="article_fields"
label="article_fields"
description="article_fields_desc"
layout="joomla.form.field.list-fancy-select"
multiple="true"
default='{"0":"id","1":"title"}'
>
<option value="id">id</option>
<option value="title">title</option>
<option value="alias">alias</option>
<option value="introtext">introtext</option>
<option value="fulltext">fulltext</option>
<option value="state">state</option>
</field>

⚠️ Обратите внимание на кавычки! Поскольку json_decode не понимает одинарные кавычки собственно json нужно писать с двойными, а значение для атрибута default писать в одинарные.

🙏 За подсказанное решение огромное спасибо участникам нашего сообщества - разработчикам Дмитрию Васюкову (@fictionlabs) и Игорю Бердичевскому (@septdir).

@joomlafeed

#joomla #разработка #webdev #development
Please open Telegram to view this post
VIEW IN TELEGRAM
👍3🔥3
WT JSwiper - SWiper.js для Joomla-разработчиков v.12.0.3.
Вышел релиз плагина веб-ассета для Joomla 4+, подключающий swiper.js в вашу Joomla.

На скриншоте не лого Swiper потому, что сборку плагина теперь автоматизировал на GitHub Actions. Тут хорошо так помог ИИ Qwen. Новые версии плагина теперь должны появляться сами. Собранные бандлы css и js тянутся с jsdelivr по ссылкам пока что, там может и до полноценной сборки доберусь. Ссылку на GitHub репозиторий поменял на свой.

Страница расширения
GitHub расширения (новый, с автосборками)

@webtolkru

#joomla #js #webdev #development #разработка

😢 И грустная новость: на ладан дышит мой терабайтник WD, прослуживший около 7 лет. Там лежит примерно 2/3 рабочих файлов от клиентов. Ну и всякое личное: distrib, фото/видео. Он ещё подаёт признаки жизни, так что будем надеяться - успею всё скопировать...
👍3
👩‍💻 Совет по Joomla: замена File::append() в Joomla 6.
В Joomla постепенно, хоть порой и непоследовательно, убирают старое API, доставшееся в наследство от CMS и заменяют его на API от Joomla Framework. При этом порой не обходится без потерь. Многие классы и методы ядра годами имеют статус deprecated, многим имеется альтернатива.

Такими классами являются классы для работы с файловой системой сервера Joomla\CMS\Filesystem. Они перемещены в плагин обратной совместимости Joomla 6 и могут ещё работать. Но лучше постепенно переходить на новые методы, а в новых расширениях использовать их сразу.
Одним из "пострадавших" методов стал File::append(), который добавлял содержимое в конец файла. Это обёртка для file_put_contents() с разными проверками, использованием потоков, если надо и т.д. Заменой для этого метода станет File::write() с флагом appendToFile.
Параметры метода
- string $file – Абсолютный путь к файлу
- string $buffer – Содержимое
- bool $useStreams false – Использовать потоки
- bool $appendToFile false – дописывать ли в конец или перезаписывать файл
use Joomla\Filesystem\File;

$absoluteFilePath = JPATH_SITE . '/dir/file.txt';
$content = 'Содержимое файла';

// appentToFile - 4-й аргумент
File::write($absoluteFilePath, $content, false, true);

Либо с PHP 8.0 можно использовать именованные аргументы, и тогда не важен их порядок и наличие необязательных.
use Joomla\Filesystem\File;

$absoluteFilePath = JPATH_SITE . '/dir/file.txt';
$content = 'Содержимое файла';

//Именованные аргументы, appentToFile теперь 3-й аргумент
File::write(file: $absoluteFilePath, buffer: $content, appendToFile: true);

Класс находится в libraries/vendor/joomla/filesystem/src/File.php. Кстати, для некоторых удалённых методов теперь нужно использовать нативные функции php.
- вместо Folder::exists() ➡️ is_dir()
- вместо File::exists() ➡️ is_file() или file_exists()

@webtolkru

#joomla #php #webdev #разработка #development
Please open Telegram to view this post
VIEW IN TELEGRAM
👏4
Написал 2 страницы документации для библиотеки интеграции #joomla с #amocrm. В раздел с описанием установки добавил про долгосрочные токены AmoCRM.
- Установка библиотеки в Joomla
- Входящие вебхуки из AmoCRM в Joomla
- Создание плагина для обработки вебхуков AmoCRM в Joomla

@webtolkru

#php #crm #webdev #development #разработка
👍8
👩‍💻 Совет по Joomla: Удалить ключ из многомерного массива.
Допустим есть у нас массив с объектами вида:
Array
(
[0] => stdClass Object
(
[value] => 94
[text] => Категория 1
[level] => 1
[params] => {"category_layout":"","image":"","image_alt":""}
[published] => 1
[lft] => 9
[language] => *
)

Элементов в нём штук 100 и нужно нам его почистить от params. Не писать же цикл или array_map() или array_walk()... Для этой работы можно воспользоваться классом \Joomla\Utilities\ArrayHelper (файл vendor/joomla/utilities/src/ArrayHelper.php). Там немало интересного есть. Но нас интересует метод dropColumn().
use Joomla\Utilities\ArrayHelper;

// ...где-то в классе поля, в getOptions()
// получили массив с опциями
$options = array_merge(parent::getOptions(), $options);

// и удалили у них лишний params
$options = ArrayHelper::dropColumn($options, 'params');


@webtolkru

#joomla #php #разработка #development #webdev
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥2
👩‍💻 [ВИДЕО] AmoCRM + Joomla: быстрая настройка интеграции. Библиотека WT AmoCRM.
Как быстро настроить интеграцию AmoCRM и сайта на Joomla? - использовать PHP библиотеку WT AmoCRM для Joomla, которая предполагает использование её разработчиками. А разработчики могут написать любое количество плагинов и решений по интеграции и автоматизации AmoCRM и Joomla.

Смотреть на:
- Youtube
- Rutube
- VK Видео

👩‍💻 Содержание:
00:15 - что такое эта библиотека и как она работает? Тех.ликбез.
03:00 - установка с сайта или с GitHub
04:00 - собственно установка и настройка интеграции.
05:10 - создание внешней интеграции в интерфейсе AmoCRM
08:05 - что-то пошло не так... Почему и как исправить (случай с пересозданием интеграции)
08:48 - успешное подключение к AmoCRM
11:11 - как понять что всё работает?
11:50 - демонстрация работы: отправка заказа из компонента интернет-магазина RadicalMart в AmoCRM
14:20 - потенциальные возможности по автоматизации бизнес-процессов в связке Joomla с AmoCRM

Скачать с сайта
Скачать с GitHub

Есть ряд готовых решений для интеграции:
- JoomShopping - Joomla компонент интернет-магазина
- RadicalMart - Joomla компонент интернет-магазина
- RadicalForm - Joomla плагин формы обратной связи

@webtolkru

#joomla #crm #amocrm #php #разработка #webdev #development
Please open Telegram to view this post
VIEW IN TELEGRAM
👍3
This media is not supported in your browser
VIEW IN TELEGRAM
👩‍💻 Совет по Joomla: использовать выключенное состояние для кнопок в списках элементов админки - listCheck().
Мы добавляем в тулбар панели администратора Joomla некую кнопку, которая что-то делает со списком id выделенных элементов и ajax-запросом отсылаем их в свой плагин. Но нам надо предупредить нажатия на кнопку в тех случаях, когда ни один элемент не был выбран. Для этого можно написать свою проверку на js. А можно воспользоваться встроенной в Joomla.

Добавить кнопку в тулбар Joomla.
use Joomla\CMS\Toolbar\Button\BasicButton;
use Joomla\CMS\Language\Text;

// ниже по коду, где-нибудь в onAfterDispatch()
// Предварительно проверяем в каком компоненте мы находимся по option из $app->getInput()
// пример из плагина, поэтому $this->getApplication()
$app = $this->getApplication();
// Берём текущий тулбар
$toolbar = $app->getDocument()->getToolbar('toolbar');

// Создаём кнопку
$button = (new BasicButton('send-to-indexnow'))
->text(Text::_('PLG_WTINDEXNOWSWJPROJECTS_BUTTON_LABEL'))
->icon('fa-solid fa-arrow-up-right-dots')
->onclick("window.wtindexnowswjprojects()");
// Добавляем кнопку в тулбар
$toolbar->appendButton($button);

Заблокировать кнопку тулбара Joomla, если не выбраны элементы списка.
Теперь нам надо проверить находимся ли мы в списке. Делаем это по view из $app->getInput()
if(in_array($app->getApplication()->getInput()->get('view'), ['categories','documentation','projects','versions'])) {
$button->listCheck(true);
}

И если мы в списке - используем метод listCheck(true), который сделает проверку за нас. Если ни один элемент не выбран - кнопка в тулбаре Joomla будет заблокирована и JS-обработчик не будет вызван.

#joomla #php #разработка #development
Please open Telegram to view this post
VIEW IN TELEGRAM
👍2
Media is too big
VIEW IN TELEGRAM
Отладка. Встретилось как-то выражение:
за 10% времени сделать 90% задачи и 90% времени делать оставшиеся 10%

Вот это то, что у меня сейчас.

@webtolkru

#joomla #php #development #разработка
💯1
👩‍💻 Особенность Joomla: json-значения для пользовательских полей и их рендер в subform и вне дочерней формы.

Опять длинное название, но куда уж без этого...

Итак, если вы делаете плагин пользовательского поля - его можно использовать через FieldsHelper. И в процессе ваши данные проходят через различные этапы обработки (недавно был пост+статья на эту тему). И может так оказаться, что ваше поле хранит в rawvalue json (и в базе данных соответственно тоже), а в value вы на его основе рендерите значение. Это стандартный подход Joomla. Так работают, например, поля accessiblemedia. Однако, если вы поместили ваше поле в дочернюю форму (пользовательское поле типа subform и включили "Рендеринг значений = Да", то у вашего замечательного поля может появиться поломанный Json в value вместо нормального значения.
Например:
{&quot;basePath&quot;:&quot;...&quot;,&quot;layout&quot;:&quot;...&quot;}

❓ Что там под капотом Joomla происходит?

1. В обычном потоке Joomla сначала вызывает событие onCustomFieldsBeforePrepareField, а потом onCustomFieldsPrepareField.
2. Внутри subform же для подполей при render_values=1 вызывается только событие - onCustomFieldsPrepareField.
3. Если преобразование значения (например, json_decode) сделано в вашем плагине только в beforePrepareField, оно не обработает данные для подполя и...
4. В шаблоне поля строка заэкранируется (htmlentities), кавычки превратятся в тыкву в &quot; и вы получите кривой json, вместо вашего значения

👉 Собственно полезный совет по Joomla:
Для полей, которые могут жить внутри subform, делайте нормализацию значения и в onCustomFieldsPrepareField тоже, не только в beforePrepareField.

@webtolkru

#joomla #webdev #разработка #php #development
Please open Telegram to view this post
VIEW IN TELEGRAM
👍4
👩‍💻 Как работать с меню компонента в админке Joomla с помощью preset.xml и плагина.
У компонента Joomla есть несколько уровней присутствия в панели администратора. Самый простой уровень создаётся установщиком компонента: если в манифесте есть <administration><menu>...</menu></administration>, Joomla добавит пункт в защищённый администраторский menutype=main. Но этого часто мало. Нормальному компоненту нужны группы ссылок, быстрые действия, ссылки на категории, поля, workflow, дашборд, отдельные наборы пунктов для разных административных модулей и возможность добавлять или скрывать пункты динамически.
Для этого в Joomla 6.1 используется механизм пресетов меню.

Как работать с preset.xml и модифицировать меню админки с помощью плагина - в этой статье.

Читать статью

@webtolkru

#joomla #development #разработка #php
Please open Telegram to view this post
VIEW IN TELEGRAM
👍2