В 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);
Войти через Яндекс
