Your IP : 18.225.235.157


Current Path : /home/bitrix/ext_www/home-comfort.in.ua/bitrix/modules/learning/classes/general/
Upload File :
Current File : /home/bitrix/ext_www/home-comfort.in.ua/bitrix/modules/learning/classes/general/group.php

<?php
/**
 * Bitrix Framework
 * @package bitrix
 * @subpackage learning
 * @copyright 2001-2013 Bitrix
 */


/*
	$arFields:

	ID int(11) unsigned not null auto_increment,
	ACTIVE char(1) not null default 'Y',
	TITLE varchar(255) not null default ' ',
	CODE varchar(50) NULL DEFAULT NULL,
	SORT int(11) not null default '500',
	ACTIVE_FROM datetime,
	ACTIVE_TO datetime,
	COURSE_LESSON_ID INT NOT NULL,
	PRIMARY KEY(ID)
*/
class CLearningGroup
{
	/**
	 * Creates new learning group
	 * 
	 * @param array $arFields
	 * 
	 * @return mixed (int) id of just created group OR (bool) false on error
	 */
	public static function add($arFields)
	{
		global $DB, $USER_FIELD_MANAGER, $APPLICATION;

		if (is_set($arFields, "ACTIVE") && $arFields["ACTIVE"] != "Y")
			$arFields["ACTIVE"] = "N";

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

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

		if (array_key_exists('ID', $arFields))
			unset($arFields['ID']);
		
		foreach(GetModuleEvents('learning', 'OnBeforeLearningGroupAdd', true) as $arEvent)
		{
			if (ExecuteModuleEventEx($arEvent, array(&$arFields)) === false)
			{
				IncludeModuleLangFile(__FILE__);

				$errmsg = GetMessage("LEARNING_GROUP_ADD_UNKNOWN_ERROR");
				$errno  = 'LEARNING_GROUP_ADD_UNKNOWN_ERROR';

				if ($ex = $APPLICATION->getException())
				{
					$errmsg = $ex->getString();
					$errno  = $ex->getId();
				}

				$e = new CAdminException(array('text' => $errmsg, 'id' => $errno));
				$APPLICATION->ThrowException($e);

				return false;
			}
		}

		$id = $DB->Add("b_learn_groups", $arFields, array(), "learning");
		if ($id)
			$USER_FIELD_MANAGER->Update("LEARNING_LGROUPS", $id, $arFields);

		if ($id > 0 && defined("BX_COMP_MANAGED_CACHE"))
		{
			global $CACHE_MANAGER;
			$CACHE_MANAGER->ClearByTag('LEARNING_GROUP_' . (int) ($id / 100));
			$CACHE_MANAGER->ClearByTag('LEARNING_GROUP');
		}

		foreach(GetModuleEvents('learning', 'OnAfterLearningGroupAdd', true) as $arEvent)
			ExecuteModuleEventEx($arEvent, array($id, &$arFields));

		return ($id);
	}


	/**
	 * Updates existing learning group
	 * 
	 * @param int $id
	 * @param array $arFields
	 * 
	 * @return bool false on error, or true - if no errors detected
	 */
	public static function update($id, $arFields)
	{
		global $DB, $USER_FIELD_MANAGER, $APPLICATION;

		$id = (int) $id;

		if ($id < 1)
			return (false);

		if (is_set($arFields, "ACTIVE") && $arFields["ACTIVE"] != "Y")
			$arFields["ACTIVE"] = "N";

		if ( ! self::CheckFields($arFields, $id) )
			return false;

		if ( ! $USER_FIELD_MANAGER->CheckFields("LEARNING_LGROUPS", $id, $arFields) )
			return (false);

		if (array_key_exists('ID', $arFields))
			unset($arFields['ID']);
		
		foreach(GetModuleEvents('learning', 'OnBeforeLearningGroupUpdate', true) as $arEvent)
		{
			if (ExecuteModuleEventEx($arEvent, array($id, &$arFields)) === false)
			{
				IncludeModuleLangFile(__FILE__);

				$errmsg = GetMessage("LEARNING_GROUP_UPDATE_UNKNOWN_ERROR");
				$errno  = 'LEARNING_GROUP_UPDATE_UNKNOWN_ERROR';

				if ($ex = $APPLICATION->getException())
				{
					$errmsg = $ex->getString();
					$errno  = $ex->getId();
				}

				$e = new CAdminException(array('text' => $errmsg, 'id' => $errno));
				$APPLICATION->ThrowException($e);

				return false;
			}
		}

		$USER_FIELD_MANAGER->Update('LEARNING_LGROUPS', $id, $arFields);

		$strUpdate = $DB->PrepareUpdate("b_learn_groups", $arFields, "learning");
		$strSql = "UPDATE b_learn_groups SET " . $strUpdate . " WHERE ID=" . $id;
		$rc = $DB->queryBind($strSql, $arBinds = array(), $bIgnoreErrors = true);

		if (defined("BX_COMP_MANAGED_CACHE"))
		{
			global $CACHE_MANAGER;
			$CACHE_MANAGER->ClearByTag('LEARNING_GROUP_' . (int) ($id / 100));
			$CACHE_MANAGER->ClearByTag('LEARNING_GROUP');
		}

		foreach(GetModuleEvents('learning', 'OnAfterLearningGroupUpdate', true) as $arEvent)
			ExecuteModuleEventEx($arEvent, array($id, &$arFields));

		return ($rc !== false);
	}


