%PDF- %PDF-
Mini Shell

Mini Shell

Direktori : /home/bitrix/www/bitrix/modules/controller/classes/general/
Upload File :
Create Path :
Current File : /home/bitrix/www/bitrix/modules/controller/classes/general/controllergroup.php

<?php
require_once($_SERVER["DOCUMENT_ROOT"].BX_ROOT."/modules/main/admin_tools.php");
IncludeModuleLangFile(__FILE__);

class CControllerGroup
{
	public static function CheckDefaultUpdate()
	{
		$dbr_groups = CControllerGroup::GetList(Array(), Array("<UPDATE_PERIOD" => 0));
		while ($ar_group = $dbr_groups->Fetch())
			CControllerGroup::SetGroupSettings($ar_group["ID"]);

		return "CControllerGroup::CheckDefaultUpdate();";
	}

	public static function CheckFields(&$arFields, $ID = false)
	{
		$arMsg = Array();

		if ($ID > 0)
			unset($arFields["ID"]);

		global $DB;
		if (($ID === false || is_set($arFields, "NAME")) && strlen($arFields["NAME"]) <= 0)
			$arMsg[] = array("id" => "NAME", "text" => GetMessage("CTRLR_GRP_ERR_NAME"));

		if (isset($arFields["UPDATE_PERIOD"]) && ($arFields["UPDATE_PERIOD"] < 0 || trim($arFields["UPDATE_PERIOD"]) == ''))
			$arFields["UPDATE_PERIOD"] = -1;

		if (count($arMsg) > 0)
		{
			$e = new CAdminException($arMsg);
			$GLOBALS["APPLICATION"]->ThrowException($e);
			return false;
		}

		global $USER;
		if (!is_set($arFields, "MODIFIED_BY") && is_object($USER))
			$arFields["MODIFIED_BY"] = $USER->GetID();
		if ($ID === false && !is_set($arFields, "CREATED_BY") && is_object($USER))
			$arFields["CREATED_BY"] = $USER->GetID();
		if ($ID === false && !is_set($arFields, "DATE_CREATE"))
			$arFields["~DATE_CREATE"] = $DB->CurrentTimeFunction();

		return true;
	}

	public static function Add($arFields)
	{
		global $DB, $USER_FIELD_MANAGER;

		if (!CControllerGroup::CheckFields($arFields))
			return false;

		if (!$USER_FIELD_MANAGER->CheckFields("CONTROLLER_GROUP", 0, $arFields))
			return false;

		unset($arFields["TIMESTAMP_X"]);
		unset($arFields["~TIMESTAMP_X"]);

		$ID = $DB->Add("b_controller_group", $arFields, array("DESCRIPTION", "INSTALL_INFO", "UNINSTALL_INFO", "INSTALL_PHP", "UNINSTALL_PHP"));

		$USER_FIELD_MANAGER->Update("CONTROLLER_GROUP", $ID, $arFields);

		if (isset($arFields["UPDATE_PERIOD"]))
			CControllerGroup::__UpdateAgentPeriod($ID, $arFields["UPDATE_PERIOD"]);

		if (isset($arFields["COUNTER_UPDATE_PERIOD"]))
			CControllerGroup::__CounterUpdateAgentPeriod($ID, $arFields["COUNTER_UPDATE_PERIOD"]);

		return $ID;

	}

	public static function Update($ID, $arFields)
	{
		global $DB, $USER_FIELD_MANAGER;

		if (!CControllerGroup::CheckFields($arFields, $ID))
			return false;

		if (!$USER_FIELD_MANAGER->CheckFields("CONTROLLER_GROUP", $ID, $arFields))
			return false;

		if (isset($arFields["UPDATE_PERIOD"]) || isset($arFields["COUNTER_UPDATE_PERIOD"]))
		{
			$dbr_group = CControllerGroup::GetByID($ID);
			$ar_group = $dbr_group->Fetch();
			if (isset($arFields["UPDATE_PERIOD"]) && $ar_group["UPDATE_PERIOD"] != $arFields["UPDATE_PERIOD"])
				CControllerGroup::__UpdateAgentPeriod($ID, $arFields["UPDATE_PERIOD"]);
			if (isset($arFields["COUNTER_UPDATE_PERIOD"]) && $ar_group["COUNTER_UPDATE_PERIOD"] != $arFields["COUNTER_UPDATE_PERIOD"])
				CControllerGroup::__CounterUpdateAgentPeriod($ID, $arFields["COUNTER_UPDATE_PERIOD"]);
		}

		unset($arFields["TIMESTAMP_X"]);
		$arFields["~TIMESTAMP_X"] = $DB->CurrentTimeFunction();

		$arUpdateBinds = array();
		$strUpdate = $DB->PrepareUpdateBind("b_controller_group", $arFields, "", false, $arUpdateBinds);

		$strSql = "UPDATE b_controller_group SET ".$strUpdate." WHERE ID=".intval($ID);

		$arBinds = array();
		foreach ($arUpdateBinds as $field_id)
			$arBinds[$field_id] = $arFields[$field_id];

		$res = $DB->QueryBind($strSql, $arBinds);
		if ($res)
		{
			$USER_FIELD_MANAGER->Update("CONTROLLER_GROUP", $ID, $arFields);
		}

		if (!$res)
			return false;
		else
			return true;
	}

