Your IP : 3.144.47.172


Current Path : /var/www/www-root/data/www/monolith-realty.ru/bitrix/modules/vote/classes/general/
Upload File :
Current File : /var/www/www-root/data/www/monolith-realty.ru/bitrix/modules/vote/classes/general/answer.php

<?php

#############################################
# Bitrix Site Manager Forum					#
# Copyright (c) 2002-2009 Bitrix			#
# https://www.bitrixsoft.com					#
# mailto:admin@bitrixsoft.com				#
#############################################

use Bitrix\Vote;

IncludeModuleLangFile(__FILE__);

class CAllVoteAnswer
{
	public static function err_mess()
	{
		$module_id = "vote";
		return "<br>Module: ".$module_id."<br>Class: CAllVoteAnswer<br>File: ".__FILE__;
	}

	public static function CheckFields($ACTION, &$arFields, $ID = 0)
	{
		global $APPLICATION;
		global $USER;
		$aMsg = [];
		$ID = intval($ID);
		$ACTION = ($ID > 0 && $ACTION == 'UPDATE' ? 'UPDATE' : 'ADD');

		unset($arFields['ID']);

		if (isset($arFields['QUESTION_ID']) || $ACTION == 'ADD'):
			$arFields['QUESTION_ID'] = intval($arFields['QUESTION_ID'] ?? 0);
			if ($arFields['QUESTION_ID'] <= 0):
				$aMsg[] = [
					'id' => 'QUESTION_ID',
					'text' => GetMessage('VOTE_FORGOT_QUESTION_ID')
				];
			endif;
		endif;

		if (isset($arFields['MESSAGE']) || $ACTION == 'ADD')
		{
			$arFields['MESSAGE'] = ($arFields['MESSAGE'] ?? '');
			if (!$USER || $USER->CanDoOperation('edit_php') !== true)
			{
				$arFields['MESSAGE'] = Vote\Inner\Sanitizer::cleanText($arFields['MESSAGE']);
			}
			if ($arFields['MESSAGE'] === '')
			{
				$aMsg[] = ['id' => 'MESSAGE', 'text' => GetMessage('VOTE_FORGOT_MESSAGE')];
			}
		}

		if (array_key_exists('IMAGE_ID', $arFields))
		{
			if (!is_array($arFields['IMAGE_ID']))
			{
				$arFields['IMAGE_ID'] = intval($arFields['IMAGE_ID']);
			}
			else if ($arFields['IMAGE_ID']['name'] == '' && $arFields['IMAGE_ID']['del'] == '')
			{
				unset($arFields['IMAGE_ID']);
			}
			else if ($str = CFile::CheckImageFile($arFields['IMAGE_ID']))
			{
				$aMsg[] = array(
					'id' => 'IMAGE_ID',
					'text' => 'Answer: '.$str);
			}
			else
			{
				$arFields['IMAGE_ID']['MODULE_ID'] = 'vote';
			}
		}

		unset($arFields['TIMESTAMP_X']);
		if (isset($arFields['ACTIVE']) || $ACTION == 'ADD') $arFields['ACTIVE'] = (($arFields['ACTIVE'] ?? 'Y') == 'N' ? 'N' : 'Y');
		if (isset($arFields['C_SORT']) || $ACTION == 'ADD') $arFields['C_SORT'] = intval($arFields['C_SORT'] ?? 100);
		if (isset($arFields['COUNTER']) || $ACTION == 'ADD') $arFields['COUNTER'] = intval($arFields['COUNTER'] ?? 0);
		if (isset($arFields['FIELD_TYPE']) || $ACTION == 'ADD') $arFields['FIELD_TYPE'] = intval($arFields['FIELD_TYPE'] ?? 0);
		if (isset($arFields['FIELD_WIDTH']) || $ACTION == 'ADD') $arFields['FIELD_WIDTH'] = intval($arFields['FIELD_WIDTH'] ?? 0);
		if (isset($arFields['FIELD_HEIGHT']) || $ACTION == 'ADD') $arFields['FIELD_HEIGHT'] = intval($arFields['FIELD_HEIGHT'] ?? 0);

		if (isset($arFields['FIELD_PARAM']))
		{
			$arFields['FIELD_PARAM'] = ((!$USER || $USER->CanDoOperation('edit_php') !== true)
				? '' : trim($arFields['FIELD_PARAM']))
			;
		}

		if (isset($arFields['COLOR']) || $ACTION == 'ADD') $arFields['COLOR'] = mb_substr(trim($arFields['COLOR'] ?? ''), 0, 7);

		if (!empty($aMsg))
		{
			$e = new CAdminException(array_reverse($aMsg));
			$APPLICATION->ThrowException($e);
			return false;
		}
		return true;
	}

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

