Заготовка плагина socialauth для Cotonti

Структура плагина socialauth для Cotonti, который включает авторизацию, регистрацию и привязку/отвязку аккаунтов социальных сетей через HybridAuth 3.11 (без Composer).

Структура плагина socialauth для Cotonti, который включает авторизацию, регистрацию и привязку/отвязку аккаунтов социальных сетей через HybridAuth 3.11 (без Composer).

Заготовка


Структура плагина


plugins/socialauth/
├── lib/                      # Папка с библиотекой HybridAuth
│   └── hybridauth/          # Содержит файлы из src архива HybridAuth 3.11
│       ├── Adapter/
│       ├── Exception/
│       ├── HttpClient/
│       ├── Logger/
│       ├── Provider/
│       ├── Storage/
│       ├── Thirdparty/
│       ├── User/
│       └── (другие файлы из src)
├── lang/                    # Языковые файлы
│   ├── socialauth.en.lang.php
│   └── socialauth.ru.lang.php
├── tpl/                     # Шаблоны
│   ├── socialauth.login.tpl   # Кнопки для входа и регистрации
│   └── socialauth.profile.tpl # Кнопки для профиля (привязка/отвязка)
├── socialauth.php           # Основной файл плагина
├── socialauth.setup.php     # Установочный файл
└── socialauth.config.php    # Конфигурация HybridAuth

Файлы и их содержимое с комментариями

1. socialauth.setup.php

Установочный файл для создания полей в базе данных.


<?php
defined('COT_CODE') or die('Wrong URL.');

// Метаданные плагина
$plugin_title = "SocialAuth"; // Название плагина
$plugin_desc = "User authentication, registration, and social account linking via HybridAuth 3.11."; // Описание
$plugin_version = "1.0.0"; // Версия
$plugin_author = "Your Name"; // Автор

// SQL-запрос для установки: добавляем поля для хранения данных соцсетей
$plugin_install = <<<SQL
ALTER TABLE `cot_users` ADD COLUMN `user_social_id` VARCHAR(255) DEFAULT NULL; -- Уникальный ID соцсети
ALTER TABLE `cot_users` ADD COLUMN `user_social_provider` VARCHAR(50) DEFAULT NULL; -- Название провайдера (Google, Facebook и т.д.)
SQL;

// SQL-запрос для удаления: убираем добавленные поля при деактивации
$plugin_uninstall = <<<SQL
ALTER TABLE `cot_users` DROP COLUMN `user_social_id`;
ALTER TABLE `cot_users` DROP COLUMN `user_social_provider`;
SQL;


2. socialauth.config.php

Конфигурация HybridAuth с настройками провайдеров.


<?php
defined('COT_CODE') or die('Wrong URL.');

// Конфигурация HybridAuth
return [
    'base_url' => $cfg['mainurl'] . '/plugins/socialauth/socialauth.php?hauth=done', // URL обратного вызова для HybridAuth
    'providers' => [ // Список провайдеров
        'Google' => [
            'enabled' => true, // Включён
            'keys' => [
                'id' => 'YOUR_GOOGLE_CLIENT_ID', // Заменить на ваш Client ID
                'secret' => 'YOUR_GOOGLE_CLIENT_SECRET', // Заменить на ваш Client Secret
            ],
            'scope' => 'email profile', // Запрашиваемые данные
        ],
        'Facebook' => [
            'enabled' => true, // Включён
            'keys' => [
                'id' => 'YOUR_FACEBOOK_APP_ID', // Заменить на ваш App ID
                'secret' => 'YOUR_FACEBOOK_APP_SECRET', // Заменить на ваш App Secret
            ],
            'scope' => 'email', // Запрашиваемые данные
        ],
        // Добавьте другие провайдеры (например, Twitter, VK) по аналогии
    ],
    'debug_mode' => false, // Режим отладки (true для записи логов)
    'debug_file' => $cfg['plugins_dir'] . '/socialauth/socialauth.log', // Файл логов
];

 

3. socialauth.php

