Задача
Создать решение, при установке добавляющее в Менеджер Сайта спецблок "Кто сейчас на сайте".
Спецблок
должен выводить загружаемую в асинхронном режиме с сервера информацию о
зарегистрированных пользователях, которые в данный момент находятся на
сайте.
Суть решения
Задача будет реализована следующим образом:
- С помощью генератора решений создадим модуль, имеющий только публичную часть и спецблок.
- Добавим разрешение на открытый доступ к вебсервису решения через 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 );
$this ->oWebService->setPublicAccess( 'whos_online.get' , TRUE);
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;
}
}
$this ->oWebService->ok( $aEvent );
return $aEvent ;
}
|
Спецблок
Для
того, чтобы модуль мог отвечать на запросы к REST.API, необходимо
добавить обработчик этого запроса и разрешить публичный доступ к нему.
Модифицируем _local/modules/data/{genModId}/amiro.whos_online/code/AmiClean_WhosOnline_Frn.php
- Укажем в контроллере модуля на наличие спецблока.
class AmiClean_WhosOnline_Frn extends Hyper_AmiClean_Frn{
public function __construct(AMI_Request $oRequest , AMI_Response $oResponse ){
parent::__construct( $oRequest , $oResponse );
if ( $this ->isSpecblock()){
$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 (
'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> ' ;
$( '#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 и собрать архив
дистрибутива в модуле "Генератор решений".