Настройка com_users в 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();
?>
Ru index php option com users (параметр option=com_users в index.php (joomla))
Цель: полный контроль над 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) { /* ... */ }
}
Использование: для предприятий, где пользователи хранятся в корпоративной базе.
Вариант 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']
]);
}
}
}
Вариант 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());
}
Вариант 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);
}
}
}
Расширенные примеры работы с 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 символов.