		if (!CVoteAnswer::CheckFields("ADD", $arFields))
			return false;
/***************** Event onBeforeVoteAnswerAdd *********************/
		foreach (GetModuleEvents("vote", "onBeforeVoteAnswerAdd", true) as $arEvent)
			if (ExecuteModuleEventEx($arEvent, array(&$arFields)) === false)
				return false;
/***************** /Event ******************************************/
		if (empty($arFields))
			return false;

		if (
			array_key_exists("IMAGE_ID", $arFields) &&
			is_array($arFields["IMAGE_ID"])
		)
		{
			$arFields["IMAGE_ID"]["MODULE_ID"] = "vote";
			CFile::SaveForDB($arFields, "IMAGE_ID", "vote");
		}

		if ($DB->type == "ORACLE")
			$arFields["ID"] = $DB->NextID("SQ_B_VOTE_ANSWER");

		$arInsert = $DB->PrepareInsert("b_vote_answer", $arFields);

		$DB->QueryBind("INSERT INTO b_vote_answer (".$arInsert[0].", TIMESTAMP_X) VALUES(".$arInsert[1].", ".$DB->GetNowFunction().")", array("MESSAGE" => $arFields["MESSAGE"]), false);
		$ID = intval($DB->type == "ORACLE" ? $arFields["ID"] : $DB->LastID());

/***************** Event onAfterVoteAnswerAdd **********************/
		foreach (GetModuleEvents("vote", "onAfterVoteAnswerAdd", true) as $arEvent)
			ExecuteModuleEventEx($arEvent, array($ID, $arFields));
/***************** /Event ******************************************/
		return $ID;
	}

	public static function Update($ID, $arFields)
	{
		global $DB;
		$arBinds = array();
		$ID = intval($ID);
		$err_mess = (self::err_mess())."<br>Function: Update<br>Line: ";

		if ($ID <= 0 || !CVoteAnswer::CheckFields("UPDATE", $arFields, $ID))
			return false;
/***************** Event onBeforeVoteQuestionUpdate ****************/
		foreach (GetModuleEvents("vote", "onBeforeVoteAnswerUpdate", true) as $arEvent)
			if (ExecuteModuleEventEx($arEvent, array($ID, &$arFields)) === false)
				return false;
/***************** /Event ******************************************/
		if (empty($arFields))
			return false;

		if (
			array_key_exists("IMAGE_ID", $arFields) &&
			is_array($arFields["IMAGE_ID"])
		)
		{
			$arFields["IMAGE_ID"]["MODULE_ID"] = "vote";
			CFile::SaveForDB($arFields, "IMAGE_ID", "vote");
		}

		$arFields["~TIMESTAMP_X"] = $DB->GetNowFunction();
		$strUpdate = $DB->PrepareUpdate("b_vote_answer", $arFields);
		if (is_set($arFields, "MESSAGE"))
			$arBinds["MESSAGE"] = $arFields["MESSAGE"];

		if (!empty($strUpdate)):
			$strSql = "UPDATE b_vote_answer SET ".$strUpdate." WHERE ID=".$ID;
			$DB->QueryBind($strSql, $arBinds, false, $err_mess);
//			$DB->Query($strSql, false, $err_mess);
			endif;
/***************** Event onAfterVoteAnswerUpdate *******************/
		foreach (GetModuleEvents("vote", "onAfterVoteAnswerUpdate", true) as $arEvent)
			ExecuteModuleEventEx($arEvent, array($ID, $arFields));
/***************** /Event ******************************************/
		return $ID;
	}

	public static function Delete($ID, $QUESTION_ID = false, $VOTE_ID = false)
	{
		global $DB;
		$err_mess = (self::err_mess())."<br>Function: Delete<br>Line: ";
/***************** Event onBeforeVoteAnswerDelete ******************/
		foreach (GetModuleEvents("vote", "onBeforeVoteAnswerDelete", true) as $arEvent)
		{
			if (ExecuteModuleEventEx($arEvent, array(&$ID, &$QUESTION_ID, &$VOTE_ID)) === false)
				return false;
		}
/***************** /Event ******************************************/

		$ID = (intval($ID) > 0 ? intval($ID) : false);
		$QUESTION_ID = (intval($QUESTION_ID) > 0 ? intval($QUESTION_ID) : false);
		$VOTE_ID = (intval($VOTE_ID) > 0 ? intval($VOTE_ID) : false);
		if ($ID != false):
			$strSqlEventAnswer = "DELETE FROM b_vote_event_answer WHERE ANSWER_ID=".$ID;
			$strSqlAnswer = "DELETE FROM b_vote_answer WHERE ID=".$ID;
		elseif ($QUESTION_ID != false):
			$strSqlEventAnswer = "DELETE FROM b_vote_event_answer WHERE ANSWER_ID IN (
				SELECT VA.ID FROM b_vote_answer VA WHERE VA.QUESTION_ID = ".$QUESTION_ID.")";
			$strSqlAnswer = "DELETE FROM b_vote_answer WHERE QUESTION_ID = ".$QUESTION_ID;
		elseif ($VOTE_ID != false):
			$strSqlEventAnswer = "DELETE FROM b_vote_event_answer WHERE ANSWER_ID IN (
				SELECT VA.ID 
				FROM b_vote_answer VA, b_vote_question VQ 
				WHERE VA.QUESTION_ID = VQ.ID AND VQ.VOTE_ID = ".$VOTE_ID.")";
			$strSqlAnswer = "DELETE FROM b_vote_answer WHERE QUESTION_ID IN (
				SELECT VQ.ID FROM b_vote_question VQ WHERE VQ.VOTE_ID = ".$VOTE_ID.")";
		else:
			return false;
		endif;

		$DB->Query($strSqlEventAnswer, false, $err_mess.__LINE__);
		$DB->Query($strSqlAnswer, false, $err_mess.__LINE__);
