Виджеты

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

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

После указанных действий получим виджет обновлений, который поможет следить за текущей версией системы с главной страницы центра администрирования.

Не нашли ответ на свой вопрос в документации? Направьте обращение в службу поддержки или онлайн чат.