Почитать другие заметки или статьи

В 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);