	public static function __UpdateAgentPeriod($group_id, $time)
	{
		$group_id = intval($group_id);
		$time = intval($time);

		CAgent::RemoveAgent("CControllerGroup::__UpdateSettingsAgent(".$group_id.");", "controller");
		if ($time > 0)
			CAgent::AddAgent("CControllerGroup::__UpdateSettingsAgent(".$group_id.");", "controller", "N", $time * 60);
	}

	public static function __CounterUpdateAgentPeriod($group_id, $time)
	{
		$group_id = intval($group_id);
		$time = intval($time);

		CAgent::RemoveAgent("CControllerGroup::__UpdateCountersAgent(".$group_id.");", "controller");
		if ($time > 0)
			CAgent::AddAgent("CControllerGroup::__UpdateCountersAgent(".$group_id.");", "controller", "N", $time * 60);
	}

	public static function Delete($ID)
	{
		global $DB, $USER_FIELD_MANAGER;
		$ID = intval($ID);
		if ($ID == 1)
		{
			$e = new CApplicationException(GetMessage("CTRL_GRP_DEL_ERR_DEF"));
			$GLOBALS["APPLICATION"]->ThrowException($e);
			return false;
		}
		$dbres = $DB->Query("SELECT COUNT('x') as C FROM b_controller_member WHERE CONTROLLER_GROUP_ID=".$ID);
		$arres = $dbres->Fetch();
		if ($arres["C"] > 0)
		{
			$e = new CApplicationException(GetMessage("CTRLR_GRP_DEL_ERR"));
			$GLOBALS["APPLICATION"]->ThrowException($e);
			return false;
		}

		$USER_FIELD_MANAGER->Delete("CONTROLLER_GROUP", $ID);
		$DB->Query("DELETE FROM b_controller_counter_group WHERE CONTROLLER_GROUP_ID = ".$ID);
		$DB->Query("DELETE FROM b_controller_group WHERE ID=".$ID);
		return true;
	}

