Центр документации
Карта сайта

Создай визитку сам!


Самоучитель по интеграции дизайна и настройке Amiro.CMS на примере демонстрационной версии пакета Визитка »


Спецблок "Кто сейчас на сайте"

Задача

Создать решение, при установке добавляющее в Менеджер Сайта спецблок "Кто сейчас на сайте".
Спецблок должен выводить загружаемую в асинхронном режиме с сервера информацию о зарегистрированных пользователях, которые в данный момент находятся на сайте.

Суть решения

Задача будет реализована следующим образом:

  • С помощью генератора решений создадим модуль, имеющий только публичную часть и спецблок.
  • Добавим разрешение на открытый доступ к вебсервису решения через REST.API
  • Добавим метод обработки запросов к вебсервису REST.API, который будет возвращать информацию о пользователях с активными сессиями.
  • Спецблок будет содержать JavaScript функционал получения и отображения информации от вебсервиса.

Далее - подробная пошаговая инструкция по реализации решения.

Реализация

Создание кода дистрибутива

Используя решение "Генератор решений" создадим дистрибутив базового класса.

Вебсервис REST.API Amiro.CMS

Для того, чтобы модуль мог отвечать на запросы к REST.API необходимо добавить обработчик этого запроса и разрешить публичный доступ к нему.

Внесем следующие изменения в файл
_local/modules/data/{genModId}/amiro.whos_online/code/AmiClean_WhosOnline_Service.php

public function addWebserviceHandlers(array &$aEvent){
    parent::addWebserviceHandlers($aEvent);
    // Разрешаем доступ к действию 'whos_online.get'
    $this->oWebService->setPublicAccess('whos_online.get', TRUE);
    // Добавляем обработчик действия 'whos_online.get'
    AMI_Event::addHandler('on_webservice_{whos_online.get}_action', array($this, 'handleGetAction'), AMI_Event::MOD_ANY);
    return $aEvent;
}

Реализуем код обработчика.
Обработчик должен выполнить следующие действия:

  • Получить список данных активных пользователей (основываясь на сроке истечения из сессии и времени жизни сессии)
  • Заполнить массив данных в формате, который ожидается на клиенте
  • Отдать полученные результаты запрашивающему скрипту в формате JSON

public function handleGetAction($name, array &$aEvent){
    // Получение списка данных пользователей через модели сессий и пользователей
    $oSessionTable = AMI::getResourceModel('env/session/table');
    $oSessionTable->setDependence('users', 'u', 'i.id_member = u.id', 'JOIN');
    $oSessionTable->setActiveDependence('u');
    $oList =
        $oSessionTable
            ->getList()
            // Добавляем в запрос поля из связанной таблицы пользователей
            ->addColumns(array('id', 'login', 'nickname'), 'u')
            // Добавляем срезку по активности пользователя, активными будем считать тех пользователей,
            // у которых время истечения сессии минус время жизни сессии отличается от текущего времени
            // не более чем на пять минут
            ->addWhereDef(
                DB_Query::getSnippet('AND DATE_SUB(expired, INTERVAL %s MINUTE) > DATE_SUB(NOW(), INTERVAL 5 MINUTE)')
                    ->plain(AMI::getOption('session', 'timeout'))
            )
            ->load();
    // Массив с результатами выборки
    $aEvent['online'] = array();
    $aAddedIds = array();
    foreach($oList as $oItem){
        if(!in_array($oItem->u_id, $aAddedIds)){
            $aEvent['online'][] =
                array(
                    'id'        => $oItem->u_id,
                    'login'     => $oItem->u_login,
                    'nickname'  => $oItem->u_nickname
                );
            $aAddedIds[] = $oItem->u_id;
        }
    }
    // Отправка результата в формате JSON
    $this->oWebService->ok($aEvent);
    return $aEvent;
}

Спецблок

Для того, чтобы модуль мог отвечать на запросы к REST.API, необходимо добавить обработчик этого запроса и разрешить публичный доступ к нему.

Модифицируем _local/modules/data/{genModId}/amiro.whos_online/code/AmiClean_WhosOnline_Frn.php

  1. Укажем в контроллере модуля на наличие спецблока.
class AmiClean_WhosOnline_Frn extends Hyper_AmiClean_Frn{
    public function  __construct(AMI_Request $oRequest, AMI_Response $oResponse){
        parent::__construct($oRequest, $oResponse);
        if($this->isSpecblock()){
            // Если модуль инициализирован в режиме спецблока, то
            // для отображения будет использована компонента типа 'specblock'
            $this->addComponents(array('specblock'));
        }
    }
}

2. Укажем в контроллере компоненты спецблока, что спецблок не использует модель данных.

