Your IP : 172.28.240.42


Current Path : /var/www/html/clients/old.e-nkama.ru/e-nkama_bitrix/bitrix/modules/iblock/classes/mysql/
Upload File :
Current File : /var/www/html/clients/old.e-nkama.ru/e-nkama_bitrix/bitrix/modules/iblock/classes/mysql/iblock.php

<?
class CIBlock extends CAllIBlock
{
	///////////////////////////////////////////////////////////////////
	// List of blocks
	///////////////////////////////////////////////////////////////////
	function GetList($arOrder=Array("SORT"=>"ASC"), $arFilter=Array(), $bIncCnt = false)
	{
		global $DB, $USER;
		$arSqlSearch = Array();
		$bAddSites = false;
		$filter_keys = array_keys($arFilter);
		for($i=0; $i<count($filter_keys); $i++)
		{
			$val = $arFilter[$filter_keys[$i]];
			$key = $filter_keys[$i];
			$res = CIBlock::MkOperationFilter($key);
			$key = $res["FIELD"];
			$cOperationType = $res["OPERATION"];

			$key = strtoupper($key);
			switch($key)
			{
				case "ACTIVE":
					$arSqlSearch[] = CIBlock::FilterCreate("B.ACTIVE", $val, "string_equal", $cOperationType);
					break;
				case "LID":
				case "SITE_ID":
					$str_res = CIBlock::FilterCreate("BS.SITE_ID", $val, "string_equal", $cOperationType);
					if(strlen($str_res)>0)
					{
						$arSqlSearch[] = $str_res;
						$bAddSites = true;
					}
					break;
				case "NAME":
				case "XML_ID":
					$arSqlSearch[] = CIBlock::FilterCreate("B.".$key, $val, "string", $cOperationType);
					break;
				case "EXTERNAL_ID":
					$arSqlSearch[] = CIBlock::FilterCreate("B.XML_ID", $val, "string", $cOperationType);
					break;
				case "TYPE":
					$arSqlSearch[] = CIBlock::FilterCreate("B.IBLOCK_TYPE_ID", $val, "string", $cOperationType);
					break;
				case "CODE":
					$arSqlSearch[] = CIBlock::FilterCreate("B.CODE", $val, "string", $cOperationType);
					break;
				case "ID":
					$arSqlSearch[] = CIBlock::FilterCreate("B.ID", $val, "number", $cOperationType);
					break;
				case "VERSION":
					$arSqlSearch[] = CIBlock::FilterCreate("B.VERSION", $val, "number", $cOperationType);
					break;
			}
		}

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

		if(
			(
				array_key_exists("CHECK_PERMISSIONS", $arFilter)
				&& $arFilter["CHECK_PERMISSIONS"]==="N"
			) || (
				is_object($USER)
				&& $USER->IsAdmin()
			)
		)
		{
			$sqlPermissions = "";
		}
		else
		{
			$strGroups = (is_object($USER)?$USER->GetGroups():"2");
			$min_permission = (strlen($arFilter["MIN_PERMISSION"])==1) ? $arFilter["MIN_PERMISSION"] : "R";
			$sqlPermissions = "
						AND IBG.GROUP_ID IN (".$strGroups.")
						AND IBG.PERMISSION >= '".$min_permission."'
						AND (IBG.PERMISSION='X' OR B.ACTIVE='Y')
			";
		}

		if ($bAddSites)
			$sqlJoinSites = " LEFT JOIN b_iblock_site BS ON B.ID=BS.IBLOCK_ID ".
					" LEFT JOIN b_lang L ON L.LID=BS.SITE_ID ";
		else
			$sqlJoinSites = " INNER JOIN b_lang L ON L.LID=B.LID ";

		if(!$bIncCnt)
		{
			$strSql =
				"SELECT DISTINCT B.*, B.XML_ID as EXTERNAL_ID, ".$DB->DateToCharFunction("B.TIMESTAMP_X")." as TIMESTAMP_X, L.DIR as LANG_DIR, L.SERVER_NAME ".
				"FROM b_iblock B ".
				$sqlJoinSites.
				"	LEFT JOIN b_iblock_group IBG ON IBG.IBLOCK_ID=B.ID ".
				"WHERE 1 = 1 ".
				$sqlPermissions.
				$strSqlSearch;
		}
		else
		{
			$strSql =
				"SELECT B.*, B.XML_ID as EXTERNAL_ID, ".$DB->DateToCharFunction("B.TIMESTAMP_X")." as TIMESTAMP_X, L.DIR as LANG_DIR, L.SERVER_NAME, COUNT(DISTINCT BE.ID) as ELEMENT_CNT  ".
				"FROM b_iblock B ".
				$sqlJoinSites.
				"	LEFT JOIN b_iblock_group IBG ON IBG.IBLOCK_ID=B.ID ".
				"	LEFT JOIN b_iblock_element BE ON (BE.IBLOCK_ID=B.ID ".
				" 		AND ((BE.WF_STATUS_ID=1 AND BE.WF_PARENT_ELEMENT_ID IS NULL ) ".
				($arFilter["CNT_ALL"]=="Y"?" OR BE.WF_NEW='Y' ":"").") ".
				($arFilter["CNT_ACTIVE"]=="Y"?
					" AND BE.ACTIVE='Y' ".
					" AND (BE.ACTIVE_TO >= ".$DB->CurrentDateFunction()." OR BE.ACTIVE_TO IS NULL) ".
					" AND (BE.ACTIVE_FROM <= ".$DB->CurrentDateFunction()." OR BE.ACTIVE_FROM IS NULL)"
				:"").") ".
				"WHERE 1=1 ".
				$sqlPermissions.
				$strSqlSearch.
				"GROUP BY B.ID ";
		}

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

				if ($by == "id") $arSqlOrder[$by] = " B.ID ".$order." ";
				elseif ($by == "lid") $arSqlOrder[$by] = " B.LID ".$order." ";
				elseif ($by == "iblock_type") $arSqlOrder[$by] = " B.IBLOCK_TYPE_ID ".$order." ";
				elseif ($by == "name") $arSqlOrder[$by] = " B.NAME ".$order." ";
				elseif ($by == "active") $arSqlOrder[$by] = " B.ACTIVE ".$order." ";
				elseif ($by == "sort") $arSqlOrder[$by] = " B.SORT ".$order." ";
				elseif ($bIncCnt && $by == "element_cnt") $arSqlOrder[$by] = " ELEMENT_CNT ".$order." ";
				else
				{
					$by = "timestamp_x";
					$arSqlOrder[$by] = " B.TIMESTAMP_X ".$order." ";
				}
			}
		}

		if(count($arSqlOrder) > 0)
			$strSqlOrder = " ORDER BY ".implode(",", $arSqlOrder);
		else
			$strSqlOrder = "";

		$res = $DB->Query($strSql.$strSqlOrder, false, "FILE: ".__FILE__."<br> LINE: ".__LINE__);
		return $res;
	}

	function _Upper($str)
	{
		return $str;
	}

	function _Add($ID)
	{
		global $DB;
		if (strtolower($DB->type)=="mysql" && defined("MYSQL_TABLE_TYPE") && strlen(MYSQL_TABLE_TYPE)>0)
		{
			$DB->Query("SET table_type = '".MYSQL_TABLE_TYPE."'", true);
		}
		$ID=intval($ID);
		$strSql = "
			CREATE TABLE IF NOT EXISTS b_iblock_element_prop_s".$ID." (
				IBLOCK_ELEMENT_ID 	int(11) not null REFERENCES b_iblock_element(ID),
				primary key (IBLOCK_ELEMENT_ID)
			)
		";
		$rs = $DB->Query($strSql);
		$strSql = "
			CREATE TABLE IF NOT EXISTS b_iblock_element_prop_m".$ID." (
				ID			int(11) not null auto_increment,
				IBLOCK_ELEMENT_ID 	int(11) not null REFERENCES b_iblock_element(ID),
				IBLOCK_PROPERTY_ID	int(11) not null REFERENCES b_iblock_property(ID),
				VALUE			text	not null,
				VALUE_ENUM 		int(11),
				VALUE_NUM 		numeric(18,4),
				DESCRIPTION 		VARCHAR(255) NULL,
				PRIMARY KEY (ID),
				INDEX ix_iblock_elem_prop_m".$ID."_1(IBLOCK_ELEMENT_ID,IBLOCK_PROPERTY_ID),
				INDEX ix_iblock_elem_prop_m".$ID."_2(IBLOCK_PROPERTY_ID),
				INDEX ix_iblock_elem_prop_m".$ID."_3(VALUE_ENUM,IBLOCK_PROPERTY_ID)
			)
		";
		if($rs) $rs = $DB->Query($strSql);
		return $rs;
	}

	function _Order($by, $order, $default_order, $nullable = true)
	{
		$o = parent::_Order($by, $order, $default_order, $nullable);
		//$o[0] - bNullsFirst
		//$o[1] - asc|desc
		if($o[0])
		{
			if($o[1] == "asc")
				return $by." asc";
			else
				return "length(".$by.")>0 asc, ".$by." desc";
		}
		else
		{
			if($o[1] == "asc")
				return "length(".$by.")>0 desc, ".$by." asc";
			else
				return $by." desc";
		}
	}
}
?>