В Joomla 4 внесли существенные изменения, а поскольку при разработке расширений приходится решать ряд типовых задач, я решил выложить небольшую шпаргалку, которая сэкономит в будущем время мне и, надеюсь, читателям этой статьи.
Как подключить CSS и скрипты в Joomla 4
Объявляем переменную с WebAssetManager
use Joomla\CMS\Factory; $assetManager = Factory::getApplication()->getDocument()->getWebAssetManager();
Подключаем CSS
$assetManager->registerAndUseStyle('your_uniq_css_name', 'path/style.css', []);
Подключаем внешний JS файл
$assetManager->registerAndUseScript('your_uniq_script_name', 'path/script.js', []);
Обратите внимание на первый передаваемый параметр. Это уникальное имя подключаемого элемента. Оно задается произвольно.
Вставляем свой JS код, который хранится в переменной $script
$assetManager->addInlineScript($script);
Подробно о подключении стилей и скриптов в Joomla 4 можно прочитать на официальном сайте Joomla
Как получить параметры компонента из другого компонента в Joomla 4
use Joomla\CMS\Component\ComponentHelper; $params = ComponentHelper::getParams('com_yourcomponent'); // Получаем параметры $param = $params->get('my_parametr', ''); // Получаем отдельно взятый параметр с именем my_parametr
Редирект в Joomla 4
Для того, чтобы не получить на сайте сообщение об ошибке "You have not supplied a valid HTTP status code", редирект под Joomla 4 следует производить следующим образом:
use Joomla\CMS\Factory; $app = Factory::getApplication(); $app->enqueueMessage('Текст сообщения, который увидит посетитель после редиректа'); $app->redirect($link,); // собственно, сам редирект. В переменной $link хранится адрес страницы
Как получить адрес текущей страницы сайта
use Joomla\CMS\Uri\Uri; $uri = Uri::getInstance(); $current_url = $uri->toString();
Поля в административной панели с множественным выбором
Для современного отображения поля с множественным выбором, необходимо к полю добавить атрибут layout="joomla.form.field.list-fancy-select"
На рисунке ниже показано поле с множественным выбором и добавленный аттрибут
Создание пароля пользователя в собственном компоненте
Время от времени появляется задача создание собственной регистрации, при которой введенный ранее пароль мы средствами компонента должны записать напрямую в базу данных.
Как известно, в базе данных Joomla хранятся не пароли, а их хеши.
Для того, чтобы записать введенный ранее пароль в базу данных ранее, в Joomla 3 работал следующий код:
$salt = JUserHelper::genRandomPassword(32); $crypt = JUserHelper::getCryptedPassword($password, $salt); $hashpassword = $crypt.':'.$salt;
Где $password - пароль, полученный из формы с вашего сайта.
Однако, в Joomla 4 такой способ вызовет ошибку, поскольку методы описанные выше удалены.
Поэтому для Joomla 4 следует использовать следующую конструкцию:
use Joomla\CMS\User\UserHelper; $hashpassword = UserHelper::hashPassword($password);
И далее уже пишем $hashpassword в таблицу #__users
Проверка пароля из формы в собственном компоненте, модуле или плагине
Сопутствующая предыдущей задача - это проверка логина и пароля из формы расширения собственной разработки. Ниже я привел пример двух методов. Метод login, собственно, проверяет данные и что-то делает после проверки. Второй метод необходим для поиска в базе данных пользователя по указанному логину.
use Joomla\CMS\User\UserFactoryInterface; use Joomla\CMS\Factory; use Joomla\CMS\User\UserHelper; public function login() { $app = Factory::getApplication(); $input = $app->getInput(); $username = $input->get('username', '', 'RAW'); // Получаем из формы имя пользователя $password = $input->get('password', '', 'RAW'); // Получаем из формы пароль $user = $this->getUserByUsername($username); // Ищем в базе пользователя с указанным логином if (!$user) { // Если пользователь с указанным логином не найден, то что-то делаем } $passwordMatch = UserHelper::verifyPassword($password, $user->password, $user->id); // Проверяем пароль if ($passwordMatch) { // Если введен правильный пароль что-то делаем } else { // Если введен неправильный пароль что то делаем } } // Метод ищет в базе данных пользователя по логину и возвращает объект пользователя, если пользователь найден public function getUserByUsername($username) { $container = Factory::getContainer(); $db = $container->get('DatabaseDriver'); $query = $db->getQuery(true) ->select('*') ->from($db->quoteName('#__users')) ->where($db->quoteName('username') . ' = ' . $db->quote($username)); $db->setQuery($query); $result = $db->loadObject(); return $result; }
Как получить объект пользователя в Joomla 4
В Joomla 3 был замечательный метод JFactory::getUser() , который позволял получить текущего авторизованного пользователя. При этом если методу был передан id пользователя, то он возвращал объект указанного пользователя. В Joomla 4 данный метод был объявлен устаревшим (deprecated).
Использование его не рекомендуется.
Как получить текущего пользователя в Joomla 4
Для этого используется следующая конструкция:
use \Joomla\CMS\Factory; $app = Factory::getApplication(); $user = $app->getIdentity();
Получаем объект пользователя по id
Для получения пользователя по id используем следующий код:
use Joomla\CMS\User\UserFactoryInterface; use Joomla\CMS\Factory; $container = Factory::getContainer(); $userFactory = $container->get(UserFactoryInterface::class); $user = $userFactory->loadUserById($id);