	/**
	 * Get list of existing learning groups
	 * 
	 * @param array $arOrder
	 * @param array $arFilter
	 * @param array $arSelect
	 * @param array $arNavParams
	 * 
	 * @return CDBResult
	 */
	public static function getList($arOrder, $arFilter, $arSelect = array(), $arNavParams = array())
	{
		global $DB, $USER, $USER_FIELD_MANAGER;

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

		$arFields = array(
			'ID'               => 'LG.ID',
			'TITLE'            => 'LG.TITLE',
			'ACTIVE'           => 'LG.ACTIVE',
			'CODE'             => 'LG.CODE',
			'SORT'             => 'LG.SORT', 
			'ACTIVE_FROM'      => $DB->DateToCharFunction('LG.ACTIVE_FROM', 'FULL'),
			'ACTIVE_TO'        => $DB->DateToCharFunction('LG.ACTIVE_TO', 'FULL'),
			'COURSE_LESSON_ID' => 'LG.COURSE_LESSON_ID',
			'COURSE_TITLE'     => 'LL.NAME',
			'MEMBER_ID'        => 'LGM.USER_ID'
		);

		$arFieldsSort = $arFields;
		$arFieldsSort["ACTIVE_FROM"] = "LG.ACTIVE_FROM";
		$arFieldsSort["ACTIVE_TO"] = "LG.ACTIVE_TO";

		if (count($arSelect) <= 0 || in_array("*", $arSelect))
			$arSelect = array_diff(array_keys($arFields), array('MEMBER_ID'));
		elseif (!in_array("ID", $arSelect))
			$arSelect[] = "ID";

		if (!is_array($arOrder))
			$arOrder = array();

		foreach ($arOrder as $by => $order)
		{
			$by = (string) $by;
			$byUppercase = strtoupper($by);
			$needle = null;
			$order = strtolower($order);

			if ($order != "asc")
				$order = "desc";

			if (array_key_exists($byUppercase, $arFieldsSort))
			{
				$arSqlOrder[] = ' ' . $arFieldsSort[$byUppercase] . ' ' . $order . ' ';
				$needle = $byUppercase;
			}
			elseif ($s = $obUserFieldsSql->getOrder(strtolower($by)))
				$arSqlOrder[] = ' ' . $s . ' ' . $order . ' ';

			if (
				($needle !== null)
				&& ( ! in_array($needle, $arSelect, true) )
			)
			{
				$arSelect[] = $needle;
			}
		}

		if (
			array_key_exists('MEMBER_ID', $arFilter)
			&& ( ! in_array('MEMBER_ID', $arSelect, true) )
		)
		{
			$arSelect[] = 'MEMBER_ID';
		}

		$arSqlSelect = array();
		foreach ($arSelect as $field)
		{
			$field = strtoupper($field);
			if (array_key_exists($field, $arFields))
				$arSqlSelect[$field] = $arFields[$field] . ' AS ' . $field;
		}

		if (!sizeof($arSqlSelect))
			$arSqlSelect = 'LG.ID AS ID';

		$arSqlSearch = self::getFilter($arFilter);

		$r = $obUserFieldsSql->GetFilter();
		if (strlen($r) > 0)
			$arSqlSearch[] = "(".$r.")";

		$strSql = "
			SELECT
				".implode(",\n", $arSqlSelect)."
				".$obUserFieldsSql->GetSelect();

		$strFrom = "
			FROM
				b_learn_groups LG
				";

		if (in_array('COURSE_TITLE', $arSelect, true))
			$strFrom .= "LEFT OUTER JOIN b_learn_lesson LL ON LL.ID = LG.COURSE_LESSON_ID \n" ;

		if (in_array('MEMBER_ID', $arSelect, true))
			$strFrom .= "LEFT JOIN b_learn_groups_member LGM ON LGM.LEARNING_GROUP_ID = LG.ID \n" ;

		$strFrom .= $obUserFieldsSql->GetJoin("LG.ID") . " "
			. (sizeof($arSqlSearch) ? " WHERE " . implode(" AND ", $arSqlSearch) : "") . " ";

		$strSql .= $strFrom;

		$strSqlOrder = "";
		DelDuplicateSort($arSqlOrder);
		for ($i = 0, $arSqlOrderCnt = count($arSqlOrder); $i < $arSqlOrderCnt; $i++)
		{
			if ($i == 0)
				$strSqlOrder = " ORDER BY ";
			else
				$strSqlOrder .= ",";

			$strSqlOrder .= $arSqlOrder[$i];
		}

		$strSql .= $strSqlOrder;

		if (count($arNavParams))
		{
			if (isset($arNavParams['nTopCount']))
			{
				$strSql = $DB->TopSql($strSql, (int) $arNavParams['nTopCount']);
				$res = $DB->Query($strSql, $bIgnoreErrors = false, "File: " . __FILE__ . "<br>Line: " . __LINE__);
				$res->SetUserFields($USER_FIELD_MANAGER->GetUserFields("LEARNING_LGROUPS"));
			}
			else
			{
				$res_cnt = $DB->Query("SELECT COUNT(LG.ID) as C " . $strFrom);
				$res_cnt = $res_cnt->Fetch();
				$res = new CDBResult();
				$res->SetUserFields($USER_FIELD_MANAGER->GetUserFields("LEARNING_LGROUPS"));
				$rc = $res->NavQuery($strSql, $res_cnt["C"], $arNavParams, $bIgnoreErrors = false, "File: " . __FILE__ . "<br>Line: " . __LINE__);
			}
		}
		else
		{
			$res = $DB->Query($strSql, $bIgnoreErrors = false, "File: " . __FILE__ . "<br>Line: " . __LINE__);
			$res->SetUserFields($USER_FIELD_MANAGER->GetUserFields("LEARNING_LGROUPS"));
		}

		return $res;
	}


