Новости Joomla

Вышел плагин CFI v.2.0.0 - экспорт/импорт материалов Joomla в таблицы.

Вышел плагин CFI v.2.0.0 - экспорт/импорт материалов Joomla в таблицы.

Плагин позволяет делать экспорт материалов Joomla в CSV файл, после чего вы можете отредактировать данные в табличном редакторе (например, Excel или OpenOffice Calc) и затем загрузить файл обратно. В некоторых случаях это удобнее и быстрее.

Плагин позволяет выгружать ID тегов, а также работать с пользовательскими полями материалов Joomla и обычно нередактируемыми свойствами материалов: просмотры, дата изменения и т.д.

Первые версии плагина CFI создал разработчик AlekVolsk для Joomline. Он разработал версии 1.0.0–1.0.16 для Joomla 3. Затем, в 2026 году, плагин был передан компании WebTolk для дальнейшего развития.

CFI v.2.0.0 — Что нового?

  1. Рефакторинг. Плагин полностью переписан заново.
  2. Новый интерфейс импорта/экспорта. Экспорт и импорт открываются в модальном окне. Появилась возможность выбора свойств материала, тегов и пользовательских полей для экспорта непосредственно перед началом экспорта.
  3. Фильтрация материалов при экспорте. Вы можете отфильтровать нужные материалы с помощью стандартных параметров поиска в панели администратора и экспортировать только их: избранные, опубликованные, материалы из определённых категорий, с заданным тегом и т.д.
  4. Импорт и экспорт всех данных материала. Ранее плагин позволял экспортировать только часть данных. Теперь можно изменять все данные материала, доступные в форме редактирования, включая нередактируемые (просмотры, дата изменения и др.). Это позволяет быстро обновлять meta-description или только данные пользовательских полей.
  5. Импорт только пользовательских полей. Обязательным полем для импорта остаётся только articleid. Это позволяет импортировать исключительно данные пользовательских полей без изменения основного содержимого материала.
  6. Joomla 6. Плагин переписан в соответствии с актуальной архитектурой Joomla 4+ и успешно протестирован на Joomla 6.
  7. Для разработчиков: предобработка плагинами. Возможна обработка данных собственными плагинами группы cfi непосредственно перед импортом или экспортом. Доступные события:
    • onExportPrepareData($event)
    • onImportPrepareArticleData($event)

Системные требования

  • Joomla 4.3+
  • PHP 8.1+

Для обновления со старых версий выпущен релиз 1.0.16, в котором добавлен новый сервер обновлений.

Ссылки

0 Пользователей и 1 Гость просматривают эту тему.
  • 3 Ответов
  • 462 Просмотров
*

creative3d

  • Захожу иногда
  • 200
  • 6 / 0
Здравствуйте. Завис на этом вопросе.
Проблемы: спамеры, соблюдение закона, отсутствие компонентов.
- Через обычную авторизацию спам-боты влегкую регистрируются. Нашел вариант с Akeeba SocialLogin + капча от Google - это должно решить проблему с ботами и спамерами. Но там получается только 3 зарубежных соцсети по хорошему. Нужна как минимум еще и ВК.
- Нужно соблюдать закон о персональных данных, а у меня сервер не в России. Подумал можно будет не личную информацию хранить, а только идентификаторы какие-нибудь, но вчера новость увидел:
"В России могут начать штрафовать владельцев сайтов за авторизацию с помощью иностранных сервисов. Соответствующий законопроект внесен в Госдуму, сообщили в соцсетях.
«Новая статья 13.53 КоАП устанавливает ответственность для владельцев сайтов за „неисполнение обязанности по проведению авторизации пользователей“», — пишет telegram-канал «Осторожно Новости». Отмечается, что за нарушение граждане могут получить штраф 10-20 тысяч рублей, а юрлица — 500-700 тысяч рублей. Согласно законодательству, как пишет канал, регистрироваться на российских сайтах можно через биометрию, телефон или сервисы, которыми владеют компании в России.
... два года назад в силу вступила норма, по которой авторизация пользователей, находящихся на территории России, возможна одним из следующих способов: с использованием номера мобильного телефона; с использованием ЕСИА или ЕБС; с использованием российского сервиса авторизации."
- получается мне надо уходить с зарубежного сервера на русский или есть какие-то варианты, чтобы не уходить? И как вообще по мнению "депутатов" люди не из России должны авторизовываться? т.е. а если человек из России, но захочет через зарубежную соцсеть войти, я у него паспорт должен проверять?
- Далее и отсутствие компонентов, как это всё реализовать на Joomla 5/6?
*

fsv

  • Живу я здесь
  • 2785
  • 413 / 2