	public static function GetList($arOrder = Array(), $arFilter = Array(), $arSelect = Array())
	{
		global $DB;

		$obUserFieldsSql = new CUserTypeSQL;
		$obUserFieldsSql->SetEntity("CONTROLLER_GROUP", "G.ID");
		$obUserFieldsSql->SetSelect($arSelect);
		$obUserFieldsSql->SetFilter($arFilter);
		$obUserFieldsSql->SetOrder($arOrder);

		static $arFields = array(
			"ID" => array(
				"FIELD_NAME" => "G.ID",
				"FIELD_TYPE" => "int",
			),
			"NAME" => array(
				"FIELD_NAME" => "G.NAME",
				"FIELD_TYPE" => "string",
			),
			"TIMESTAMP_X" => array(
				"FIELD_NAME" => "G.TIMESTAMP_X",
				"FIELD_TYPE" => "datetime",
			),
			"MODIFIED_BY" => array(
				"FIELD_NAME" => "G.MODIFIED_BY",
				"FIELD_TYPE" => "int",
			),
			"UPDATE_PERIOD" => array(
				"FIELD_NAME" => "G.UPDATE_PERIOD",
				"FIELD_TYPE" => "int",
			),
			"MODIFIED_BY_USER" => array(
				"FIELD_TYPE" => "string",
			),
			"DATE_CREATE" => array(
				"FIELD_NAME" => "G.DATE_CREATE",
				"FIELD_TYPE" => "datetime",
			),
			"CREATED_BY" => array(
				"FIELD_NAME" => "G.CREATED_BY",
				"FIELD_TYPE" => "int",
			),
			"CREATED_BY_USER" => array(
				"FIELD_TYPE" => "string",
			),
			"TRIAL_PERIOD" => array(
				"FIELD_NAME" => "G.TRIAL_PERIOD",
				"FIELD_TYPE" => "int",
			),
			"COUNTER_UPDATE_PERIOD" => array(
				"FIELD_NAME" => "G.COUNTER_UPDATE_PERIOD",
				"FIELD_TYPE" => "int",
			),
			"CHECK_COUNTER_FREE_SPACE" => array(
				"FIELD_NAME" => "G.CHECK_COUNTER_FREE_SPACE",
				"FIELD_TYPE" => "string",
			),
			"CHECK_COUNTER_SITES" => array(
				"FIELD_NAME" => "G.CHECK_COUNTER_SITES",
				"FIELD_TYPE" => "string",
			),
			"CHECK_COUNTER_USERS" => array(
				"FIELD_NAME" => "G.CHECK_COUNTER_USERS",
				"FIELD_TYPE" => "string",
			),
			"CHECK_COUNTER_LAST_AUTH" => array(
				"FIELD_NAME" => "G.CHECK_COUNTER_LAST_AUTH",
				"FIELD_TYPE" => "string",
			),
		);

		$arFields["MODIFIED_BY_USER"]["FIELD_NAME"] = $DB->Concat("UM.LOGIN", "UM.NAME", "UM.LAST_NAME");
		$arFields["CREATED_BY_USER"]["FIELD_NAME"] = $DB->Concat("UC.LOGIN", "UC.NAME", "UC.LAST_NAME");

		$obWhere = new CSQLWhere;
		$obWhere->SetFields($arFields);

		$arFilterNew = Array();
		foreach ($arFilter as $k => $value)
			if (strlen($value) > 0 || $value === false)
				$arFilterNew[$k] = $value;

		$strWhere = "1 = 1";
		$r = $obWhere->GetQuery($arFilterNew);
		if (strlen($r) > 0)
			$strWhere .= " AND (".$r.") ";

		$r = $obUserFieldsSql->GetFilter();
		if (strlen($r) > 0)
			$strWhere .= " AND (".$r.") ";

		$strSql = "
			SELECT ".($obUserFieldsSql->GetDistinct()? "DISTINCT": "")." G.*
				,UC.LOGIN as CREATED_BY_LOGIN
				,UC.NAME as CREATED_BY_NAME
				,UC.LAST_NAME as CREATED_BY_LAST_NAME
				,UM.LOGIN as MODIFIED_BY_LOGIN
				,UM.NAME as MODIFIED_BY_NAME
				,UM.LAST_NAME as MODIFIED_BY_LAST_NAME
				,".$DB->DateToCharFunction("G.TIMESTAMP_X")." as TIMESTAMP_X
				,".$DB->DateToCharFunction("G.DATE_CREATE")." as DATE_CREATE
				".$obUserFieldsSql->GetSelect()."
			FROM b_controller_group G
				LEFT JOIN b_user UC ON UC.ID=G.CREATED_BY
				LEFT JOIN b_user UM ON UM.ID=G.MODIFIED_BY
				".$obWhere->GetJoins()."
				".$obUserFieldsSql->GetJoin("G.ID")."
			WHERE ".$strWhere."
			".CControllerAgent::_OrderBy($arOrder, $arFields, $obUserFieldsSql)."
		";

		$dbr = $DB->Query($strSql);
		$dbr->is_filtered = (strlen($strWhere) > 0);
		return $dbr;
	}

	public static function GetByID($ID)
	{
		return CControllerGroup::GetList(Array(), Array("ID" => intval($ID)));
	}

	public static function GetGroupSettings($group_id)
	{
		$dbr_group = CControllerGroup::GetByID($group_id);
		if ($ar_group = $dbr_group->Fetch())
		{
			$arSettings = unserialize($ar_group["INSTALL_INFO"]);
			$strCommand = CControllerGroupSettings::GeneratePHPInstall($arSettings);
			return $strCommand.$ar_group["INSTALL_PHP"];
		}

		return false;
	}