	/**
	 * Removes existing learning group
	 * 
	 * @param int $groupId
	 * 
	 * @return bool false on error, or true - if no errors detected
	 */
	public static function delete($groupId)
	{
		global $DB, $APPLICATION, $USER_FIELD_MANAGER;

		foreach(GetModuleEvents('learning', 'OnBeforeLearningGroupDelete', true) as $arEvent)
		{
			if (ExecuteModuleEventEx($arEvent, array($groupId)) === false)
			{
				IncludeModuleLangFile(__FILE__);

				$errmsg = GetMessage("LEARNING_GROUP_DELETE_UNKNOWN_ERROR");
				$errno  = 'LEARNING_GROUP_DELETE_UNKNOWN_ERROR';

				if ($ex = $APPLICATION->getException())
				{
					$errmsg = $ex->getString();
					$errno  = $ex->getId();
				}

				$e = new CAdminException(array('text' => $errmsg, 'id' => $errno));
				$APPLICATION->ThrowException($e);

				return false;
			}
		}

		$rc = $DB->Query(
			"DELETE FROM b_learn_groups WHERE ID = " . (int) $groupId,
			$bIgnoreErrors = true
		);

		if (defined("BX_COMP_MANAGED_CACHE"))
		{
			global $CACHE_MANAGER;
			$CACHE_MANAGER->ClearByTag('LEARNING_GROUP_' . (int) ($groupId / 100));
			$CACHE_MANAGER->ClearByTag('LEARNING_GROUP');
		}

		$USER_FIELD_MANAGER->delete('LEARNING_LGROUPS', $groupId);

		CEventLog::add(array(
			'AUDIT_TYPE_ID' => 'LEARNING_REMOVE_ITEM',
			'MODULE_ID'     => 'learning',
			'ITEM_ID'       => 'LG #' . $groupId,
			'DESCRIPTION'   => 'learning group removed'
		));

		foreach(GetModuleEvents('learning', 'OnAfterLearningGroupDelete', true) as $arEvent)
			ExecuteModuleEventEx($arEvent, array($groupId));

		return ($rc !== false);
	}