Обычная форма регистрации. Переопределить макет, удалить поле с токеном, js-ом вставлять в форму это поле через 3-5 сек. Спамеры сразу все пропали. Это на клиентских сайтах как-то было.
Веб-разработка: заказ. Только новая разработка.
*

creative3d

  • Захожу иногда
  • 200
  • 6 / 0
Любопытно...
Я вот сейчас думаю, что вместе с ИИ получится расширить Akeeba SocialLogin, добавив туда ВК, как минимум. И, может быть, получится не хранить персональную информацию.
Update: глянул План интеграции VK ID, вряд ли его сделать частью Akeeba SocialLogin, надо свой плагин или компонент делать. В интернете кто-то уже сделал, за 5 тыс. продает. Но попозже поразбираюсь, может получится в итоге самому. А лучше если бы спецы подключились, важная задача для всех, общем-то.
« Последнее редактирование: 16.11.2025, 14:35:16 от creative3d »
*

creative3d

  • Захожу иногда
  • 200
  • 6 / 0
С ИИ написал авторизацию. Проверить пока не могу. Нужно в VK ID бизнес зарегистрироваться. Бизнесменом быть необязательно, сказали в поддержке, просто не будет расширенных функций.
Было бы неплохо, если бы нашелся программист, который бы подкорректировал код, если там есть какие-то проблемы.
Код
<!-- Place this code in your Joomla login template -->
<div id="vkid-auth-container">
  <script src="https://unpkg.com/@vkid/sdk@<3.0.0/dist-sdk/umd/index.js"></script>
  <script type="text/javascript">
    if ('VKIDSDK' in window) {
      const VKID = window.VKIDSDK;

      // CONFIGURATION FOR SITE.COM
      VKID.Config.init({
        app: 11111111, // Client ID for site.com
        redirectUrl: 'https://site.com',
        responseMode: VKID.ConfigResponseMode.Callback,
        source: VKID.ConfigSource.LOWCODE,
        scope: '', // No email requested
      });

      const oneTap = new VKID.OneTap();

      oneTap.render({
        container: document.getElementById('vkid-auth-container'),
        showAlternativeLogin: true, // Shows additional OK and Mail.ru buttons
        oauthList: ['ok_ru', 'mail_ru'],
        lang: 3 // English interface, Russian interface = 0
      })
      .on(VKID.WidgetEvents.ERROR, function(error) {
        console.error('VK ID Error:', error);
        alert('Authorization error. Please try again.');
      })
      .on(VKID.OneTapInternalEvents.LOGIN_SUCCESS, function(payload) {
        const code = payload.code;
        const deviceId = payload.device_id;

        // Redirect to Joomla backend for processing
        window.location.href = 'https://site.com/index.php?option=com_ajax&plugin=vkid&format=raw&task=auth&code=' +
          encodeURIComponent(code) + '&device_id=' + encodeURIComponent(deviceId);
      });
    } else {
      console.error('VK ID SDK failed to load');
    }
  </script>
</div>
Далее плагин со структурой:
Код
plugins/authentication/vkid/
├── services/
│   └── provider.php
├── src/
│   └── Extension/
│       └── Vkid.php
├── language/
│   └── en-GB/
│       └── en-GB.plg_authentication_vkid.ini
└── vkid.xml
provider.php
Код
<?php
defined('_JEXEC') or die;

use Joomla\CMS\Extension\PluginInterface;
use Joomla\CMS\Factory;
use Joomla\CMS\Plugin\PluginHelper;
use Joomla\DI\Container;
use Joomla\DI\ServiceProviderInterface;
use Joomla\Event\DispatcherInterface;
use Joomla\Plugin\Authentication\Vkid\Extension\Vkid;

return new class implements ServiceProviderInterface
{
    public function register(Container $container)
    {
        $container->set(
            PluginInterface::class,
            function (Container $container) {
                $plugin = new Vkid(
                    $container->get(DispatcherInterface::class),
                    (array) PluginHelper::getPlugin('authentication', 'vkid')
                );
                $plugin->setApplication(Factory::getApplication());

                return $plugin;
            }
        );
    }
};
Vkid.php
Код
<?php
namespace Joomla\Plugin\Authentication\Vkid\Extension;

defined('_JEXEC') or die;

use Joomla\CMS\Plugin\CMSPlugin;
use Joomla\CMS\Factory;
use Joomla\CMS\User\User;
use Joomla\CMS\User\UserHelper;
use Joomla\CMS\Uri\Uri;
use Joomla\CMS\Http\HttpFactory;
use Joomla\CMS\Language\Text;
use Joomla\CMS\Log\Log;
use Joomla\Registry\Registry;

/**
 * VK ID Authentication Plugin for Joomla 5/6
 */