	public static function RunCommand($group_id, $php_script, $arParameters = Array())
	{
		global $DB;
		$group_id = intval($group_id);

		if ($php_script == 'COUNTERS_UPDATE' || $php_script == 'SET_SETTINGS' || $php_script == 'UPDATE')
		{
			$task_id = $php_script;
			$php_script = "";
		}
		else
		{
			$task_id = 'REMOTE_COMMAND';
		}

		$arUpdateFields = array(
			"~DATE_CREATE" => $DB->CurrentTimeFunction(),
			"INIT_EXECUTE" => (strlen($php_script)? $php_script: false),
			"INIT_EXECUTE_PARAMS" => (count($arParameters)? serialize($arParameters): false),
		);
		$arUpdateBinds = array();
		$strUpdate = "
			UPDATE b_controller_task
			SET ".$DB->PrepareUpdateBind("b_controller_task", $arUpdateFields, "", false, $arUpdateBinds)."
			WHERE
				CONTROLLER_MEMBER_ID = #'MID'#
				AND TASK_ID = '$task_id'
				AND DATE_EXECUTE IS NULL
		";

		$arInsertFields = array(
			"~DATE_CREATE" => $DB->CurrentTimeFunction(),
			"TASK_ID" => $task_id,
			"INIT_EXECUTE" => (strlen($php_script)? $php_script: false),
			"INIT_EXECUTE_PARAMS" => (count($arParameters)? serialize($arParameters): false),
			"DATE_EXECUTE" => false,
		);

		$strSql = "SELECT M.ID FROM b_controller_member M WHERE M.CONTROLLER_GROUP_ID=".$group_id." AND M.ACTIVE = 'Y'";
		$rsMembers = $DB->Query($strSql);
		while ($arMember = $rsMembers->Fetch())
		{
			$arBinds = array();
			foreach ($arUpdateBinds as $field_id)
				$arBinds[$field_id] = $arUpdateFields[$field_id];
			$rsUpdate = $DB->QueryBind(str_replace("#'MID'#", $arMember["ID"], $strUpdate), $arBinds);

			if ($rsUpdate->AffectedRowsCount() <= 0)
			{
				$arInsertFields["CONTROLLER_MEMBER_ID"] = $arMember["ID"];
				$DB->Add("b_controller_task", $arInsertFields, array("INIT_EXECUTE", "INIT_EXECUTE_PARAMS"));
			}
		}
	}

	public static function __UpdateCountersAgent($group_id)
	{
		CControllerGroup::UpdateCounters($group_id);
		return "CControllerGroup::__UpdateCountersAgent(".$group_id.");";
	}

	public static function UpdateCounters($group_id)
	{
		CControllerGroup::RunCommand($group_id, 'COUNTERS_UPDATE');
	}

	public static function __UpdateSettingsAgent($group_id)
	{
		CControllerGroup::SetGroupSettings($group_id);
		return "CControllerGroup::__UpdateSettingsAgent(".$group_id.");";
	}

	public static function SetGroupSettings($group_id)
	{
		CControllerGroup::RunCommand($group_id, 'SET_SETTINGS');
	}

	public static function SiteUpdate($group_id)
	{
		CControllerGroup::RunCommand($group_id, 'UPDATE');
	}
}