Основной файл плагина с логикой авторизации, регистрации и привязки/отвязки.

 

<?php
defined('COT_CODE') or die('Wrong URL.');

// Подключение необходимых модулей Cotonti
require_once cot_incfile('users', 'module'); // Модуль пользователей
require_once $cfg['system_dir'] . '/cot_config.php'; // Конфигурация системы
require_once $cfg['plugins_dir'] . '/socialauth/lib/hybridauth/Hybridauth.php'; // HybridAuth

use Hybridauth\Hybridauth;

// Получение параметров из запроса
$hauth = cot_import('hauth', 'G', 'TXT'); // Флаг обратного вызова от HybridAuth
$provider = cot_import('provider', 'G', 'TXT'); // Название провайдера (Google, Facebook и т.д.)
$action = cot_import('action', 'G', 'TXT'); // Действие (link/unlink)

// Загрузка конфигурации HybridAuth
$config = include $cfg['plugins_dir'] . '/socialauth/socialauth.config.php';

// Обработка авторизации через соцсети
if ($hauth == 'done' || !empty($provider)) {
    try {
        $hybridauth = new Hybridauth($config); // Инициализация HybridAuth
        
        // Аутентификация через провайдера
        if (!empty($provider)) {
            $adapter = $hybridauth->authenticate($provider); // Запуск процесса авторизации
        } else {
            $adapter = $hybridauth->getAdapter($provider); // Получение адаптера после авторизации
        }

        $userProfile = $adapter->getUserProfile(); // Получение данных пользователя из соцсети
        $socialId = $userProfile->identifier; // Уникальный ID соцсети
        $socialProvider = $provider; // Название провайдера

        // Проверка, привязан ли этот соц. аккаунт к другому пользователю
        $existingUser = $db->query("SELECT * FROM $db_users WHERE user_social_id = ? AND user_social_provider = ?",
            [$socialId, $socialProvider])->fetch();

        if ($existingUser && $existingUser['user_id'] != $usr['id']) {
            // Если аккаунт уже привязан к другому пользователю
            cot_error('This social account is already linked to another user.');
            $adapter->disconnect();
            cot_redirect(cot_url('users', 'm=profile'));
        } elseif ($usr['id'] > 0 && $action == 'link') {
            // Привязка соцсети к текущему аккаунту
            $db->update($db_users, ['user_social_id' => $socialId, 'user_social_provider' => $socialProvider], "user_id = ?", $usr['id']);
            cot_message('Social account linked successfully!');
            $adapter->disconnect();
            cot_redirect(cot_url('users', 'm=profile'));
        } elseif ($existingUser) {
            // Авторизация существующего пользователя
            cot_user_login($existingUser['user_id']);
            $adapter->disconnect();
            cot_redirect(cot_url('index'));
        } else {
            // Регистрация нового пользователя
            $email = $userProfile->email ?? 'noemail_' . $socialId . '@example.com'; // Email или заглушка
            $username = $userProfile->displayName ?? 'user_' . $socialId; // Имя или заглушка

            $userdata = [
                'user_name' => $username,
                'user_email' => $email,
                'user_social_id' => $socialId,
                'user_social_provider' => $socialProvider,
                'user_password' => md5(uniqid()), // Случайный пароль
                'user_regdate' => time(),
                'user_group' => 4, // Группа по умолчанию
            ];

            $newUserId = cot_user_register($userdata);
            if ($newUserId) {
                cot_user_login($newUserId);
                $adapter->disconnect();
                cot_redirect(cot_url('index'));
            }
        }
    } catch (Exception $e) {
        cot_error('Authentication failed: ' . $e->getMessage());
        cot_redirect($usr['id'] > 0 ? cot_url('users', 'm=profile') : cot_url('login'));
    }
}

// Обработка отвязки аккаунта
if ($action == 'unlink' && $usr['id'] > 0) {
    $db->update($db_users, ['user_social_id' => null, 'user_social_provider' => null], "user_id = ?", $usr['id']);
    cot_message('Social account unlinked successfully!');
    cot_redirect(cot_url('users', 'm=profile'));
}

