Например, при создании способа доставки вы хотите показывать "дня", "дней" в зависимости от количества дней: "3 дня", но "5 дней".
Для этого воспользуйтесь методом
Text::plural() в Joomla.PHP файл:
use Joomla\CMS\Language\Text;
// Сколько дней будет идти посылка
$period_max = 5;
/**
* Подключаем файл с языковыми константами для вывода "дней" в падежах
*/
$lang = Factory::getApplication()->getLanguage();
// Системное имя расширения
$extension = 'lib_webtolk_libraryname';
// JPATH_SITE для языковых файлов фронтенда
$base_dir = JPATH_SITE;
// Код языка
$language_tag = 'ru-RU';
// Принудительная загрузка указанного языка
$reload = true;
// Загружаем все языковые константы из файла локализации
$lang->load($extension, $base_dir, $language_tag, $reload);
?>
Срок доставки: <?php echo $period_max .' '.Text::plural('WT_SHIPPING_DAY', $period_max); ?>
Для того, чтобы это работало - ваше расширение должно иметь локализацию (языковые файлы) по канонам Joomla.
Языковой *.ini файл (локализация):
WT_SHIPPING_DAY_0 = "дней"
WT_SHIPPING_DAY_1 = "день"
WT_SHIPPING_DAY_2 = "дня"
WT_SHIPPING_DAY_MORE = "дней"
#joomla #php #cookbook #dev #web #wevdev
@webtolkru
Please open Telegram to view this post
VIEW IN TELEGRAM
👍3
Лайфхак, который можно использовать, когда необходимо выполнить произвольный PHP-код в Joomla - это сделать свой макет для модуля HTML-код (
mod_custom). Удалить в нём всё, что предлагает Joomla и поместить свой код. В панели администратора же создать модуль, выбрать для него свой макет и... оно работает, но ещё дополнено функциональностью Joomla (привязка к пунктам меню, уровням доступа и языкам). И выводить можно где угодно: в модульной позиции или с помощью шорт-кодов
{loadmoduleid XXX} или {loadposition position_name}.#php #joomla #development #webdev #разработка #cookbook
Please open Telegram to view this post
VIEW IN TELEGRAM
👍3
При работе с кодом хорошим тоном разработки считается наглядность кода, которая обеспечивает лёгкость его восприятия. Обычно это называют "чистый, читаемый код". Согласитесь, понимать следующую запись не всегда бывает удобно:
echo '<a href="index.php?option='.$option.'&view='.$view.'&id='.$id.'" target="'.$target.'">'.$link_title.'</a>';
или пример из стандартного шаблона JoomShopping:
<a class="lightbox" id="main_image_full_<?php print $image->image_id?>" href="<?php print $this->image_product_path?>/<?php print $image->image_full;?>" <?php if ($k!=0){?>style="display:none"<?php }?> title="<?php print htmlspecialchars($image->img_title)?>">Наглядностью и лёгкостью чтения, к сожалению, и не пахнет.
В API Joomla есть довольно богатый инструмент - класс HTMLHelper. В нём довольно много полезных фич, приведу пример для рендера ссылок как самого простого элемента. Метод
HTMLHelper::link() принимает 3 аргумента:- $url - формируем его программно заранее и передаем как параметр
- $text - собственно текст ссылки. Это может быть любое HTML-содержимое: картинка, код и т.д. - как в вёрстке.
- $attribs - самые разные атрибуты ссылки:
class, target, onclick, кастомные data-атрибуты и т.д.Согласитесь, так гораздо нагляднее. И порядок в коде.
use Joomla\CMS\HTML\HTMLHelper;
$url = 'index.php?option=' . $option . '&view=' . $view . '&id=' . $id;
$link_title = HTMLHelper::image('images/headers/raindrops.jpg', 'Alt attrib for image');
$target = '_blank';
$linkAttribs = [
'target' => $target,
'class' => 'btn btn-primary',
'onclick' => 'alert(123);',
'data-link-id' => '4a5d7f6a455sf8',
];
echo HTMLHelper::link($url, $link_title, $linkAttribs);
Частично ознакомиться с методами класса HTMLHelper можно в файле
libraries/src/HTML/HTMLHelper.php.#joomla #php #development #разработка #html #cookbook
Please open Telegram to view this post
VIEW IN TELEGRAM
❤2🙏1
В состав Joomla Framework, вошедшего под капот Joomla 4+, входят некоторые компоненты Symfony, среди которых и VarDumper.
Соответственно в Joomla 4 / Joomla 5 можно использовать вместо
var_dump() следующее:use Webtolk\Cdekapi\Cdek;
$cdek = new Cdek();
$cities = $cdek->getLocationCities(['page'=>'1']);
dump($cities);
dd($cities);
dump() может показывать структуру массива/объекта сворачиваемыми уровнями.
dd() - это dump & die. После дампа дальнейшее выполнение кода остановится с помощью
exit().#joomla #development #php #разработка #symfony #cookbook
Please open Telegram to view this post
VIEW IN TELEGRAM
👍2🙏1
В API Joomla есть довольно богатый инструмент - класс HTMLHelper. С его помощью можно выводить различные HTML-элементы с нужными параметрами: модальные окна, аккордеоны, табы, изображения и т.д.
Наглядности и чистоты кода ради стоит использовать этот метод, дабы не делать бесконечную конкатенацию HTML с PHP кодом и не потерять глаза в поисках утерянной кавычки.
Самый простой способ рендера изображений - с 2-мя аргументами:
- $img - путь к изображению
- $alt - текст для атрибута alt изображения
3-й необязательный параметр - массив или строка с атрибутами изображения:
class, title, различные data-атрибуты, onclick, loading и т.д. Я предпочитаю удобно и наглядно собрать атрибуты в массив, использовать условия в PHP, а не HTML коде.use Joomla\CMS\HTML\HTMLHelper;
$img_src = 'images/banner.webp';
$img_attribs = [
'loading' => 'lazy',
'class'=>'img-fluid',
'data-custom-attr'=>'your-custom-data-attr-value',
'title'=> 'Title attribute for image'
];
echo HTMLHelper::image($img_src,'Alt text for image', $img_attribs);
Если изображение найдено - получим HTML-разметку
<img src="..."/> с нашими данными. Если не найдено - null.Ещё 2 параметра, которые используются реже и связаны с одной из главных фишек Joomla - функционалом переопределений.
$relative bool - 4-й параметр, логический флаг относится ли данный путь к media-файлам шаблона. На примере шаблона Cassiopeia: в вашем шаблоне есть папка
images, где лежат какие-то картинки. Путь к этим картинкам довольно длинный: media/templates/site/cassiopeia/images/banners/banner.jpg. Если вы укажете параметр relative как true, то можно передать в HTMLHelper::image(), просто banners/banner.jpg, а остальное Joomla добавит сама. Так читабельнее. Но на этом фишки не закончились. Если вы сделали дочерний шаблон и в нём переопределили картинку, то Joomla автоматически будет искать переопределенные картинки и показывать нужную.
Пример: на одном пункте меню основной шаблон, а на другом - дочерний шаблон. В дочерний помещаем только те файлы, которые хотим изменить, остальные берутся из основного. То есть мы можем не копировать и не изменять
index.php файл основного шаблона, чтобы указать новую картинку, а просто положить её в папку с дочерним шаблоном. Теперь при переходе на 2-й пункт меню будет показываться переопределенная картинка из актуального шаблона, хотя вы как передавали путь banners/banner.jpg так и передаёте.И последний параметр - $returnPath integer. По умолчанию - 0.
Если
$returnPath = -1 - метод вернёт HTML-разметку без поиска переопределений. Если $returnPath = 0 - вернёт разметку с поиском переопределений. Если $returnPath = 1 - возвращает только путь, без разметки. То есть вы передали banners/banner.jpg, а получите /media/templates/site/cassiopeia/images/banners/banner.jpg для основного шаблона и /media/templates/site/cassiopeia_test/images/banners/banner.jpg для дочернего.@webtolkru
#joomla #development #php #html #разработка #cookbook
Please open Telegram to view this post
VIEW IN TELEGRAM
❤1
В Joomla 4 и Joomla 5 у каждого расширения должно быть указано своё пространство имён -
namespace, кроме, пожалуй, пакетов и файлов. Даже у шаблонов может быть свой namespace. После каждой установки, обновления, удаления расширения инсталлер Joomla вызывает перегенерацию карты namespaces. А эта карта в свою очередь используется при работе Приложения. Если в неё что-то не попало, но при этом найдены файлы с указанием отсутствующего в карте namespace - возникает ошибка An error has occurred. Class [имя класса] not found.Поэтому нужно руками удалить файл
administrator/cache/autoload_psr4.php. Тогда Joomla обновит карту неймспейсов и всё будет ок. Если ок не стало - нужна более серьёзная отладка.@webtolkru
#development #php #joomla #разработка #cookbook
Please open Telegram to view this post
VIEW IN TELEGRAM
👍1
В Joomla развитая система плагинов. Во время работы Приложения Joomla в разные моменты его жизненного цикла вызываются разные события. Эти события "слушают" плагины, получают данные для работы и возвращают их обратно, если это необходимо или выполняют любую необходимую в данный момент времени работу.
Плагины группы
system вызываются всегда и раньше, чем плагины конкретных групп. Если ваш плагин работает всегда и везде и решает разные задачи в разных местах сайта - делаем системный плагин, но учитываем, что к нему будет обращение даже тогда, когда он не нужен. Плагины конкретных групп вызываются в определенный момент времени, в определенном контексте и не создают дополнительную нагрузку, так как необходимый код выполняется только в нужный момент времени. Но это накладывает определенные ограничения и порой нужно создавать 2-3 плагина, которые можно было бы объединить в одном системном.
@webtolkru
#разработка #development #joomla #php #cookbook
Please open Telegram to view this post
VIEW IN TELEGRAM
При построении url в коде можно собрать всё строками с конкатенацией вида
$url = $domain.'/index.php?option='.$option.'&view='.$view.'¶m1='.$value1;
и для небольших строк это может быть даже и удобно. Но если параметров много или они требует стандартизации/чистки в процессе, то уже не все так удобно и очевидно. Например, в части url может быть ведущий слеш (слеш в начале фрагмента url) и пришедший домен для запроса тоже может оканчиваться на слеш - и вот мы получаем некорректный url для запроса с двойным слешем где-нибудь в середине...
Для задач стандартизации и единообразия получения url в Joomla есть класс
Joomla\Uri\Uri. Раньше, с Joomla 1.6 и старше он назывался JUri. Этот класс обеспечивает работу с url по стандарту RFC3986 и берет на себя работу по разбору url на запчасти или по сборке url из запчастей ))Пример: получить конкретный параметр из url.
use Joomla\Uri\Uri;
$url = 'https://web-tolk.ru/dev/biblioteki?param=value';
$uri = new Uri($url);
// здесь выведет строку 'value'
echo $uri->getVar('param');
Да, есть же нативная PHP функция
parse_url, скажете вы... Но класс Uri обеспечивает безопасную работу с UTF-8 в url, в том числе с кириллическими доменами. Дабы не писать различные проверки самостоятельно - можно воспользоваться возможностями ядра Joomla.Как собрать нужный url
Тут тоже все просто:
use Joomla\Uri\Uri;
$uri = new Uri;
$uri->setHost('web-tolk.ru');
$uri->setScheme('https');
// setPath() начинаем со слеша
$uri->setPath('/dev/biblioteki');
// GET-параметры можно передать массивом
$vars = [
'param1' => 'value1',
'param2' => 'value2',
'param3' => 'value3',
];
$uri->setQuery($vars);
// выводим в строку наш url
echo $uri->toString();
Иерархия классов Uri в Joomla сделана так, что методы-геттеры находятся в классе
AbstractUri, а сеттеры - в классе Uri. Сеттеры можно посмотреть в файле libraries/vendor/joomla/uri/src/Uri.php. Геттеры смотрим в файле libraries/vendor/joomla/uri/src/AbstractUri.php. Если у вас есть PHP Storm, то он прекрасно знает Joomla и подсказывает всё, что нужно.
Ну и можно дать ссылку на страницу старой документации, которая до сих пор в большей своей части актуальна с поправкой на использование неймспейсов.
@webtolkru
#разработка #joomla #php #development #cookbook
Please open Telegram to view this post
VIEW IN TELEGRAM
❤1
Нередко расширения Joomla в готовом виде состоят из пакета - комплекта плагинов, модулей, библиотек. Расширения из одного пакета могут нуждаться в одном и том же методе и раньше было несколько путей:
- копировать код везде (выкидываем принцип DRY - don't repeat yourself)
- делать простой трейт в одном плагине и обращаться к нему (в Joomla 3 так обычно не делали)
- делать библиотеку отдельным расширением пакета. Но как-то странно так заморачиваться ради одного метода
В Joomla 4 и старше новая (хм-м, 2 года уже прошло...) архитектура плагинов позволяет обращаться к методам плагина откуда угодно.
use Joomla\CMS\Factory;
// Указываем группу плагина и element
$myPlugin = Factory::getApplication()->bootPlugin('system','myplugin');
// И вызываем нужный нам метод плагина "Сделать хорошо"
$result = $myPlugin->doItWell();
Такой подход можно использовать везде: в компонентах, плагинах, библиотеках, модулях и т.д. Например, если в настройках компонента можно переключить источник данных - плагин-провайдер, то один путь - триггерить событие для группы этих плагинов. А можно вызвать нужный метод напрямую.
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);
}
@webtolkru
#разработка #joomla #php #development #cookbook
Please open Telegram to view this post
VIEW IN TELEGRAM
👍2
Forwarded from Joomla Feed (Sergey Tolkachyov)
Наткнулся на пост в одном из php-шных каналов о том, как в Laravel можно использовать нотацию "точка" для доступа к значениям вложенных массивов. И тем самым упростить доступ к многомерным массивам с помощью одной строки, разделенной точками.
use Joomla\Registry\Registry;
$data = [
'user' => [
'name' => 'John Doe',
'email' => 'john@example.org',
]
];
$data = new Joomla\Registry\Registry($data);
$name = $data->get('user.name');
dump($name);
Облегчите себе жизнь, работая с Joomla 😎.
Подпишись на @joomlafeed
#joomla #разработка #php #cookbook
Please open Telegram to view this post
VIEW IN TELEGRAM
👍3❤1
Автоматическое подключение локализации для веб-ассета в Joomla
Начиная с Joomla 4 в ядре реализована концепция веб-ассетов. Управление JavaScript и CSS в Joomla значительно упростилось благодаря классу WebAssetManager. Есть замечательная статья Дмитрия Рекуна (@drekun) Как правильно подключать JavaScript и CSS в Joomla 4, в которой подробно и с примерами кода рассказывается об этой концепции и её применении. Например, в web asset мы можем оформить какую-нибудь готовую js-карусель или библиотеку.
Также можно оформить веб-ассетом и свой собственный js-скрипт, которому могут понадобиться дополнительные данные для работы на странице: как данные из PHP, так и языковые константы. С помощью WebAssetManager мы можем получить эти данные в момент сразу при подключении ассета. Как это сделать?
Читаем в посте на Хабре
Подпишись на @joomlafeed
#joomla #php #разработка #cookbook
Начиная с Joomla 4 в ядре реализована концепция веб-ассетов. Управление JavaScript и CSS в Joomla значительно упростилось благодаря классу WebAssetManager. Есть замечательная статья Дмитрия Рекуна (@drekun) Как правильно подключать JavaScript и CSS в Joomla 4, в которой подробно и с примерами кода рассказывается об этой концепции и её применении. Например, в web asset мы можем оформить какую-нибудь готовую js-карусель или библиотеку.
Также можно оформить веб-ассетом и свой собственный js-скрипт, которому могут понадобиться дополнительные данные для работы на странице: как данные из PHP, так и языковые константы. С помощью WebAssetManager мы можем получить эти данные в момент сразу при подключении ассета. Как это сделать?
Читаем в посте на Хабре
Подпишись на @joomlafeed
#joomla #php #разработка #cookbook
👍2