Виджеты в центре администрирования
Виджеты предназначены для вывода различной информации в центре администрирования. виджеты можно создавать как для стандартных модулей системы, так и для собственных модулей.
Создадим виджет стандартного модуля "Обновления" для проверки и установки обновлений. Для шаблона default файла виджета модуля обновлений будет располагаться /modules/skin/default/module/update/module.php, где module.php основной файл виджета, /update/ — название директории виджета (может быть совершенно любым).
Создадим файл в редакторе, например, Notepad++ и добавим следующий код (кодировка UTF-8 без BOM):
<?php
defined('HOSTCMS') || exit('HostCMS: access denied.');
/**
* Updates.
*
* @package HostCMS 6\Skin
* @version 6.x
* @author Hostmake LLC
* @copyright © 2005-2012 ООО "Хостмэйк" (Hostmake LLC), https://www.hostcms.ru
*/
class Skin_Default_Module_Update_Module extends Update_Module
{
protected $_skinName = 'default';
protected $_moduleName = 'update';
/**
* Constructor.
*/
public function __construct()
{
parent::__construct();
/* Заголовок виджета в выпадающем списке */
$this->_adminPages = array(
77 => array('title' => Core::_('Update.widget_title'))
);
}
public function adminPage($type = 0, $ajax = FALSE)
{
/* Идентификатор окна виджета */
$windowId = 'modalUpdates';
/* Путь к изображению виджета в выпадающем списке */
$shortcutImg = "/modules/skin/{$this->_skinName}/images/module/{$this->_moduleName}.png";
/* Заголовок виджета */
$shortcutTitle = Core::_('Update.widget_title');
/* Путь к файлу обновлений */
$updateFilePath = Update_Controller::instance()->getFilePath();
$getUpdates = Update_Controller::instance()->setUpdateOptions()->getUpdates();
if (!$ajax)
{
$oModalWindow = Core::factory('Core_Html_Entity_Div')
->id($windowId)
->class('widget')
->title($shortcutTitle)
->add($oModalWindowSub = Core::factory('Core_Html_Entity_Div')
->class('sub')
);
}
else
{
$oModalWindowSub = Core::factory('Core_Html_Entity_Div');
}
$iAdmin_Form_Id = 140;
$oAdmin_Form = Core_Entity::factory('Admin_Form', $iAdmin_Form_Id);
$oAdmin_Form_Controller = new Admin_Form_Controller($oAdmin_Form);
$aReturn = Update_Controller::instance()->parseUpdates();
/* Массив ошибок обновления */
$error = $aReturn['error'];
/* Срок истечения периода технической поддержки */
$expiration_of_support = $aReturn['expiration_of_support'];
$sUpdateHref = '/admin/update/index.php'; //Путь к модулю обновлений
/* Получаем список обновлений */
foreach ($aReturn['entities'] as $oEntity)
{
$id = $oEntity->id;
$name = html_entity_decode($oEntity->name, ENT_COMPAT, 'UTF-8');
$description = html_entity_decode($oEntity->description, ENT_COMPAT, 'UTF-8');
$oModalWindowSub
->add(
Core::factory('Core_Html_Entity_Div')
->class('comment comment0')
->add(
Core::factory('Core_Html_Entity_Div')
->class('corner')
)
->add(
Core::factory('Core_Html_Entity_Span')
->value(Core::_('Update.widget_text') . $name)
)
->add(
Core::factory('Core_Html_Entity_Div')
->class('clear')
)
/* Кнопка установки обновления из виджета */
->add(
Core::factory('Core_Html_Entity_Div')
->class('action')
->add(
Core::factory('Core_Html_Entity_A')
->href(
$oAdmin_Form_Controller->getAdminActionLoadHref($sUpdateHref, 'install', NULL, 0, $id)
)
)
->title(
Core::_('Update.widget_istall_update')
)
->onclick(
"$.widgetRequest({path: '" . $oAdmin_Form_Controller->getAdminActionLoadHref($sUpdateHref, 'install', NULL, 0, $id) . "', context: $('#{$windowId}')}); return false"
)
->add(
Core::factory('Core_Html_Entity_Img')
->src('/modules/skin/' . $this->_skinName . '/images/action/unchecked.png')
)
)
/* Показ номера обновления */
->add(
Core::factory('Core_Html_Entity_Div')
->class('date')
->value($id)
)
);
}
/* Если нет обновлений - выводим информацию о периоде поддержки */
if (!count($aReturn['entities']) && !$error)
{
if ($expiration_of_support && !defined('IS_HOSTCMS_FREE'))
{
$f_expiration_of_support = Core_Date::sql2date($expiration_of_support);
$message = Core_Date::sql2timestamp($expiration_of_support) > time()
? Core::_('Update.widget_support_available') . $f_expiration_of_support
: Core::_('Update.widget_support_has_expired') . $f_expiration_of_support;
}
$oModalWindowSub
->add(
Core::factory('Core_Html_Entity_Div')
->class('event event1')
->add(
Core::factory('Core_Html_Entity_Div')
->class('corner')
)
->add(
Core::factory('Core_Html_Entity_Span')
->value(Core::_('Update.isLastUpdate'))
)
->add(
Core::factory('Core_Html_Entity_Div')
->class('clear')
)
)
->add(
Core::factory('Core_Html_Entity_Div')
->class('event event' . (Core_Date::sql2timestamp($expiration_of_support) > time() ? 1 : 4))
->add(
Core::factory('Core_Html_Entity_Div')
->class('corner')
)
->add(
Core::factory('Core_Html_Entity_Span')
->value($message)
)
->add(
Core::factory('Core_Html_Entity_Div')
->class('clear')
)
);
}
/* Если есть ошибки - выводим её текст */
elseif ($error)
{
$oModalWindowSub
->add(
Core::factory('Core_Html_Entity_Div')
->class('event event4')
->add(
Core::factory('Core_Html_Entity_Div')
->class('corner')
)
->add(
Core::factory('Core_Html_Entity_Span')
->value(Core::_('Update.server_error_respond_' . $error))
)
->add(
Core::factory('Core_Html_Entity_Div')
->class('clear')
)
);
}
/* Вывод ссылки на все обновления */
$oModalWindowSub->add(
Core::factory('Core_Html_Entity_Div')
->class('widgetDescription')
->add(
Core::factory('Core_Html_Entity_Img')
->src('/modules/skin/' . $this->_skinName . '/images/widget/comment.png')
)->add(
Core::factory('Core_Html_Entity_Div')
->add(
Core::factory('Core_Html_Entity_A')
->id('widgetUpdatesList')
->href($sUpdateHref)
->value(Core::_('Update.widget_updates_list'))
)
->add(
Core::factory('Core_Html_Entity_Script')
->type('text/javascript')
->value("$('#widgetUpdatesList').linkShortcut({path: '{$sUpdateHref}', shortcutImg: '{$shortcutImg}', shortcutTitle: '{$shortcutTitle}', Minimize: true, Closable: true});")
)
)
);
/* Настройка размеров виджета */
if (!$ajax)
{
$oUser = Core_Entity::factory('User')->getCurrent();
$oModule = Core_Entity::factory('Module')->getByPath($this->_moduleName);
$module_id = $oModule->id;
$oUser_Setting = $oUser->User_Settings->getByModuleIdAndTypeAndEntityId($module_id, 77, 0);
if (is_null($oUser_Setting))
{
$oUser_Setting = Core_Entity::factory('User_Setting');
$oUser_Setting->position_x = "'right'";
$oUser_Setting->position_y = 85;
$oUser_Setting->width = 250;
$oUser_Setting->height = 260;
}
$oModalWindow
->add(
Core::factory('Core_Html_Entity_Script')
->type('text/javascript')
->value("$(function(){
$('#{$windowId}').widgetWindow({
position: [{$oUser_Setting->position_x}, {$oUser_Setting->position_y}],
width: {$oUser_Setting->width},
height: {$oUser_Setting->height},
moduleId: '{$module_id}',
path: '/admin/index.php?ajaxWidgetLoad&moduleId={$module_id}&type=0'
});
});")
)
->execute();
}
else
{
$oModalWindowSub->execute();
}
return $this;
}
}
В виджете используются подстановки из языковых файлов модуля. Так как виджет обращается к модулю "Обновления", то необходимо добавить в языковые файлы модуля /modules/update/i18n/en.php и /modules/update/i18n/ru.php следующие блоки:
1. Для русского языка /modules/update/i18n/ru.php:
'widget_title' => 'Обновления', 'widget_text' => 'Обновление: ', 'widget_istall_update' => 'Установить обновление', 'widget_updates_list' => 'Список обновлений', 'widget_support_available' => 'Период технической поддержки доступен до ', 'widget_support_has_expired' => 'Период технической поддержки истек ',
2. Для английского языка /modules/update/i18n/en.php:
'widget_title' => 'Updates', 'widget_text' => 'Update: ', 'widget_istall_update' => 'Install update', 'widget_updates_list' => 'Updates list', 'widget_support_available' => 'Period of technical support has available until ', 'widget_support_has_expired' => 'Period of technical support has expired at ',
После указанных действий получим виджет обновлений, который поможет следить за текущей версией системы с главной страницы центра администрирования.