// Хук для страницы входа
$cot_hooks['users.login.tags'][] = 'socialauth_login_tags';
function socialauth_login_tags($tag_prefix = '') {
    global $cfg;
    $config = include $cfg['plugins_dir'] . '/socialauth/socialauth.config.php';
    $t = new XTemplate(cot_tplfile('socialauth.login', 'plug')); // Загрузка шаблона

    // Перебор активных провайдеров
    foreach ($config['providers'] as $provider => $data) {
        if ($data['enabled']) {
            $t->assign([
                'SOCIAL_PROVIDER' => $provider,
                'SOCIAL_LOGIN_URL' => cot_url('plug', "r=socialauth&provider=$provider"),
            ]);
            $t->parse('MAIN.PROVIDERS');
        }
    }
    $t->parse('MAIN');
    return $t->text('MAIN');
}

// Хук для страницы профиля
$cot_hooks['users.profile.tags'][] = 'socialauth_profile_tags';
function socialauth_profile_tags($tag_prefix = '') {
    global $cfg, $usr, $db, $db_users;
    $config = include $cfg['plugins_dir'] . '/socialauth/socialauth.config.php';
    $t = new XTemplate(cot_tplfile('socialauth.profile', 'plug')); // Загрузка шаблона профиля

    // Получение текущих данных о привязке
    $user = $db->query("SELECT user_social_id, user_social_provider FROM $db_users WHERE user_id = ?", [$usr['id']])->fetch();
    $linkedProvider = $user['user_social_provider'];

    // Перебор активных провайдеров
    foreach ($config['providers'] as $provider => $data) {
        if ($data['enabled']) {
            $isLinked = ($linkedProvider === $provider);
            $t->assign([
                'SOCIAL_PROVIDER' => $provider,
                'SOCIAL_LINK_URL' => cot_url('plug', "r=socialauth&provider=$provider&action=link"),
                'SOCIAL_UNLINK_URL' => cot_url('plug', "r=socialauth&action=unlink"),
                'SOCIAL_IS_LINKED' => $isLinked,
            ]);
            $t->parse('MAIN.PROVIDERS');
        }
    }
    $t->parse('MAIN');
    return $t->text('MAIN');
}

// Вспомогательные функции
function cot_user_login($userid) {
    global $db, $db_users, $usr;
    $user = $db->query("SELECT * FROM $db_users WHERE user_id = ?", [$userid])->fetch();
    $usr['id'] = $user['user_id'];
    $usr['name'] = $user['user_name'];
    cot_setcookie('cot_uid', $user['user_id'], time() + 63072000); // Куки для ID
    cot_setcookie('cot_pass', $user['user_password'], time() + 63072000); // Куки для пароля
}

function cot_user_register($userdata) {
    global $db, $db_users;
    $db->insert($db_users, $userdata);
    return $db->lastInsertId(); // Возвращаем ID нового пользователя
}


4. tpl/socialauth.login.tpl


Шаблон для кнопок входа и регистрации.


<!-- BEGIN: MAIN -->
<div class="social-buttons">
    <!-- BEGIN: PROVIDERS -->
    <!-- Кнопка для каждого провайдера -->
    <a href="{SOCIAL_LOGIN_URL}" class="btn btn-{SOCIAL_PROVIDER|strtolower}">{SOCIAL_PROVIDER}</a>
    <!-- END: PROVIDERS -->
</div>
<!-- END: MAIN -->


5. tpl/socialauth.profile.tpl

Шаблон для кнопок привязки/отвязки в профиле.


<!-- BEGIN: MAIN -->
<div class="socialauth-profile">
    <h3>Привязка социальных сетей</h3>
    <!-- BEGIN: PROVIDERS -->
    <div class="social-provider">
        <!-- Если соцсеть привязана -->
        <!-- IF {SOCIAL_IS_LINKED} -->
        <span>{SOCIAL_PROVIDER}: Привязан</span>
        <a href="{SOCIAL_UNLINK_URL}" class="btn btn-danger">Отвязать</a>
        <!-- Иначе показываем кнопку привязки -->
        <!-- ELSE -->
        <a href="{SOCIAL_LINK_URL}" class="btn btn-{SOCIAL_PROVIDER|strtolower}">Привязать {SOCIAL_PROVIDER}</a>
        <!-- ENDIF -->
    </div>
    <!-- END: PROVIDERS -->
