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