class CControllerGroupSettings
{
	public static function GetData()
	{
		$arModules = Array(
			"main" => Array(
				"name" => GetMessage("CTRLR_GRP_SET_MAIN_NAME"),
				"options" => Array(
					"component_cache_on" => Array(GetMessage("CTRLR_GRP_SET_MAIN_OPT_CACHE"), "N", Array("checkbox", "Y")),
					"error_reporting" => Array(
						GetMessage("CTRLR_GRP_SET_MAIN_OPT_ERRREP"),
						85,
						Array("selectbox",
							Array(
								"85" => GetMessage("CTRLR_GRP_SET_MAIN_OPT_ERRREP_1"),
								"2039" => GetMessage("CTRLR_GRP_SET_MAIN_OPT_ERRREP_2"),
								"0" => GetMessage("CTRLR_GRP_SET_MAIN_OPT_ERRREP_3")
							)
						)
					),
					"all_bcc" => Array(GetMessage("CTRLR_GRP_SET_MAIN_OPT_EMAIL"), "", Array("text", 30)),
					"disk_space" => Array(GetMessage("CTRLR_GRP_SET_MAIN_OPT_QUOTA"), "", Array("text", 30)),

					"__registration" => GetMessage("CTRLR_GRP_SET_MAIN_OPT_REG"),
					"new_user_registration" => Array(GetMessage("CTRLR_GRP_SET_MAIN_OPT_CANREG"), "N", Array("checkbox", "Y")),
					"store_password" => Array(GetMessage("CTRLR_GRP_SET_MAIN_OPT_STORE_AUTH"), "Y", Array("checkbox", "Y")),
					"captcha_registration" => Array(GetMessage("CTRLR_GRP_SET_MAIN_OPT_CAPTCHA"), "N", Array("checkbox", "Y")),
					"auth_comp2" => Array(GetMessage("CTRLR_GRP_SET_MAIN_OPT_C2_0"), "N", Array("checkbox", "Y")),
					"auth_controller_prefix" => Array(GetMessage("CTRLR_GRP_SET_MAIN_PREFIX"), "controller", Array("text", "30")),
					"auth_controller_sso" => Array(GetMessage("CTRLR_GRP_SET_MAIN_AUTH_REM"), "N", Array("checkbox", "Y")),

					"__updates" => GetMessage("CTRLR_GRP_SET_MAIN_OPT_UPD"),
					"update_site" => Array(GetMessage("CTRLR_GRP_SET_MAIN_OPT_UPD_SER"), "", Array("text", 30)),
					"update_site_proxy_addr" => Array(GetMessage("CTRLR_GRP_SET_MAIN_OPT_UPD_PROXY"), "", Array("text", 30)),
					"update_site_proxy_port" => Array(GetMessage("CTRLR_GRP_SET_MAIN_OPT_UPD_PROXY_PORT"), "", Array("text", 30)),
					"update_site_proxy_user" => Array(GetMessage("CTRLR_GRP_SET_MAIN_OPT_UPD_PROXY_NAME"), "", Array("text", 30)),
					"update_site_proxy_pass" => Array(GetMessage("CTRLR_GRP_SET_MAIN_OPT_UPD_PROXY_PASS"), "", Array("text", 30)),
					"strong_update_check" => Array(GetMessage("CTRLR_GRP_SET_MAIN_OPT_UPD_STRONG"), "Y", Array("checkbox", "Y")),
					"stable_versions_only" => Array(GetMessage("CTRLR_GRP_SET_MAIN_OPT_UPD_STABLE"), "Y", Array("checkbox", "Y")),
				),
			),
			"fileman" => Array(
				"name" => GetMessage("CTRLR_GRP_SET_FILEMAN"),
				"options" => Array(
					"~allowed_components" => Array(GetMessage("CTRLR_GRP_SET_FILEMAN_OPT_AV_COMP"), "", Array("textarea", 5, 30)),
				),
			),
			"advertising" => Array("name" => GetMessage("CTRLR_GRP_SET_ADVERTISING")),
			"bitrix24" => Array("name" => GetMessage("CTRLR_GRP_SET_BITRIX24")),
			"bizproc" => Array("name" => GetMessage("CTRLR_GRP_SET_BIZPROC")),
			"bizprocdesigner" => Array("name" => GetMessage("CTRLR_GRP_SET_BIZPROCDESIGNER")),
			"blog" => Array("name" => GetMessage("CTRLR_GRP_SET_BLOG")),
			"calendar" => Array("name" => GetMessage("CTRLR_GRP_SET_CALENDAR")),
			"catalog" => Array("name" => GetMessage("CTRLR_GRP_SET_CATALOG")),
			"clouds" => Array("name" => GetMessage("CTRLR_GRP_SET_CLOUDS")),
			"cluster" => Array("name" => GetMessage("CTRLR_GRP_SET_CLUSTER")),
			"compression" => Array("name" => GetMessage("CTRLR_GRP_SET_COMPRESSION")),
			"controller" => Array("name" => GetMessage("CTRLR_GRP_SET_CONTROLLER")),
			"crm" => Array("name" => GetMessage("CTRLR_GRP_SET_CRM")),
			"currency" => Array("name" => GetMessage("CTRLR_GRP_SET_CURRENCY")),
			"dav" => Array("name" => GetMessage("CTRLR_GRP_SET_DAV")),
			"extranet" => Array("name" => GetMessage("CTRLR_GRP_SET_EXTRANET")),
			"form" => Array("name" => GetMessage("CTRLR_GRP_SET_FORM")),
			"forum" => Array("name" => GetMessage("CTRLR_GRP_SET_FORUM")),
			"iblock" => Array("name" => GetMessage("CTRLR_GRP_SET_IBLOCK")),
			"idea" => Array("name" => GetMessage("CTRLR_GRP_SET_IDEA")),
			"intranet" => Array("name" => GetMessage("CTRLR_GRP_SET_INTRANET")),
			"ldap" => Array("name" => GetMessage("CTRLR_GRP_SET_LDAP")),
			"learning" => Array("name" => GetMessage("CTRLR_GRP_SET_LEARNING")),
			"lists" => Array("name" => GetMessage("CTRLR_GRP_SET_LISTS")),
			"mail" => Array("name" => GetMessage("CTRLR_GRP_SET_MAIL")),
			"meeting" => Array("name" => GetMessage("CTRLR_GRP_SET_MEETING")),
			"perfmon" => Array("name" => GetMessage("CTRLR_GRP_SET_PERFMON")),
			"photogallery" => Array("name" => GetMessage("CTRLR_GRP_SET_PHOTOGALLERY")),
			"report" => Array("name" => GetMessage("CTRLR_GRP_SET_REPORT")),
			"sale" => Array("name" => GetMessage("CTRLR_GRP_SET_SALE")),
			"search" => Array("name" => GetMessage("CTRLR_GRP_SET_SEARCH")),
			"security" => Array("name" => GetMessage("CTRLR_GRP_SET_SECURITY")),
			"seo" => Array("name" => GetMessage("CTRLR_GRP_SET_SEO")),
			"socialnetwork" => Array("name" => GetMessage("CTRLR_GRP_SET_SOCIALNETWORK")),
			"socialservices" => Array("name" => GetMessage("CTRLR_GRP_SET_SOCIALSERVICES")),
			"statistic" => Array("name" => GetMessage("CTRLR_GRP_SET_STATISTIC")),
			"subscribe" => Array("name" => GetMessage("CTRLR_GRP_SET_SUBSCRIBE")),
			"support" => Array("name" => GetMessage("CTRLR_GRP_SET_SUPPORT")),
			"tasks" => Array("name" => GetMessage("CTRLR_GRP_SET_TASKS")),
			"timeman" => Array("name" => GetMessage("CTRLR_GRP_SET_TIMEMAN")),
			"translate" => Array("name" => GetMessage("CTRLR_GRP_SET_TRANSLATE")),
			"video" => Array("name" => GetMessage("CTRLR_GRP_SET_VIDEO")),
			"videomost" => Array("name" => GetMessage("CTRLR_GRP_SET_VIDEOMOST")),
			"videoport" => Array("name" => GetMessage("CTRLR_GRP_SET_VIDEOPORT")),
			"vote" => Array("name" => GetMessage("CTRLR_GRP_SET_VOTE")),
			"webdav" => Array("name" => GetMessage("CTRLR_GRP_SET_WEBDAV")),
			"webservice" => Array("name" => GetMessage("CTRLR_GRP_SET_WEBSERVICE")),
			"wiki" => Array("name" => GetMessage("CTRLR_GRP_SET_WIKI")),
			"workflow" => Array("name" => GetMessage("CTRLR_GRP_SET_WORKFLOW")),
			"xdimport" => Array("name" => GetMessage("CTRLR_GRP_SET_XDIMPORT")),
			"xmpp" => Array("name" => GetMessage("CTRLR_GRP_SET_XMPP")),
		);

		sortByColumn($arModules, "name");

		return $arModules;
	}

