Current Path : /var/www/html/clients/old.e-nkama.ru/e-nkama_bitrix/bitrix/modules/iblock/classes/mysql/ |
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"; } } } ?>