Настройка com_users в Joomla: от переопределения шаблонов до плагинов

Раздел: Разработка на PHP -> Разработка под Joomla

Работа с компонентом com_users: основные подходы

Основное решение: переопределение шаблонов через шаблон сайта

Как изменить HTML-шаблоны входа, регистрации и профиля компонента com_users без изменения ядра?

Создаются папки html/com_users внутри папки шаблона, копируются файлы из components/com_users/views/.../tmpl. Далее редактируется скопированный файл.


// Пример переопределения шаблона входа (login.php)
// Путь: /templates/my_template/html/com_users/login/default.php

defined('_JEXEC') or die;

$app = JFactory::getApplication();
$user = JFactory::getUser();
?>
<? echo JHtml::_('form.token'); ?>

Ru index php option com users (параметр option=com_users в index.php (joomla))

Типичная ошибка: неверное имя файла шаблона. Переопределение работает только если имя файла совпадает с именем представления и макетом. Для стандартного макета login.php помещается в подпапку с именем представления (login). Если создать файл прямо в html/com_users, он не будет использован. Нужен путь html/com_users/login/default.php.

Цель: полный контроль над HTML-разметкой без риска потери изменений при обновлении Joomla.

Вариант 2: Плагин аутентификации для внешнего сервиса

Как реализовать вход через внешний API (например, Telegram или LDAP) вместе со стандартной аутентификацией?

Создаётся плагин типа authentication, который расширяет класс JPlugin и реализует метод onUserAuthenticate.


// Файл: plugins/authentication/myexternal/myexternal.php
class PlgAuthenticationMyexternal extends JPlugin
{
    public function onUserAuthenticate($credentials, $options, &$response)
    {
        $response->type = 'MyExternal';
        // Вызов внешнего API
        if ($this->checkExternalApi($credentials['username'], $credentials['password'])) {
            $response->status = JAuthentication::STATUS_SUCCESS;
            $response->email = $this->getEmailFromApi($credentials['username']);
        } else {
            $response->status = JAuthentication::STATUS_FAILURE;
        }
    }
    private function checkExternalApi($username, $password) { /* ... */ }
}
Проблема: при неудаче внешнего входа пользователь не видит сообщения об ошибке. Необходимо установить текст ошибки через $response->error_message.

Использование: для предприятий, где пользователи хранятся в корпоративной базе.

Вариант 3: Обработка события onUserAfterSave

Как после регистрации пользователя отправить его данные в CRM или другую систему?

Плагин типа user подписывается на событие onUserAfterSave.


// plugins/user/crmconnect/crmconnect.php
class PlgUserCrmconnect extends JPlugin
{
    public function onUserAfterSave($user, $isnew, $success, $msg)
    {
        if ($isnew && $success) {
            $client = new HttpClient();
            $client->post('https://crm.example.com/api/user', [
                'email' => $user['email'],
                'name' => $user['name']
            ]);
        }
    }
}
Типичная ошибка: забыть проверить флаг $isnew, чтобы не отправлять данные при обновлении профиля. Также нужно обрабатывать ошибки HTTP.

Вариант 4: Программное создание пользователя из внешнего скрипта

Как создать пользователя в Joomla из стороннего PHP-скрипта, используя API Joomla?

Подключите CMS framework и воспользуйтесь JUser.


define('_JEXEC', 1);
require_once __DIR__ . '/includes/defines.php';
require_once __DIR__ . '/includes/framework.php';
$app = JFactory::getApplication('site');
$user = new JUser;
$data = array(
    'name' => 'Иван Петров',
    'username' => 'ivan',
    'email' => 'ivan@example.com',
    'password' => 'secure123',
    'groups' => array(2) // Registered
);
if (!$user->bind($data)) {
    throw new Exception($user->getError());
}
if (!$user->save()) {
    throw new Exception($user->getError());
}
Ошибка: если не задать groups, пользователь будет без группы. Не забудьте установить пароль в открытом виде, Joomla сама захеширует.

