webdev

  • Как тестировать Joomla PHP-разработчику? Компонент Patch tester.

    👩‍💻 Как тестировать Joomla PHP-разработчику? Компонент Patch tester.Joomla - open source PHP-фреймворк с готовой админкой. Его основная разработка ведётся на GitHub. Для того, чтобы международному сообществу разработчиков было удобнее тестировать Pull Requests был создан компонент Patch Tester, который позволяет "накатить" на текущую установку Joomla именно те изменения, которые необходимо протестировать. На стороне инфраструктуры Joomla для каждого PR собираются готовые пакеты, в которых находится ядро + предложенные изменения. В каждом PR обычно находятся инструкции по тестированию: куда зайти, что нажать, ожидаемый результат. Тестировщики могут предположить дополнительные сценарии, исходя из своего опыта и найти баги, о которых сообщить разработчику. Или не найти, и тогда улучшение или исправление ошибки быстрее войдёт в ядро Joomla. Напомню, что для того, чтобы PR вошёл в ядро Joomla нужны минимум 2 положительных теста от 2 участников сообщества, кроме автора.

    Видео на VK ВидеоВидео на RuTubeКомпонент на GitHub https://github.com/joomla-extensions/patchtester@joomlafeed#joomla #php #webdev #community

  • Совет по Joomla: использовать выключенное состояние для кнопок в списках элементов админки

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

    Как это сделать - читаем в посте на Хабре.

  • Совет по Joomla: несколько значений по умолчанию в XML-формах для стандартных полей типа list

    При работе над плагином возникла необходимость указать стандартный набор из нескольких элементов стандартного поля списка. И хотелось указать их в стандартном же атрибуте default для полей.

  • Как триггерить события для плагинов на манер Joomla 5+?В Joomla 6 должны удалить метод...

    Как триггерить события для плагинов на манер Joomla 5+?В Joomla 6 должны удалить метод...

    👩‍💻 Как триггерить события для плагинов на манер Joomla 5+?В Joomla 6 должны удалить метод triggerEvent(), с помощью которого раньше вызывались события для плагинов. Теперь чтобы в своём коде вызвать событие для плагина и получить от него результаты нужно:- создать объект класса события- передать в него параметры

    use Joomla\CMS\Event\AbstractEvent;use Joomla\CMS\Factory;use Joomla\CMS\Plugin\PluginHelper;// Грузим плагины нужных группPluginHelper::importPlugin('system');// Создаём объект события$event = AbstractEvent::create('onAfterInitUniverse', [    'subject' => $this,    'data'    => $data, // какие-то данные    'article' => $article, // ещё материал вдовесок    'product' => $product, // и товаров подвезли]);// Триггерим событиеFactory::getApplication()->getDispatcher()->dispatch(    $event->getName(), // Тут можно строку передать 'onAfterInitUniverse'    $event);// Получаем результаты// В случае с AbstractEvent это может быть не 'result',// а что-то ещё - куда сами отдадите данные.// 2-й аргумент - значение по умолчанию, // если не получены результаты$results = $event->getArgument('result', []);
    Плюсы такого подхода - вам не нужно запоминать порядок аргументов и проверять их наличие. Если вы написали свой класс события, то в плагине можно получать аргументы с помощью методов $event->getArticle(), $event->getData(), $event->getProduct() и подобными - реализуете сами под свои нужды. Если такой класс события написали, то создаёте экземпляр своего класса события и укажите его явно в аргументе eventClass
    use Joomla\Component\MyComponent\Administrator\Event\MyCoolEvent;$event = MyCoolEvent::create('onAfterInitUniverse', [    'subject'    => $this,    'eventClass' => MyCoolEvent::class, // ваш класс события    'data'       => $data, // какие-то данные    'article'    => $article, // ещё материал вдовесок    'product'    => $product, // и товаров подвезли]);
    Ожидаемо, что класс вашего события будет расширять AbsractEvent или другие классы событий Joomla.🙁 Есть неприятный нюанс - нельзя просто так вызывать событие и ничего не передать в аргументы. Аргумент subject обязательный. Но если вы всё-таки не хотите туда ничего передавать - передайте туда пустой stdClass или объект Joomla\registry\Registry.@joomlafeed#joomla #php #webdev

  • Веб-ассет Fancybox.js для Joomla v.6.0.9

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

  • Свои типы полей в Joomla.

    Свои типы полей в Joomla.Это большая тема, о которой можно говорить очень много

    Это большая тема, о которой можно говорить очень много. Самое главное, что возможности применения ограничиваются только вашей больной фантазией. Вы строите интерфейс своего модуля или плагина и вам нужно подтянуть данные из сторонней системы (список чего-нибудь по какому-нибудь API), чтобы сохранить выбранный id в Joomla. Или сделать какую-то проверку и в зависимости от неё показать то или иное сообщение пользователю. Для этого подойдут свои пользовательские типы полей. Интерфейс Joomla по большей части описан в XML-файлах. У каждого из них свои параметры. Некоторые не описаны в документации (manual.joomla.org), поэтому самым любопытным будет полезно заглянуть в собственно файлы фреймворка по пути libraries/src/Form/FormField.php, а так же в libraries/src/Form/Fields. У каждого класса поля перечислены его специфические свойства, которые можно описывать в XML. А в своём типе поля вы можете устанавливать эти значения программно. В моём модуле WT Quick links под капотом происходят изменения. Теперь для работы (в админке) ему нужен вспомогательный плагин. А в самом модуле нам бы проверить, а не выключен ли он? В Joomla есть тип поля Note - заметка. Его можно использовать для вывода примечаний.

    <field type="note"
         name="your_note_for_user"
         label="Заголовок примечания"
         title="Альтернативный способ для заголовка"
         description="Текст примечания"
         class="col-12 alert alert-info"
         heading="h1"
         close="true"
    />
    

    heading - указывать уровень заголовка. close - позволяет закрыть это примечание. В классе поля libraries/src/Form/Field/NoteField.php описана логика вывода. И в принципе оно нам подходит для нашей задачи. Но оно будет выводить сообщение всегда, а нам нужно только тогда, когда плагин отключён.Поэтому берём и создаём свой класс поля, который мы унаследуем от NoteField. Это значит, что у нас в руках будет весь инструментарий стандартного поля Note + то, что мы сами добавим. В XML-манифест добавляем наше поле

    <field type="systempluginstatus" 
         name="systempluginstatus"
         addfieldprefix="Joomla\Module\Wtquicklinks\Site\Fields"/>
    

    - type - имя файла и класса,- addfieldprefix - указываем namespace к нашему классу, может быть любой нам нужный- name - нельзя полю без имени...Это означает, что Joomla будет использовать класс поля из файла modules/mod_wt_quick_links/src/Fields/SystempluginstatusField.php.А в классе поля будет написано следующее:

    <?php
    // namespace для атрибута addfieldprefix
    namespace Joomla\Module\Wtquicklinks\Site\Fields;
    // нельзя напрямую обращаться к этому файлу
    defined('_JEXEC') or die;
    // подключаем родительский класс для переопределения
    use Joomla\CMS\Form\Field\NoteField;
    use Joomla\CMS\Language\Text;
    use Joomla\CMS\Plugin\PluginHelper;
    
    // имя класса и имя файла точь-в-точь
    class SystempluginstatusField extends NoteField
    {
         protected $type = 'Systempluginstatus';
    
         protected function getLabel()
              {
                   // если плагин не включён
                   if(PluginHelper::isEnabled('system','wtquicklinks')) {
                        // меняем свойства родительского класса
                        $this->class = 'alert alert-danger w-100';
                        $this->element['label'] = '⚠️ А-а-а-а!';
                        $this->element['description'] = 'Плагин не включён!!';
                        // и просто рендерим его с нашими свойствами
                        return parent::getLabel();
                   }
              // А иначе всё хорошо, скрываем поле из виду.
              $this->parentclass = 'd-none';
              return '';
         }
    }
    

    Просто и удобно. И людям приятно, что о них позаботились и рассказали почему что-то не работает. @webtolkru#joomla #php #webdev #разработка

  • Как вызвать событие только для указанной (одной или более) группы плагинов в Joomla 5Системные...

    Как вызвать событие только для указанной (одной или более) группы плагинов в Joomla 5Системные плагины в Joomla срабатывают всегда, но большое их количество может негативно сказаться на скорости работы Приложения. А во-вторых ошибка в системном плагине, добавляющем кнопку в тулбар может обрушить механизм регистрации / авторизации пользователя. Поэтому для лучшего быстродействия и надёжности работы системы плагины в Joomla разделены на группы. Каждая группа срабатывает только в определённом месте и в определённый момент времени. Небольшой пост-шпаргалка для Joomla-разработчиков от участника нашего сообщества Виталия Некрасова (@vitalik_a) подскажет как в своём коде сделать то, что написано в заголовке поста 😎Читать пост на Хабре#joomla #php #разработка #webdev

  • Рендер пользовательского поля внутри другого пользовательского поля. Joomla 5.3

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

    <?php
    $joomlaFieldContentPlugn->onContentPrepare('com_content.article', $fakeItem, $app->getParams());

    Joomla постепенно переходит от простого указания аргументов для триггеров плагинов к собственным классам событий. Это позволяет не запоминать порядок передачи аргументов класса и использовать человекопонятные методы $event->getContext(), $event->getItem() и т.д. А то в одном месте в Joomla было $article, в другом - $item, в третьем ещё как-то... Порядку больше становится.

    Сегодня обновил сайт клиентов до Joomla 5.3. В ней обновили контент-плагин fields и мой финт ушами с вызовом метода плагина отвалился потому, что я передавал в нём 3 аргумента, вместо одного. И для события onContentPrepare это должен быть объект класса ContentPrepareEvent. Как меняется фрагмент кода из предыдущего поста:

    <?php
    // мы находимся в файле макета поля
    
    use Joomla\CMS\Event\Content\ContentPrepareEvent;
    use Joomla\CMS\Factory;
    
    $app = Factory::getApplication();
    $fakeItem = new \stdClass();
    // Получаем id текущего материала из объекта Input
    $fakeItem->id = $app->getInput()->getInt('id');
    //  - это шорт код вставки поля с id 29 - "ассортимент проекта"
    // к содержимому поля конкатенируем шорт-код для обработки
    $fakeItem->text = $field->value . '';
    // Получаем объект плагина
    $joomlaFieldContentPlugn = $app->bootPLugin('fields', 'content');
    // вызываем метод обработки напрямую
    // вместо 3-х аргументов теперь указываем один
    // это объект класса ContentPrepareEvent
    $joomlaFieldContentPlugn->onContentPrepare(new ContentPrepareEvent('onContentPrepare', [
                'context' => 'com_content.article',
                'subject' => $fakeItem,
                'params'  => $app->getParams(),
                'page'    => 0,
            ]));
    // выводим оба поля
    echo $fakeItem->text;
    

    @webtolkru 

  • Joomla 4 Rest API: создаем свои JSON-эндпоинты с нуляПо умолчанию Joomla отправляет ответы в...

    Joomla 4 Rest API: создаем свои JSON-эндпоинты с нуляПо умолчанию Joomla отправляет ответы в формате JSON API, если запрос содержит Accept: application/json или специальный заголовок JSON API. Хотя ядро Joomla не поддерживает другие типы контента, система позволяет разработчикам добавлять дополнительные форматы для ответов.👩‍💻 Цели материала:- Получить JSON ответ от API Joomla;- Создать необходимый плагин группы webservices и API-часть компонента;- Использовать параметры модуля для моделирования данных, которые мы отправим в ответе API.👩‍💻 Что не является целью?​Обучение созданию расширений. Данное руководство предполагает, что вы уже умеете создавать расширения для Joomla. Для работы API потребуются плагин и компонент, но компонент может быть минимальным — без модели (Model), с простой административной частью.Эта статья - перевод на русский язык раздела официальной документации Joomla для разработчиков Joomla! Programmers Documentation for Joomla 5.2. Статья пригодится разработчиком, работающим с реактивными frontend- фреймворками. Перевод выполнил участник нашего сообщества Виталий Некрасов (@vitalik_a).- Читать статью на Хабре- Оригинал в документацииПодпишись на @joomlafeed#webdev #разработка #joomla #api #restapi

  • Joomla-дайджест. 1-й квартал 2025 года

    Joomla-дайджест. 1-й квартал 2025 года

    Joomla-дайджест. 1-й квартал 2025 года.После долгого перерыва читайте все главные новости из мира Joomla с момента выхода Joomla 5.2.0 (15 октября 2024 года) в одной статье. Но для удобства в названии ограничимся первым кварталом 2025 года. Традиционно наш дайджест обозревает новости, расширения, шаблоны и статьи из мира Joomla.Читать дайджест на ХабреПодпишись на @joomlafeed#joomla #расширения #разработка #webdev

  • Обзор MVCFactory в Joomla 5Эта статья - перевод на русский язык раздела официальной документации...

    Обзор MVCFactory в Joomla 5Эта статья - перевод на русский язык раздела официальной документации Joomla для разработчиков Joomla! Programmers Documentation for Joomla 5.2. Статья пригодится разработчиком, работающим с собственными компонентами.Перевод выполнил участник нашего сообщества Виталий Некрасов (@vitalik_a).Читать статью на ХабреОригинал: Joomla! Programmers Documentation for Joomla 5.2Подпишись на @joomlafeed#joomla #php #webdev #разработка

  • Использование своего класса MVC фабрики в компоненте Joomla 5У участника нашего сообщества Виталия...

    Использование своего класса MVC фабрики в компоненте Joomla 5​У участника нашего сообщества Виталия Некрасова (@vitalik_a) назрела необходимость переопределить метод createModel() в своём компоненте. Он захотел сделать это правильно, заменив класс MVC фабрики своим и поделился своим опытом в посте на Хабре.Подпишись на @joomlafeed#joomla #php #webdev #разработка

  • Заменяем устаревший метод Joomla\CMS\Toolbar\Toolbar::getInstance() в Joomla 5.2.5

    👩‍💻 Заменяем устаревший метод Joomla\CMS\Toolbar\Toolbar::getInstance() в Joomla 5.2.5.Этот метод нужен для работы с кнопками тулбара в Joomla. Как правильно получить объект текущего тулбара в Joomla 5.x расскажет пост на Хабре участника нашего сообщества Виталия Некрасова (@vitalik_a) Читать постПодпишись на @joomlafeed#joomla #php #webdev #разработка

  • Собственные макеты вывода для пользовательских полей Joomla

    Собственные макеты вывода для пользовательских полей JoomlaМы привыкли использовать механизм...

    Мы привыкли использовать механизм переопределения макетов Joomla: скопируй нужный тебе файл макета в папку html шаблона и твори там что хочешь.

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

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

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

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

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

  • Как добавить свой таб или поле в интерфейс Joomla с помощью плагина. «Joomla way».

    Задачи могут быть самые разные: поле аватара для пользователя в com_users, дополнительный таб в форму редактирования материала, поле связи одной сущности с другой и т.д. Сразу оговорюсь, что бывает и "non-Joomla way" - то есть подходы, которые не предполагаются ядром CMS, но при этом и явно не запрещаются. Сейчас речь пойдёт о традиционном. 

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

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

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

Joomla!® CMS — пожалуй, лучшая система управления контентом с открытым исходным кодом

Логотип Joomla

Joomla! — это больше, чем просто программное обеспечение, это люди, включающие разработчиков, дизайнеров, системных администраторов, переводчиков, копирайтеров, и, что самое главное — простых пользователей.

Мы рады пригласить вас в ряды нашего сообщества!

Свернуть

Новости портала

Новое в блогах

Видео

Форум о Joomla