Заготовка плагина 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-09-03 18:32

About me briefly
Support and development of web projects on the CMF Cotonti: private messengers via the website, open and closed small social networks, trading platforms and marketplaces, freelance and services exchange portal, catalogs of goods from wholesale suppliers, dropshipping platforms, online stores, and much more.
View developments and download
Public portfolio of my works and developments
Telegram for messages
@webitproff
Telegram channel
@s/aBuyFILE
  • 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