	public static function GetModules()
	{
		$arInfo = CControllerGroupSettings::GetData();
		$arModules = Array();
		foreach ($arInfo as $mname => $arProp)
		{
			$arModules[$mname] = $arProp["name"];
		}
		return $arModules;
	}

	public static function GenerateInput($id, $arInfo, $curVal = false, $context = 'default')
	{
		$res = '<input type="checkbox" id="'.htmlspecialcharsbx('ACT_'.$id).'" '.($curVal === false? '': 'checked').' name="'.htmlspecialcharsbx('OPTIONS['.$context.']['.$id.']').'" value="Y" title="'.GetMessage("CTRLR_GRP_REASSIGN").
			'" onclick="'.htmlspecialcharsbx('document.getElementById(\''.CUtil::addslashes($id).'\').disabled=!this.checked;if(this.checked)document.getElementById(\''.CUtil::addslashes($id).'\').focus();').'">';
		if ($curVal === false)
			$strDis = ' disabled ';
		else
			$strDis = '';

		$arInput = $arInfo[2];
		if ($arInput[0] == 'checkbox')
		{
			$res .= '<select name="'.htmlspecialcharsbx('OPTIONS['.$context.']['.$id.']').'" id="'.htmlspecialcharsbx($id).'"'.$strDis.'>'.
				'<option value="N">'.GetMessage("CTRLR_GRP_OPT_NO").'</option>'.
				'<option value="Y"'.($curVal !== false && $curVal == 'Y'? ' selected': '').'>'.GetMessage("CTRLR_GRP_OPT_YES").'</option>'.
				'</select>';
		}
		elseif ($arInput[0] == 'text')
		{
			$res .= '<input type="text" name="'.htmlspecialcharsbx('OPTIONS['.$context.']['.$id.']').'" '.$strDis.'id="'.htmlspecialcharsbx($id).
				'" size="'.htmlspecialcharsbx($arInput[1]).'" value="'.htmlspecialcharsbx($curVal === false? $arInput[2]: $curVal).'">';
		}
		elseif ($arInput[0] == 'selectbox')
		{
			$res .= '<select name="'.htmlspecialcharsbx('OPTIONS['.$context.']['.$id.']').'" '.$strDis.'id="'.htmlspecialcharsbx($id).'">';
			foreach ($arInput[1] as $enum_id => $enum_value)
			{
				$res .= '<option value="'.htmlspecialcharsbx($enum_id).'"'.
					($curVal !== false && $curVal == $enum_id? ' selected': '').
					'>'.htmlspecialcharsEx($enum_value).'</option>';
			}
			$res .= '</select>';
		}
		elseif ($arInput[0] == "textarea")
		{
			$res .= '<br><textarea rows="'.htmlspecialcharsbx($arInput[1]).'" cols="'.htmlspecialcharsbx($arInput[2]).'" name="'.htmlspecialcharsbx('OPTIONS['.$context.']['.$id.']').'" '.$strDis.' id="'.htmlspecialcharsbx($id).'">'.htmlspecialcharsbx($curVal === false? $arInput[3]: $curVal).'</textarea>';
		}

		return $res;
	}

