Задача
Создать решение, при установке добавляющее в Менеджер Сайта спецблок "Кто сейчас на сайте".
Спецблок
должен выводить загружаемую в асинхронном режиме с сервера информацию о
зарегистрированных пользователях, которые в данный момент находятся на
сайте.
Суть решения
Задача будет реализована следующим образом:
- С помощью генератора решений создадим модуль, имеющий только публичную часть и спецблок.
- Добавим разрешение на открытый доступ к вебсервису решения через 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 и собрать архив
дистрибутива в модуле "Генератор решений".