</div>
<!-- END: MAIN -->


6. lang/socialauth.en.lang.php

Английские переводы.


<?php
$L['Social account linked successfully!'] = 'Social account linked successfully!';
$L['Social account unlinked successfully!'] = 'Social account unlinked successfully!';
$L['Authentication failed'] = 'Authentication failed';
$L['This social account is already linked to another user'] = 'This social account is already linked to another user.';
7. lang/socialauth.ru.lang.php

Русские переводы.


<?php
$L['Social account linked successfully!'] = 'Социальный аккаунт успешно привязан!';
$L['Social account unlinked successfully!'] = 'Социальный аккаунт успешно отвязан!';
$L['Authentication failed'] = 'Ошибка авторизации';
$L['This social account is already linked to another user'] = 'Этот социальный аккаунт уже привязан к другому пользователю.';
Интеграция в шаблоны сайта

    Страница входа (themes/ВАША_ТЕМА/users.login.tpl):
    html

<div class="login-page">
    <h2>{USERS_LOGIN_TITLE}</h2>
    <form name="login" action="{USERS_LOGIN_FORM_ACTION}" method="post">
        {USERS_LOGIN_FORM_USERNAME}
        {USERS_LOGIN_FORM_PASSWORD}
        <button type="submit">{PHP.L.Login}</button>
    </form>
    <div class="social-login">
        <h3>Войти через соцсети</h3>
        {USERS_LOGIN_SOCIALAUTH}
    </div>
</div>
Страница профиля (themes/ВАША_ТЕМА/users.profile.tpl):
html

    <div class="profile-page">
        <h2>{USERS_PROFILE_TITLE}</h2>
        <form name="profile" action="{USERS_PROFILE_FORM_ACTION}" method="post">
            {USERS_PROFILE_FORM_USERNAME}
            {USERS_PROFILE_FORM_EMAIL}
            <button type="submit">{PHP.L.Update}</button>
        </form>
        {USERS_PROFILE_SOCIALAUTH}
    </div>

Установка

    Скопируй все файлы в plugins/socialauth/.
    Убедись, что lib/hybridauth/ содержит файлы из src HybridAuth 3.11.
    Установи плагин через админ-панель (Администрирование → Расширения → SocialAuth).
    Настрой API ключи в socialauth.config.php.

Теперь плагин полностью готов к использованию с авторизацией, регистрацией и привязкой/отвязкой соцсетей в профиле!

7 minutes read Sodium Carbonate

Comments (0)

No comments yet
Only registered users can post new comments

Content author

webitproff

Offline

Sodium Carbonate

Last logged: 2026-07-19 01:57

  • Page published: 2025-03-06 00:04
  • Last update: 2025-03-06 00:04

Similar pages

Заготовка плагина подписки на "Pages" по категориям
1 Заготовка, которая позволит написать плагин для Cotonti CMF, который позволит пользователям подписываться на обновления
Настройка плагина Mavatars на Cotonti
2 Mavatars - это универсальный плагин, который позволяет прикреплять к записям на сайте любые файлы, в том числе
Как изменить расположение папки с изображениями плагина Attach2
3 При оптимизации сайта возникают различные ситуации. Одной из них является смена расположения папки с картинками,
Как устроена проверка активности плагина в шаблонах
4 Как устроена проверка активности плагина в шаблонахcot_plugin_active() вызывает ExtensionsService::isPluginActive(),
Загрузчик плагина (Plugin loader) в Cotonti Siena CMF
5 Обзор загрузчика и Введение в систему плагинов CotontiПодробный разбор самой концепции инициализации плагинов и анализ
Cotonti Siena CMF • 2026-03-10 11:22 webitproff