Your IP : 3.147.81.100


Current Path : /home/bitrix/ext_www/coffe.land/bitrix/modules/learning/classes/general/
Upload File :
Current File : /home/bitrix/ext_www/coffe.land/bitrix/modules/learning/classes/general/answer.php

<?

class CLAnswer
{
	function CheckFields(&$arFields, $ID = false)
	{
		global $DB;
		$arMsg = Array();

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


		if (
			($ID === false && !is_set($arFields, "QUESTION_ID"))
			||
			(is_set($arFields, "QUESTION_ID") && intval($arFields["QUESTION_ID"]) < 1)
			)
		{
			$arMsg[] = array("id"=>"QUESTION_ID", "text"=> GetMessage("LEARNING_BAD_QUESTION_ID"));
		}
		elseif (is_set($arFields, "QUESTION_ID"))
		{
			$res = CLQuestion::GetByID($arFields["QUESTION_ID"]);
			if(!$arRes = $res->Fetch())
				$arMsg[] = array("id"=>"QUESTION_ID", "text"=> GetMessage("LEARNING_BAD_QUESTION_ID"));
		}

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

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

		return true;
	}


	function Add($arFields)
	{
		global $DB;

		if($this->CheckFields($arFields))
		{
			unset($arFields["ID"]);

			$ID = $DB->Add("b_learn_answer", $arFields, Array("ANSWER", "FEEDBACK", "MATCH_ANSWER"), "learning");

			return $ID;
		}

		return false;
	}


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

		$ID = intval($ID);
		if ($ID < 1) return false;


		if ($this->CheckFields($arFields, $ID))
		{
			unset($arFields["ID"]);

			$arBinds=Array(
				"ANSWER" => $arFields["ANSWER"],
				"FEEDBACK" => $arFields["FEEDBACK"],
				"MATCH_ANSWER" => $arFields["MATCH_ANSWER"],
			);

			$strUpdate = $DB->PrepareUpdate("b_learn_answer", $arFields, "learning");
			$strSql = "UPDATE b_learn_answer SET ".$strUpdate." WHERE ID=".$ID;
			$DB->QueryBind($strSql, $arBinds, false, "File: ".__FILE__."<br>Line: ".__LINE__);

			return true;
		}
		return false;
	}


	function Delete($ID)
	{
		global $DB;

		$ID = intval($ID);
		if ($ID < 1) return false;

		$strSql = "DELETE FROM b_learn_answer WHERE ID = ".$ID;

		if (!$DB->Query($strSql, false, "File: ".__FILE__."<br>Line: ".__LINE__))
			return false;

		return true;
	}


	function GetByID($ID)
	{
		return CLAnswer::GetList($arOrder=Array(), $arFilter=Array("ID" => $ID));
	}


	function GetFilter($arFilter)
	{
		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 "QUESTION_ID":
					$arSqlSearch[] = CLearnHelper::FilterCreate("CA.".$key, $val, "number", $bFullJoin, $cOperationType);
					break;

				case "ANSWER":
					$arSqlSearch[] = CLearnHelper::FilterCreate("CA.".$key, $val, "string", $bFullJoin, $cOperationType);
					break;

				case "CORRECT":
					$arSqlSearch[] = CLearnHelper::FilterCreate("CA.".$key, $val, "string_equal", $bFullJoin, $cOperationType);
					break;
			}

		}

		return $arSqlSearch;
	}


	function GetList($arOrder=Array(), $arFilter=Array())
	{
		global $DB, $USER;

		$arSqlSearch = CLAnswer::GetFilter($arFilter);

		$strSqlSearch = "";
		for($i=0; $i<count($arSqlSearch); $i++)
			if(strlen($arSqlSearch[$i])>0)
				$strSqlSearch .= " AND ".$arSqlSearch[$i]." ";

		$strSql =
		"SELECT CA.*, CQ.ID AS QUESTION_ID, CQ.NAME AS QUESTION_NAME ".
		"FROM b_learn_answer CA ".
		"INNER JOIN b_learn_question CQ ON CA.QUESTION_ID = CQ.ID ".
		"WHERE 1=1 ".
		$strSqlSearch;

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

		foreach($arOrder as $by=>$order)
		{
			$by = strtolower($by);
			$order = strtolower($order);
			if ($order!="asc")
				$order = "desc";

			if ($by == "id") $arSqlOrder[] = " CA.ID ".$order." ";
			elseif ($by == "sort") $arSqlOrder[] = " CA.SORT ".$order." ";
			elseif ($by == "correct") $arSqlOrder[] = " CA.CORRECT ".$order." ";
			elseif ($by == "answer") $arSqlOrder[] = " CA.ANSWER ".$order." ";
			elseif ($by == "rand") $arSqlOrder[] = CTest::GetRandFunction();
			else
			{
				$arSqlOrder[] = " CA.ID ".$order." ";
				$by = "id";
			}
		}

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

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

		$strSql .= $strSqlOrder;

		//echo $strSql;

		return $DB->Query($strSql, false, "File: ".__FILE__."<br>Line: ".__LINE__);
	}


	function GetStats($ID)
	{
		global $DB;

		$ID = intval($ID);
		$strSql = "SELECT COUNT(*) AS ALL_CNT, SUM(CASE WHEN CORRECT = 'Y' THEN 1 ELSE 0 END) AS CORRECT_CNT FROM b_learn_test_result WHERE ANSWERED = 'Y' AND QUESTION_ID = ".$ID;
		$rsStat = $DB->Query($strSql, false, "File: ".__FILE__."<br>Line: ".__LINE__);
		if ($arStat = $rsStat->GetNext())
		{
			return array("ALL_CNT" => intval($arStat["ALL_CNT"]), "CORRECT_CNT" => intval($arStat["CORRECT_CNT"]));
		}
		else
		{
			return array("ALL_CNT" => 0, "CORRECT_CNT" => 0);
		}
	}


	public static function getMultiStats($arIds)
	{
		global $DB;

		if ( ! is_array($arIds) )
			return (false);

		$arResult = array();

		$arIds = array_filter($arIds);

		if ( ! empty($arIds) )
		{
			$arIds = array_map('intval', $arIds);			

			$strSql = "SELECT QUESTION_ID, COUNT(*) AS ALL_CNT, SUM(CASE WHEN CORRECT = 'Y' THEN 1 ELSE 0 END) AS CORRECT_CNT 
				FROM b_learn_test_result 
				WHERE ANSWERED = 'Y' AND QUESTION_ID IN (" . implode(',', $arIds) . ")
				GROUP BY QUESTION_ID ";

			$rsStat = $DB->Query($strSql, false, "File: " . __FILE__ . "<br>Line: " . __LINE__);
			while ($arStat = $rsStat->fetch())
			{
				$arResult[$arStat['QUESTION_ID']] = array(
					'ALL_CNT'     => (int) $arStat['ALL_CNT'],
					'CORRECT_CNT' => (int) $arStat['CORRECT_CNT']
				);
			}
		}

		return ($arResult);
	}
}