	private static function CheckFields($arFields, $id = false)
	{
		global $DB;

		$arMsg = array();

		if ( (is_set($arFields, "TITLE") || $id === false) && strlen(trim($arFields["TITLE"])) <= 0)
			$arMsg[] = array("id"=>"TITLE", "text"=> GetMessage("LEARNING_BAD_NAME"));

		if (is_set($arFields, "ACTIVE_FROM") && strlen($arFields["ACTIVE_FROM"])>0 && (!$DB->IsDate($arFields["ACTIVE_FROM"], false, LANG, "FULL")))
			$arMsg[] = array("id"=>"ACTIVE_FROM", "text"=> GetMessage("LEARNING_BAD_ACTIVE_FROM"));

		if (is_set($arFields, "ACTIVE_TO") && strlen($arFields["ACTIVE_TO"])>0 && (!$DB->IsDate($arFields["ACTIVE_TO"], false, LANG, "FULL")))
			$arMsg[] = array("id"=>"ACTIVE_TO", "text"=> GetMessage("LEARNING_BAD_ACTIVE_TO"));

		if ($id === false)
		{
			if (!array_key_exists('COURSE_LESSON_ID', $arFields) || intval($arFields["COURSE_LESSON_ID"]) < 1)
			{
				$arMsg[] = array("id"=>"COURSE_LESSON_ID", "text"=> GetMessage("LEARNING_BAD_COURSE_ID"));
			}
		}

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

		return true;
	}


	private static function getFilter($arFilter)
	{
		global $DB;

		if (!is_array($arFilter))
			$arFilter = Array();

		$arSqlSearch = Array();

		foreach ($arFilter as $key => $val)
		{
			$res = CLearnHelper::MkOperationFilter($key);
			$key = $res["FIELD"];
			$cOperationType = $res["OPERATION"];

			$key = strtoupper($key);

			switch ($key)
			{
				case 'ID':
				case 'SORT':
				case 'COURSE_LESSON_ID':
					$arSqlSearch[] = CLearnHelper::FilterCreate('LG.' . $key, $val, 'number', $bFullJoin, $cOperationType);
					break;

				case 'ACTIVE':
					$arSqlSearch[] = CLearnHelper::FilterCreate('LG.' . $key, $val, 'string_equal', $bFullJoin, $cOperationType);
					break;

				case 'ACTIVE_FROM':
				case 'ACTIVE_TO':
					if ($val !== null)
						$arSqlSearch[] = CLearnHelper::FilterCreate('LG.' . $key, $val, 'date', $bFullJoin, $cOperationType);
					break;
				case "ACTIVE_DATE":
					if(strlen($val) > 0)
					{
						$arSqlSearch[] = ($cOperationType == "N" ? " NOT" : "")
							. "((LG.ACTIVE_TO >= " . $DB->GetNowFunction()
							." OR LG.ACTIVE_TO IS NULL) AND (LG.ACTIVE_FROM <= " . $DB->GetNowFunction()
							. " OR LG.ACTIVE_FROM IS NULL))";
					}
					break;
				case 'TITLE':
				case 'CODE':
					$arSqlSearch[] = CLearnHelper::FilterCreate("LG." . $key, $val, "string", $bFullJoin, $cOperationType);
					break;

				case 'COURSE_TITLE':
					$arSqlSearch[] = CLearnHelper::FilterCreate("LL.NAME", $val, "string", $bFullJoin, $cOperationType);
					break;

				case 'MEMBER_ID':
					$arSqlSearch[] = CLearnHelper::FilterCreate('LGM.USER_ID', intval($val), 'number', $bFullJoin, $cOperationType);
					break;

				default:
					if (substr($key, 0, 3) !== 'UF_')
					{
						throw new LearnException(
							'Unknown field: ' . $key, 
							LearnException::EXC_ERR_ALL_PARAMS
						);
					}
				break;
			}
		}

		return array_filter($arSqlSearch);
	}
}