	/**
	 * @return array[]IControllerGroupOption
	 */
	public static function Get3rdPartyOptions()
	{
		$arResult = array();
		foreach (GetModuleEvents("controller", "OnGetGroupSettings", true) as $arEvent)
		{
			$Object = ExecuteModuleEventEx($arEvent);
			if (is_object($Object))
				$arResult[] = $Object;
		}
		return $arResult;
	}

	public static function GeneratePHPInstall($arValues)
	{
		$str = '';
		$arDefValues = $arValues["default"]["options"];
		$arInfo = CControllerGroupSettings::GetData();

		if (isset($arValues["default"]["modules"]))
		{
			$vArr = '';
			foreach ($arInfo as $module_id => $arProp)
			{
				if ($module_id == 'main')
					continue;

				if (in_array($module_id, $arValues["default"]["modules"]))
					$vArr .= '"'.$module_id.'"=>"Y", ';
				else
					$vArr .= '"'.$module_id.'"=>"N", ';
			}
			$str .= 'CControllerClient::SetModules(Array('.$vArr.'));'."\r\n";
		}
		else
			$str .= 'CControllerClient::RestoreModules();'."\r\n";

		foreach ($arInfo as $mname => $arProp)
		{
			if (!is_array($arProp["options"]) || count($arProp["options"]) <= 0)
				continue;
			$arOptions = $arProp["options"];
			foreach ($arOptions as $id => $arOptionParams)
			{
				if (isset($arDefValues[$mname][$id]))
					$str .= 'CControllerClient::SetOptionString("'.EscapePHPString($mname).'", "'.EscapePHPString($id).'", "'.EscapePHPString($arDefValues[$mname][$id]).'");'."\r\n";
				elseif (substr($id, 0, 2) != '__')
					$str .= 'CControllerClient::RestoreOption("'.EscapePHPString($mname).'", "'.EscapePHPString($id).'");'."\r\n";
			}
		}

		$arSecurity = $arValues["default"]["security"];
		if ($arSecurity["limit_admin"] == "Y")
			$str .= 'CControllerClient::SetOptionString("main", "~controller_limited_admin", "Y");'."\r\n";
		else
			$str .= 'CControllerClient::SetOptionString("main", "~controller_limited_admin", "N");'."\r\n";

		$arGroups = Array();
		$arUniqTasks = Array();
		if (is_array($arSecurity["groups"]))
		{
			foreach ($arSecurity["groups"] as $group_id => $arPermissions)
			{
				$arDefinedPermissions = Array();
				$arUnDefinedPermissions = Array();
				$bSubOrdGroups = false;
				foreach ($arInfo as $module_id => $arProp)
				{
					if (isset($arPermissions[$module_id]))
					{
						$arDefinedPermissions[$module_id] = $arPermissions[$module_id];

						$task_id = $arPermissions[$module_id];

						if (strlen($task_id) > 1 && (!is_array($arUniqTasks[$module_id]) || !in_array($task_id, $arUniqTasks[$module_id])))
						{
							$arUniqTasks[$module_id][] = $task_id;
							$dbr_task = CTask::GetList(Array(), Array('NAME' => $task_id, 'MODULE_ID' => $module_id, "BINDING" => 'module'));
							if ($ar_task = $dbr_task->Fetch())
							{
								if ($module_id == 'main' || $ar_task['SYS'] != 'Y')
								{
									$arOperations = CTask::GetOperations($ar_task["ID"], true);

									if ($ar_task['SYS'] != 'Y')
									{
										$str .= 'CControllerClient::SetTaskSecurity('.CControllerGroupSettings::__PHPToString($task_id).', '.CControllerGroupSettings::__PHPToString($module_id).', '.CControllerGroupSettings::__PHPToString($arOperations).', '.CControllerGroupSettings::__PHPToString($ar_task["LETTER"]).');'."\r\n";
									}

									if ($module_id == 'main' && in_array('edit_subordinate_users', $arOperations))
									{
										$bSubOrdGroups = true;
									}
								}
							}
						}
					}
					else
						$arUnDefinedPermissions[] = $module_id;
				}

				$str .= 'CControllerClient::RestoreGroupSecurity('.CControllerGroupSettings::__PHPToString($group_id).', '.CControllerGroupSettings::__PHPToString($arUnDefinedPermissions).');'."\r\n";

				if ($bSubOrdGroups)
				{
					$arSGroupsTmp = preg_split("/[\r\n,;]+/", $arSecurity["subord_groups"][$group_id]);
					$arSGroups = array();
					foreach ($arSGroupsTmp as $sGroupTmp)
					{
						$sGroupTmp = trim($sGroupTmp);
						if ($sGroupTmp != '')
							$arSGroups[] = $sGroupTmp;
					}

					$str .= 'CControllerClient::SetGroupSecurity('.CControllerGroupSettings::__PHPToString($group_id).', '.CControllerGroupSettings::__PHPToString($arDefinedPermissions).', '.CControllerGroupSettings::__PHPToString($arSGroups).');'."\r\n";
				}
				else
					$str .= 'CControllerClient::SetGroupSecurity('.CControllerGroupSettings::__PHPToString($group_id).', '.CControllerGroupSettings::__PHPToString($arDefinedPermissions).');'."\r\n";

				$arGroups[] = $group_id;
			}
		}

		$str .= 'CControllerClient::RestoreSecurity('.CControllerGroupSettings::__PHPToString($arGroups).');'."\r\n";

		$arThirdSettings = CControllerGroupSettings::Get3rdPartyOptions();
		/** @var IControllerGroupOption $obOption */
		foreach ($arThirdSettings as $obOption)
		{
			$str .= $obOption->GetOptionPHPCode($arValues);
		}

		return $str;
	}