class Vkid extends CMSPlugin
{
    /**
     * Handle AJAX requests for VK ID authentication
     */
    public function onAjaxVkid()
    {
        $app = Factory::getApplication();
        $input = $app->getInput();

        $this->log('Starting VK ID authentication process');

        if ($input->getString('task')!== 'auth') {
            return json_encode(['success' => false, 'error' => 'Invalid task']);
        }

        $code = $input->getString('code');
        $device_id = $input->getString('device_id');

        if (empty($code)) {
            $this->log('No authorization code provided');
            return json_encode(['success' => false, 'error' => 'No authorization code']);
        }

        try {
            // 1. Exchange code for token (VK ID API)
            $tokenData = $this->exchangeCodeForToken($code);
           
            if (!isset($tokenData['access_token'])) {
                throw new \Exception('Failed to get access token from VK ID');
            }

            // 2. Get user info
            $userInfo = $this->getUserInfo($tokenData['access_token']);
           
            if (!$userInfo) {
                throw new \Exception('Failed to get user information from VK');
            }

            // 3. Create or update user
            $userData = $this->createOrUpdateUser($userInfo);

            // 4. Login user
            $this->loginUser($userData);

            $this->log('VK ID authentication completed successfully for user ID: ' . $userData['id']);

            // Redirect to home page
            return json_encode(['success' => true, 'redirect' => Uri::base()]);

        } catch (\Exception $e) {
            $this->log('Authentication failed: ' . $e->getMessage(), Log::ERROR);
            return json_encode(['success' => false, 'error' => $e->getMessage()]);
        }
    }

    /**
     * Exchange authorization code for access token (VK ID API)
     */
    private function exchangeCodeForToken($code)
    {
        $clientId = $this->params->get('client_id', '');
        $clientSecret = $this->params->get('client_secret', '');
        $siteDomain = $this->params->get('site_domain', '');

        if (empty($clientId) || empty($clientSecret) || empty($siteDomain)) {
            throw new \Exception('VK ID plugin not configured. Check Client ID, Secret and Domain.');
        }

        $redirectUri = 'https://' . $siteDomain;
       
        // VK ID SPECIFIC ENDPOINT - CORRECT
        $url = '[url=https://id.vk.com/oauth2/auth';]https://id.vk.com/oauth2/auth';[/url]

        $params = [
            'grant_type' => 'authorization_code',
            'client_id' => $clientId,
            'client_secret' => $clientSecret,
            'redirect_uri' => $redirectUri,
            'code' => $code
        ];

        $http = HttpFactory::getHttp();
       
        // MUST BE POST REQUEST
        $response = $http->post($url, $params);

        if ($response->code !== 200) {
            throw new \Exception('VK ID API error: HTTP ' . $response->code . ' - ' . $response->body);
        }

        $data = json_decode($response->body, true);

        if (isset($data['error'])) {
            throw new \Exception('VK ID error: ' . ($data['error_description'] ?? $data['error']));
        }

        $this->log('Token exchange successful');
        return $data;
    }

    /**
     * Get user information from VK API
     */
    private function getUserInfo($accessToken)
    {
        // Use .ru domain for API (Russia)
        $url = '[url=https://api.vk.ru/method/users.get?]https://api.vk.ru/method/users.get?[/url]' . http_build_query([
            'fields' => 'first_name,last_name',
            'access_token' => $accessToken,
            'v' => '5.131'
        ]);

        $http = HttpFactory::getHttp();
        $response = $http->get($url);
        $data = json_decode($response->body, true);

        if (isset($data['error'])) {
            throw new \Exception('VK API error: ' . $data['error']['error_msg']);
        }

        return $data['response'][0] ?? null;
    }

    /**
     * Create or update user
     */
    private function createOrUpdateUser($userInfo)
    {
        $vkId = $userInfo['id'];
        $username = 'vk_' . $vkId;
        $email = $username . '@' . $this->params->get('site_domain', 'vk.auth');
        $name = trim(($userInfo['first_name'] ?? ''). ' ' . ($userInfo['last_name'] ?? ''));

        // Check if user exists
        $userId = UserHelper::getUserId($username);
       
        if ($userId) {
            // Update existing user (only name)
            $user = Factory::getUser($userId);
            $user->set('name', $name);
           
            if (!$user->save()) {
                throw new \Exception('Failed to update user: ' . $user->getError());
            }
           
            // Get the password for login
            $user = Factory::getUser($userId);
            $password = $user->password_clear; // Will be empty after first save
           
            // If password_clear is empty (it will be), we need to generate a temporary one
            if (empty($password)) {
                $password = UserHelper::genRandomPassword(16);
                $user->set('password', $password);
                $user->save();
            }
        } else {
            // Create new user
            $user = new User();
            $password = UserHelper::genRandomPassword(16);
           
            $user->set('name', $name);
            $user->set('username', $username);
            $user->set('email', $email);
            $user->set('password', $password);
            $user->set('block', 0);
            $user->set('groups', [2]); // Registered

            if (!$user->save()) {
                throw new \Exception('Failed to create user: ' . $user->getError());
            }

            $userId = $user->id;
            $this->log('New user created: ' . $username . ' (ID: ' . $userId . ')');
        }

        return [
            'id' => $userId,
            'username' => $username,
            'password' => $password
        ];
    }

    /**
     * Login user
     */
    private function loginUser($userData)
    {
        $app = Factory::getApplication();
       
        $credentials = [
            'username' => $userData['username'],
            'password' => $userData['password']
        ];

        $options = [
            'remember' => false,
            'silent' => true,
            'action' => 'core.login.site'
        ];

        $result = $app->login($credentials, $options);

        if ($result !== true) {
            throw new \Exception('Login failed for user: ' . $userData['username']);
        }
       
        $this->log('User logged in successfully: ' . $userData['username']);
    }

    /**
     * Logging
     */
    private function log($message, $type = Log::INFO)
    {
        if ($this->params->get('enable_logging', 0)) {
            Log::add('VK ID: ' . $message, $type, 'plg_authentication_vkid');
        }
    }
}
en-GB.plg_authentication_vkid.ini
Код
PLG_AUTHENTICATION_VKID="VK ID Authentication"
PLG_AUTHENTICATION_VKID_XML_DESCRIPTION="VK ID authentication plugin for Joomla"