Вариант 5: Изменение параметров конфигурации com_users через системный плагин

Как программно изменить настройки компонента (например, разрешить регистрацию или установить уровень групп по умолчанию)?

Можно переопределить параметры через плагин onBeforeRender, изменив объект параметров.


// plugins/system/customusercfg/customusercfg.php
class PlgSystemCustomusercfg extends JPlugin
{
    public function onBeforeRender()
    {
        $app = JFactory::getApplication();
        if ($app->isClient('site') && $app->input->get('option') == 'com_users') {
            $params = JComponentHelper::getParams('com_users');
            $params->set('allowUserRegistration', '1'); // принудительно включить
            $params->set('new_usertype', '2'); // ID группы
            JComponentHelper::setParams('com_users', $params);
        }
    }
}
Внимание: изменение параметров на лету через onBeforeRender сработает только для запросов к com_users. Для глобального изменения лучше использовать таблицу компонента.

Расширенные примеры работы с com_users

Пример 1: Переопределение шаблона login.php с добавлением reCAPTCHA

В копию login.php добавляется вызов reCAPTCHA. После проверки токена в плагине или контроллере.

Пример

<?php
defined('_JEXEC') or die;
JHtml::_('behavior.keepalive');
$app = JFactory::getApplication();
?>
<form action='<?php echo JRoute::_('index.php?option=com_users&task=user.login'); ?>' method='post'>
  <?php echo $this->form->getInput('username'); ?>
  <?php echo $this->form->getInput('password'); ?>
  <div class='g-recaptcha' data-sitekey='YOUR_SITE_KEY'></div>
  <button type='submit'>Войти</button>
  <?php echo JHtml::_('form.token'); ?>
  <input type='hidden' name='return' value='<?php echo base64_encode(JURI::base()); ?>' />
</form>
Результат: форма входа с капчей, токен отправляется при сабмите.

Пример 2: Плагин аутентификации через Telegram OAuth

Плагин проверяет callback от Telegram Bot API и создает/аутентифицирует пользователя.

Пример

// onUserAuthenticate проверяет данные из $_GET
if ($this->params->get('telegram_login')) {
    $auth_data = $_GET;
    if ($this->checkTelegramHash($auth_data)) {
        $user = JUser::getInstance();
        if (!$userId = $user->loadByEmail($auth_data['email'])) {
            // создать пользователя
            $data['email'] = $auth_data['email'];
            $user->bind($data);
            $user->save();
        }
        $response->status = JAuthentication::STATUS_SUCCESS;
    }
}
Пользователь входит по ссылке вида /index.php?option=com_users&view=login&telegram_id=...&auth_date=...&hash=...

Пример 3: Программное удаление пользователя по ID

Скрипт для удаления пользователя из внешнего интерфейса администратора.

Пример

$userId = 42;
$user = JUser::getInstance($userId);
if ($user->id && $user->get('authorised')) {
    if (!$user->delete()) {
        throw new Exception('Ошибка удаления: ' . $user->getError());
    }
}
Пользователь с ID 42 удалён, если он существовал и не является суперпользователем (авторизован? проверка).

Пример 4: Получение списка групп пользователя и изменение через API

Пример

$user = JFactory::getUser(123);
$groups = $user->getAuthorisedGroups();
print_r($groups);
// Добавление группы
$user->groups = array_unique(array_merge($groups, [10]));
$user->save();
Массив ID групп выводится на экран.

Пример 5: Использование JUserHelper для генерации пароля

Пример

$password = JUserHelper::genRandomPassword(16);
$data['password'] = $password;
$data['password2'] = $password;
$user->bind($data);
$user->save();
Пользователь создаётся со сгенерированным паролем длиной 16 символов.

Параметр option=com_users в index.php (Joomla) - comments

En
Ru index php option com users (php)