/***************** Event onAfterVoteAnswerDelete *******************/
		foreach (GetModuleEvents("vote", "onAfterVoteAnswerDelete", true) as $arEvent)
			ExecuteModuleEventEx($arEvent, array($ID, $QUESTION_ID, $VOTE_ID));
/***************** /Event ******************************************/
		return true;
	}

	public static function GetList($QUESTION_ID, $by="s_c_sort", $order="asc", $arFilter=array(), $arAddParams = array())
	{
		global $DB;
		$QUESTION_ID = intval($QUESTION_ID);
		$arSqlSearch = Array();
		$arFilter = (is_array($arFilter) ? $arFilter : array());
		foreach ($arFilter as $key => $val)
		{
			if(empty($val) || $val === "NOT_REF")
				continue;
			$key = strtoupper($key);
			switch($key)
			{
				case "ID":
				case "FIELD_TYPE":
					$match = ($arFilter[$key."_EXACT_MATCH"]=="N" ? "Y" : "N");
					$arSqlSearch[] = GetFilterQuery("A.".$key, $val, $match);
					break;
				case "MESSAGE":
				case "FIELD_PARAM":
					$match = ($arFilter[$key."_EXACT_MATCH"]=="Y" ? "N" : "Y");
					$arSqlSearch[] = GetFilterQuery("A.".$key, $val, $match);
					break;
				case "ACTIVE":
					$arSqlSearch[] = ($val=="Y") ? "A.ACTIVE='Y'" : "A.ACTIVE='N'";
					break;
			}
		}

		$order = ($order!="desc" ? "asc" : "desc");
		$by = (($by == "s_id" || $by == "s_counter") ? $by : "s_c_sort");
		if ($by == "s_id")				$strSqlOrder = " ORDER BY A.ID";
		elseif ($by == "s_counter")		$strSqlOrder = " ORDER BY A.COUNTER";
		else							$strSqlOrder = " ORDER BY A.C_SORT";
		$strSqlOrder .= " ".$order;
		$strSqlSearch = GetFilterSqlSearch($arSqlSearch);
		$strSqlFrom = "FROM b_vote_answer A WHERE ".$strSqlSearch." and A.QUESTION_ID=".$QUESTION_ID."";
		$strSql = "SELECT A.* ".$strSqlFrom.$strSqlOrder;

		$arAddParams["nTopCount"] = ($arAddParams["nTopCount"] ?? 0);
		if ($arAddParams["nTopCount"] > 0)
		{
			$arAddParams["nTopCount"] = intval($arAddParams["nTopCount"]);
			if ($DB->type=="MSSQL")
				$strSql = "SELECT TOP ".$arAddParams["nTopCount"]." A.* ".$strSqlFrom.$strSqlOrder;
			else if ($DB->type=="ORACLE")
				$strSql = "SELECT * FROM(".$strSql.") WHERE ROWNUM<=".$arAddParams["nTopCount"];
			else
				$strSql = "SELECT A.* ".$strSqlFrom.$strSqlOrder." LIMIT 0,".$arAddParams["nTopCount"];
		}
		else if (is_set($arAddParams, "bDescPageNumbering"))
		{
			$db_res = $DB->Query("SELECT COUNT(A.ID) as CNT ".$strSqlFrom, false, "File: ".__FILE__."<br>Line: ".__LINE__);
			$iCnt = (($db_res && ($ar_res = $db_res->Fetch())) ? intval($ar_res["CNT"]) : 0 );
			$db_res =  new CDBResult();
			$db_res->NavQuery($strSql, $iCnt, $arAddParams);
			return $db_res;
		}
		return $DB->Query($strSql, false, "File: ".__FILE__."<br>Line: ".__LINE__);
	}

	public static function GetListEx($arOrder = array("ID" => "ASC"), $arFilter=array())
	{
		global $DB;

		$arSqlSearch = Array();
		$strSqlSearch = "";
		$arSqlOrder = Array();
		$strSqlOrder = "";

		$arFilter = (is_array($arFilter) ? $arFilter : array());

		foreach ($arFilter as $key => $val)
		{
			if ($val === "NOT_REF")
				continue;
			$key_res = VoteGetFilterOperation($key);
			$strNegative = $key_res["NEGATIVE"];
			$strOperation = $key_res["OPERATION"];
			$key = mb_strtoupper($key_res["FIELD"]);

			switch($key)
			{
				case "ID":
				case "QUESTION_ID":
					$str = ($strNegative=="Y"?"NOT":"")."(VA.".$key." IS NULL OR VA.".$key."<=0)";
					if (!empty($val))
					{
						$str = ($strNegative=="Y"?" VA.".$key." IS NULL OR NOT ":"")."(VA.".$key." ".$strOperation." ".intval($val).")";
						if ($strOperation == "IN")
						{
							$val = array_unique(array_map("intval", (is_array($val) ? $val : explode(",", $val))), SORT_NUMERIC);
							if (!empty($val))
							{
								$str = ($strNegative=="Y"?" NOT ":"")."(VA.".$key." IN (".implode(",", $val)."))";
							}
						}
					}
					$arSqlSearch[] = $str;
					break;
				case "VOTE_ID":
					$str = ($strNegative=="Y"?"NOT":"")."(VQ.".$key." IS NULL OR VQ.".$key."<=0)";
					if (!empty($val))
					{
						$str = ($strNegative=="Y"?" VQ.".$key." IS NULL OR NOT ":"")."(VQ.".$key." ".$strOperation." ".intval($val).")";
						if ($strOperation == "IN")
						{
							$val = array_unique(array_map("intval", (is_array($val) ? $val : explode(",", $val))), SORT_NUMERIC);
							if (!empty($val))
							{
								$str = ($strNegative=="Y"?" NOT ":"")."(VQ.".$key." IN (".implode(",", $val)."))";
							}
						}
					}
					$arSqlSearch[] = $str;
					break;
				case "CHANNEL_ID":
					$str = ($strNegative=="Y"?"NOT":"")."(V.".$key." IS NULL OR V.".$key."<=0)";
					if (!empty($val))
					{
						$str = ($strNegative=="Y"?" V.".$key." IS NULL OR NOT ":"")."(V.".$key." ".$strOperation." ".intval($val).")";
						if ($strOperation == "IN")
						{
							$val = array_unique(array_map("intval", (is_array($val) ? $val : explode(",", $val))), SORT_NUMERIC);
							if (!empty($val))
							{
								$str = ($strNegative=="Y"?" NOT ":"")."(V.".$key." IN (".implode(",", $val)."))";
							}
						}
					}
					$arSqlSearch[] = $str;
					break;
				case "ACTIVE":
					if (empty($val))
						$arSqlSearch[] = ($strNegative=="Y"?"NOT":"")."(VA.".$key." IS NULL OR ".($DB->type == "MSSQL" ? "LEN" : "LENGTH")."(VA.".$key.")<=0)";
					else
						$arSqlSearch[] = ($strNegative=="Y"?" VA.".$key." IS NULL OR NOT ":"")."(VA.".$key." ".$strOperation." '".$DB->ForSql($val)."')";
					break;
			}
		}
		if (count($arSqlSearch) > 0)
			$strSqlSearch = " AND (".implode(") AND (", $arSqlSearch).") ";

		foreach ($arOrder as $by => $order)
		{
			$by = mb_strtoupper($by);
			$order = mb_strtoupper($order);
			$by = (in_array($by, array("ACTIVE", "QUESTION_ID", "C_SORT", "COUNTER")) ? $by : "ID");
			if ($order!="ASC") $order = "DESC";
			if ($by == "ACTIVE") $arSqlOrder[] = " VA.ACTIVE ".$order." ";
			elseif ($by == "QUESTION_ID") $arSqlOrder[] = " VA.QUESTION_ID ".$order." ";
			elseif ($by == "C_SORT") $arSqlOrder[] = " VA.C_SORT ".$order." ";
			elseif ($by == "COUNTER") $arSqlOrder[] = " VA.COUNTER ".$order." ";
			else $arSqlOrder[] = " VA.ID ".$order." ";
		}
		DelDuplicateSort($arSqlOrder);
		if (count($arSqlOrder) > 0)
			$strSqlOrder = " ORDER BY ".implode(", ", $arSqlOrder);

		$strSql = "
			SELECT V.CHANNEL_ID, VQ.VOTE_ID, VA.*
			FROM b_vote_answer VA
				INNER JOIN b_vote_question VQ ON (VA.QUESTION_ID = VQ.ID)
				INNER JOIN b_vote V ON (VQ.VOTE_ID = V.ID)
			WHERE 1=1  ".$strSqlSearch." ".$strSqlOrder;

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

	public static function GetGroupAnswers($ANSWER_ID)
	{
		$err_mess = (self::err_mess())."<br>Function: GetGroupAnswers<br>Line: ";
		global $DB;
		$ANSWER_ID = intval($ANSWER_ID);
		$strSql =
		"SELECT A.MESSAGE, count(A.ID) as COUNTER ".
		"FROM
			b_vote_event_answer A,
			b_vote_event_question Q,
			b_vote_event E
		WHERE
			A.ANSWER_ID = '$ANSWER_ID'
		and Q.ID = A.EVENT_QUESTION_ID
		and E.ID = Q.EVENT_ID
		and E.VALID = 'Y'
		GROUP BY A.MESSAGE
		ORDER BY COUNTER desc";
		$res = $DB->Query($strSql, false, $err_mess.__LINE__);
		return $res;
	}
}