How To: Действие для переноса копии информационного элемента в другую информационную систему

В данной статье рассмотрим пример реализации в центре администрирования кнопки(действия формы) для переноса выбранных элементов в другую информационную систему.

  1. Первый шаг - создание самого действия. Для этого перейдите в раздел СистемаФормы центра администрирования. Далее необходимо найти стандартную форму списка информационных элементов под названием "Информационные группы и элементы" (id 12). Заходим в список действий формы, создаем новое действие и указываем: 

    Название - "Перенести в ИС" (может быть любым, даже пустым);
    Функция-обработчик - moveToInfSys;
    Пиктограмма - fa fa-sign-out
    Цвет - purple

    Ставим только(!) флаг "Групповая операция".

    После этого сохраняем действие и у нас в писке действие появится новая кнопка.
  2. Следующий шаг - добавление обработчика действия. Редактируем файл bootstrap.php  в корне системы на сервере и в самый конец файла добавляем код:
class Admin_Form_Controller_Observer
{
    static public function onCallmoveToInfSys($oAdmin_Form_Controller, $args)
    {
        list($datasetKey, $oObject, $operation) = $args;

        $oAdmin_Form = $oAdmin_Form_Controller->getAdminForm();

	Core_I18n::instance()->expandLng('informationsystem_item',
		array(
			'moveToInfSys_success' => 'Элемент перенесен успешно!',
		)
	);

        // Проверка на GUID нужной формы
        if ($oAdmin_Form->guid == '0F65DDC4-926A-5A48-65A2-531620F09FD1')
        {
		if (is_null($operation))
		{
			// Original windowId
			$windowId = $oAdmin_Form_Controller->getWindowId();

			$newWindowId = 'Move_' . time();

			$oCore_Html_Entity_Form = Core::factory('Core_Html_Entity_Form');

			$oCore_Html_Entity_Div = Core::factory('Core_Html_Entity_Div')
				->id($newWindowId)
				->add($oCore_Html_Entity_Form);

			$oCore_Html_Entity_Form->action($oAdmin_Form_Controller->getPath())
				->method('post');

			$window_Admin_Form_Controller = clone $oAdmin_Form_Controller;

			// Select на всплывающем окне должен быть найден через ID нового окна, а не id_content
			$window_Admin_Form_Controller->window($newWindowId);

			$oSite = Core_Entity::factory('Site')->getById(CURRENT_SITE);

			$aOptions = array();

			$aInformationsystems = $oSite->Informationsystems->findAll(FALSE);
			foreach ($aInformationsystems as $oInformationsystem)
			{
				$aOptions[$oInformationsystem->id] = $oInformationsystem->name;
			}

			$oAdmin_Form_Entity_Select = Admin_Form_Entity::factory('Select')
				->name('destinationId')
				->id('destinationId')
				->style('width: 280px; float: left')
				->filter(TRUE)
				->options($aOptions)
				->caption('Информационная система')
				// ->value($this->value)
				->controller($window_Admin_Form_Controller);

			$oCore_Html_Entity_Form->add($oAdmin_Form_Entity_Select);

			// Идентификаторы переносимых указываем скрытыми полями в форме, чтобы не превысить лимит GET
			$aChecked = $oAdmin_Form_Controller->getChecked();

			// Clear checked list
			$oAdmin_Form_Controller->clearChecked();

			foreach ($aChecked as $datasetKey => $checkedItems)
			{
				foreach ($checkedItems as $key => $value)
				{
					$oCore_Html_Entity_Form->add(
						Core::factory('Core_Html_Entity_Input')
							->name('hostcms[checked][' . $datasetKey . '][' . $key . ']')
							->value(1)
							->type('hidden')
							//->controller($window_Admin_Form_Controller)
					);
				}
			}

			$oAdmin_Form_Entity_Button = Admin_Form_Entity::factory('Button')
				->name('apply')
				->type('submit')
				->class('applyButton btn btn-blue')
				->value('Перенести')
				->onclick(
					'bootbox.hideAll(); '
					. $oAdmin_Form_Controller->getAdminSendForm(NULL, 'apply')
				)
				->controller($oAdmin_Form_Controller);

			$oCore_Html_Entity_Form
				->add(
					Admin_Form_Entity::factory('Div')
						->class('form-group col-12')
						->add($oAdmin_Form_Entity_Button)
				);

			$oCore_Html_Entity_Div->execute();

			ob_start();

			Core::factory('Core_Html_Entity_Script')
				->value("$(function() {
				$('#{$newWindowId}').HostCMSWindow({ autoOpen: true, destroyOnClose: false, title: 'Выберите информационную систему для переноса', AppendTo: '#{$windowId}', width: 750, height: 140, addContentPadding: true, modal: false, Maximize: false, Minimize: false }); });")
				->execute();

			// Break execution for other
			return array(TRUE, ob_get_clean(), NULL);
		}
		else
		{
			$destinationId = intval(Core_Array::getPost('destinationId'));

			if (is_null($destinationId))
			{
				throw new Core_Exception("destinationId is NULL");
			}

			$oNewInformationsystemItem = clone $oObject;
			$oNewInformationsystemItem->informationsystem_group_id = 0;
			$oNewInformationsystemItem->informationsystem_id = $destinationId;
			$oNewInformationsystemItem->datetime = Core_Date::timestamp2sql(time());
			$oNewInformationsystemItem->save();

			return array(FALSE, '', NULL);
		}
        }
    }
}

Core_Event::attach('Admin_Form_Controller.onCallmoveToInfSys', array('Admin_Form_Controller_Observer', 'onCallmoveToInfSys'));

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