class AmiClean_WhosOnline_SpecblockFrn extends AMI_ModSpecblock{
    protected $useModel = FALSE;
}

3. В методе отображении спецблока выполним обработку сета specblock шаблона модуля с передачей в него необходимых данных.

class AmiClean_WhosOnline_SpecblockViewFrn extends Hyper_AmiClean_ComponentViewFrn{
    public function get(){
        // Данные необходимые спецблоку на клиенте
        $aScope = array(
            // ID текущей инстанции модуля
            'modId' => $this->getModId(),
            // Страница профиля пользователя
            'membersLink' => AMI_PageManager::getModLink('members', AMI_Registry::get('lang'))
        );
        return $this->parse('specblock', $aScope);
    }
}

4. Добавим разрешение открытого доступа к вебсервису через REST.API

_local/modules/data/{genModId}/amiro.whos_online/distrib/configs/ami_clean/whos_online/install_after.php

<?php
 
AMI::getSingleton('ami_webservice/service')->allowPublicAccess($this->oArgs->modId);

 

5. В шаблоне компоненты спецблока модуля пропишем сет спецблока.

_local/modules/data/{genModId}/amiro.whos_online/distrib/configs/ami_clean/whos_online/templates_frn/--modId--_specblock.tpl

%%include_language "templates/lang/modules/_specblock.lng"%%
<!--#set var="specblock" value="
<h2>%%users_online%%</h2>
<div id="whos_online"></div>
<script>
    var membersLink = '';
    
    var aParams = {
        service: 'ami_webservice',
        action: 'whos_online.get',
        appToken: 'app_token_public',
        version: '1.1',
        modId : '',
        fullEnv: 1
    };
    
    $.getJSON(frontBaseHref + 'ami_service.php', aParams, function(data){
        
        var aData = (typeof(data.data) != 'undefined') ? data.data : {};
        if((typeof(aData.errorCode) == 'undefined') || (aData.errorCode != 'OK')){
            $('#whos_online').html('%%error_message%%');
            return;
        }
        // Ссылка на профиль пользователя
        var profileLink= frontBaseHref + '/' + membersLink + '?action=view&id=';
        for(var i=0; i<aData.online.members.length; i++){
            var aMember = aData.online.members[i];
            var username = (aMember.nickname != '') ? aMember.nickname : aMember.login;
            var memberHTML = '<a href="' + profileLink + aMember.id + '">' + aMember.login + '</a>&nbsp;';
            $('#whos_online').append(memberHTML);
        }
    });
</script>   
"-->

6. В файл локализаций спецблока модуля добавим необходимые языковые переменные.
_local/modules/data/{genModId}/amiro.whos_online/distrib/configs/ami_clean/whos_online/locales_frn/--modId--_specblock.lng

%%users_online%en%%
Users online
%%users_online%ru%%
Сейчас на сайте
 
%%error_message%en%%
Data error!
%%error_message%ru%%
Ошибка получения данных!

7. Добавим в Meta-файл модуля заголовки и описание спецблока.

_local/modules/data/{genModId}/amiro.whos_online/code/AmiClean_WhosOnline_Meta.php

protected $aCaptions = array(
    '' => array(
        'specblock' => array(
            'obligatory' => TRUE,
            'type' => self::CAPTION_TYPE_STRING,
            'locales' => array(
                'en' => array(
                    'name' => 'Specblock caption for Site Manager',
                    'caption' => 'Who is online now',
                ),
                'ru' => array(
                    'name' => 'Название спецблока для менеджера сайта',
                    'caption' => 'Кто сейчас на сайте',
                ),
            ),
        ),
    ),
);

8. Поскольку, спецблок не имеет настроек, удалим файлы:
_local/modules/data/{genModId}/amiro.whos_online/distrib/configs/ami_clean/whos_online/declaration/options.php
_local/modules/data/{genModId}/amiro.whos_online/distrib/configs/ami_clean/whos_online/declaration/rules.php 


9. В файле свойств модуля оставим следующие строки

_local/modules/data/{genModId}/amiro.whos_online/distrib/configs/ami_clean/whos_online/declaration/properties.php

<?php
// {{}}
if($oDeclarator->isRegistered('')){
    $oMod = $oDeclarator->getModule('');
    $oMod->setProperty('front_request_types', array('plain'));
    $oMod->setProperty('dont_show_in_pm', true);
    $oMod->setProperty('spec_blocks', array('spec_small_'));
}

На этом основная часть разработки решения завершена. Остается поправить содержимое файла manifest.xml и собрать архив дистрибутива в модуле "Генератор решений".

Установка и настройка Руководство пользователя Интеграция дизайна Разработчикам (API)
 2000 – 2021 © Amiro.CMS Все права защищены.