; PLG_AUTHENTICATION_VKID_ERROR_GENERIC="Authentication error"
; PLG_AUTHENTICATION_VKID_ERROR_CONFIG="Plugin not configured properly"
; PLG_AUTHENTICATION_VKID_ERROR_TOKEN="Failed to get access token"
; PLG_AUTHENTICATION_VKID_ERROR_USERINFO="Failed to get user information"
; PLG_AUTHENTICATION_VKID_ERROR_CREATE_USER="Failed to create user account"
vkid.xml
Код
<?xml version="1.0" encoding="utf-8"?>
<extension type="plugin" group="authentication" method="upgrade">
    <name>Authentication - VK ID</name>
    <version>1.0.0</version>
    <creationDate>2025-01-01</creationDate>
    <author>Free</author>
    <description>VK ID Authentication for Joomla 5</description>
    <namespace>Joomla\Plugin\Authentication\Vkid</namespace>
   
    <files>
        <folder plugin="vkid">services</folder>
        <folder>src</folder>
        <folder>language</folder>
    </files>
   
    <services>
        <service provider="Joomla\Plugin\Authentication\Vkid\ServiceProvider">
            <arg key="authentication" type="service" id="authentication"/>
        </service>
    </services>
   
    <config>
        <fields name="params">
            <fieldset name="basic">
                <field
                    name="client_id"
                    type="text"
                    label="Client ID"
                    required="true"
                    description="Client ID из кабинета VK ID"/>
               
                <field
                    name="client_secret"
                    type="text"
                    label="Client Secret"
                    required="true"
                    description="Секретный ключ из кабинета VK ID"/>
               
                <field
                    name="site_domain"
                    type="text"
                    label="Site Domain"
                    required="true"
                    description="Без http/https, например: site.com"/>
               
                <field
                    name="enable_logging"
                    type="radio"
                    label="Enable Debug Logging"
                    default="0"
                    class="btn-group btn-group-yesno">
                    <option value="1">JYES</option>
                    <option value="0">JNO</option>
                </field>
            </fieldset>
        </fields>
    </config>
</extension>
« Последнее редактирование: 05.12.2025, 08:59:10 от creative3d »
Чтобы оставить сообщение,
Вам необходимо Войти или Зарегистрироваться
 

Как сделать всплывающее (выдвигающееся) окно на Joomla 5?

Автор sergspb

Ответов: 4
Просмотров: 373
Последний ответ 02.12.2025, 15:03:06
от sergspb
Как правильно сделать цикл?

Автор homelux

Ответов: 1
Просмотров: 280
Последний ответ 28.11.2025, 10:52:55
от fbr
Верхнее меню в версии для ПК как сделать на весь экран?

Автор web1

Ответов: 0
Просмотров: 310
Последний ответ 23.10.2025, 19:52:02
от web1
Как правильно сделать faq?

Автор creative3d

Ответов: 4
Просмотров: 962
Последний ответ 03.07.2025, 09:13:15
от creative3d
Как правильно создать структуру сайта?

Автор donaire

Ответов: 2
Просмотров: 947
Последний ответ 11.02.2025, 23:29:46
от Tavol