	protected static function __PHPToString($arData)
	{
		if (is_array($arData))
		{
			if ($arData == array_values($arData))
			{
				foreach ($arData as $key => $value)
					$arData[$key] = CControllerGroupSettings::__PHPToString($value);

				$res = "Array(".implode(", ", $arData).")";
			}
			else
			{
				$res = "Array(";
				foreach ($arData as $key => $value)
				{
					$res .= '"'.EscapePHPString($key).'" => ';
					$res .= CControllerGroupSettings::__PHPToString($value).", ";
				}
				$res .= ")";
			}
			return $res;
		}
		else
			return '"'.EscapePHPString($arData).'"';
	}

	function SetGroupSettings()
	{
	}
}

class IControllerGroupOption
{
	var $id = 'UNDEFINED';

	function GetName()
	{
		return GetMessage("CTRLR_GRP_SETTINGS")." ".$this->id;
	}

	function GetIcon()
	{
		return "controller_group_edit";
	}

	function GetTitle()
	{
		return GetMessage("CTRLR_GRP_SETTINGS_TITLE");
	}


	function GetOptionArray()
	{
		return Array();
	}

	function GetOptionPHPCode($arAllValues)
	{
		$arValues = $arAllValues[$this->id];
		$arOptions = $this->GetOptionArray();
		$str = "";
		foreach ($arOptions as $id => $arOptionParams)
		{
			if (isset($arValues[$id]))
				$str .= 'CControllerClient::SetOptionString("'.EscapePHPString($this->id).'", "'.EscapePHPString($id).'", "'.EscapePHPString($arValues[$id]).'");'."\r\n";
			elseif (substr($id, 0, 2) != '__')
				$str .= 'CControllerClient::RestoreOption("'.EscapePHPString($this->id).'", "'.EscapePHPString($id).'");'."\r\n";
		}
		return $str;
	}
}

Zerion Mini Shell 1.0