Требуется разработчик! Поддержка серверов

CFormCrm::PrepareSql: метод Битрикс

Постоянная ссылка: http://bxapi.ru/src/?id=178163

<?php 
//    CFormCrm::PrepareSql()
//    /bitrix/modules/form/classes/general/form_callformcrm.php:775

    
protected static function PrepareSql(&$arFields$arOrder, &$arFilter$arGroupBy$arSelectFields)
    {
        global 
$DB;

        
$strSqlSelect "";
        
$strSqlFrom "";
        
$strSqlWhere "";
        
$strSqlGroupBy "";
        
$strSqlOrderBy "";

        
$arGroupByFunct = array("COUNT""AVG""MIN""MAX""SUM");

        
$arAlreadyJoined = array();

        
// GROUP BY -->
        
if (is_array($arGroupBy) && count($arGroupBy)>0)
        {
            
$arSelectFields $arGroupBy;
            foreach (
$arGroupBy as $key => $val)
            {
                
$val strtoupper($val);
                
$key strtoupper($key);
                if (
array_key_exists($val$arFields) && !in_array($key$arGroupByFunct))
                {
                    if (
strlen($strSqlGroupBy) > 0)
                        
$strSqlGroupBy .= ", ";
                    
$strSqlGroupBy .= $arFields[$val]["FIELD"];

                    if (isset(
$arFields[$val]["FROM"])
                        && 
strlen($arFields[$val]["FROM"]) > 0
                        
&& !in_array($arFields[$val]["FROM"], $arAlreadyJoined))
                    {
                        if (
strlen($strSqlFrom) > 0)
                            
$strSqlFrom .= " ";
                        
$strSqlFrom .= $arFields[$val]["FROM"];
                        
$arAlreadyJoined[] = $arFields[$val]["FROM"];
                    }
                }
            }
        }
        
// <-- GROUP BY

        // SELECT -->
        
$arFieldsKeys array_keys($arFields);

        if (
is_array($arGroupBy) && count($arGroupBy)==0)
        {
            
$strSqlSelect "COUNT(%%_DISTINCT_%% ".$arFields[$arFieldsKeys[0]]["FIELD"].") as CNT ";
        }
        else
        {
            if (isset(
$arSelectFields) && !is_array($arSelectFields) && is_string($arSelectFields) && strlen($arSelectFields)>&& array_key_exists($arSelectFields$arFields))
                
$arSelectFields = array($arSelectFields);

            if (!isset(
$arSelectFields)
                || !
is_array($arSelectFields)
                || 
count($arSelectFields)<=0
                
|| in_array("*"$arSelectFields))
            {
                
$cntFieldsKeys count($arFieldsKeys);
                for (
$i 0$i $cntFieldsKeys$i++)
                {
                    if (isset(
$arFields[$arFieldsKeys[$i]]["WHERE_ONLY"])
                        && 
$arFields[$arFieldsKeys[$i]]["WHERE_ONLY"] == "Y")
                    {
                        continue;
                    }

                    if (
strlen($strSqlSelect) > 0)
                        
$strSqlSelect .= ", ";

                    if (
$arFields[$arFieldsKeys[$i]]["TYPE"] == "datetime")
                    {
                        if ((
strtoupper($DB->type)=="ORACLE" || strtoupper($DB->type)=="MSSQL") && (array_key_exists($arFieldsKeys[$i], $arOrder)))
                            
$strSqlSelect .= $arFields[$arFieldsKeys[$i]]["FIELD"]." as ".$arFieldsKeys[$i]."_X1, ";

                        
$strSqlSelect .= $DB->DateToCharFunction($arFields[$arFieldsKeys[$i]]["FIELD"], "FULL")." as ".$arFieldsKeys[$i];
                    }
                    elseif (
$arFields[$arFieldsKeys[$i]]["TYPE"] == "date")
                    {
                        if ((
strtoupper($DB->type)=="ORACLE" || strtoupper($DB->type)=="MSSQL") && (array_key_exists($arFieldsKeys[$i], $arOrder)))
                            
$strSqlSelect .= $arFields[$arFieldsKeys[$i]]["FIELD"]." as ".$arFieldsKeys[$i]."_X1, ";

                        
$strSqlSelect .= $DB->DateToCharFunction($arFields[$arFieldsKeys[$i]]["FIELD"], "SHORT")." as ".$arFieldsKeys[$i];
                    }
                    else
                        
$strSqlSelect .= $arFields[$arFieldsKeys[$i]]["FIELD"]." as ".$arFieldsKeys[$i];

                    if (isset(
$arFields[$arFieldsKeys[$i]]["FROM"])
                        && 
strlen($arFields[$arFieldsKeys[$i]]["FROM"]) > 0
                        
&& !in_array($arFields[$arFieldsKeys[$i]]["FROM"], $arAlreadyJoined))
                    {
                        if (
strlen($strSqlFrom) > 0)
                            
$strSqlFrom .= " ";
                        
$strSqlFrom .= $arFields[$arFieldsKeys[$i]]["FROM"];
                        
$arAlreadyJoined[] = $arFields[$arFieldsKeys[$i]]["FROM"];
                    }
                }
            }
            else
            {
                foreach (
$arSelectFields as $key => $val)
                {
                    
$val strtoupper($val);
                    
$key strtoupper($key);
                    if (
array_key_exists($val$arFields))
                    {
                        if (
strlen($strSqlSelect) > 0)
                            
$strSqlSelect .= ", ";

                        if (
in_array($key$arGroupByFunct))
                        {
                            
$strSqlSelect .= $key."(".$arFields[$val]["FIELD"].") as ".$val;
                        }
                        else
                        {
                            if (
$arFields[$val]["TYPE"] == "datetime")
                            {
                                if ((
strtoupper($DB->type)=="ORACLE" || strtoupper($DB->type)=="MSSQL") && (array_key_exists($val$arOrder)))
                                    
$strSqlSelect .= $arFields[$val]["FIELD"]." as ".$val."_X1, ";

                                
$strSqlSelect .= $DB->DateToCharFunction($arFields[$val]["FIELD"], "FULL")." as ".$val;
                            }
                            elseif (
$arFields[$val]["TYPE"] == "date")
                            {
                                if ((
strtoupper($DB->type)=="ORACLE" || strtoupper($DB->type)=="MSSQL") && (array_key_exists($val$arOrder)))
                                    
$strSqlSelect .= $arFields[$val]["FIELD"]." as ".$val."_X1, ";

                                
$strSqlSelect .= $DB->DateToCharFunction($arFields[$val]["FIELD"], "SHORT")." as ".$val;
                            }
                            else
                                
$strSqlSelect .= $arFields[$val]["FIELD"]." as ".$val;
                        }

                        if (isset(
$arFields[$val]["FROM"])
                            && 
strlen($arFields[$val]["FROM"]) > 0
                            
&& !in_array($arFields[$val]["FROM"], $arAlreadyJoined))
                        {
                            if (
strlen($strSqlFrom) > 0)
                                
$strSqlFrom .= " ";
                            
$strSqlFrom .= $arFields[$val]["FROM"];
                            
$arAlreadyJoined[] = $arFields[$val]["FROM"];
                        }
                    }
                }
            }

            if (
strlen($strSqlGroupBy) > 0)
            {
                if (
strlen($strSqlSelect) > 0)
                    
$strSqlSelect .= ", ";
                
$strSqlSelect .= "COUNT(%%_DISTINCT_%% ".$arFields[$arFieldsKeys[0]]["FIELD"].") as CNT";
            }
            else
                
$strSqlSelect "%%_DISTINCT_%% ".$strSqlSelect;
        }
        
// <-- SELECT

        // WHERE -->
        
$arSqlSearch = array();

        if (!
is_array($arFilter))
            
$filter_keys = array();
        else
            
$filter_keys array_keys($arFilter);

        
$cntFilterKeys count($filter_keys);
        for (
$i 0$i $cntFilterKeys$i++)
        {
            
$vals $arFilter[$filter_keys[$i]];
            if (!
is_array($vals))
                
$vals = array($vals);
            else
                
$vals array_values($vals);

            
$key $filter_keys[$i];
            
$key_res self::GetFilterOperation($key);
            
$key $key_res["FIELD"];
            
$strNegative $key_res["NEGATIVE"];
            
$strOperation $key_res["OPERATION"];
            
$strOrNull $key_res["OR_NULL"];

            if (
array_key_exists($key$arFields))
            {
                
$arSqlSearch_tmp = array();
                
$cntVals count($vals);
                for (
$j 0$j $cntVals$j++)
                {
                    
$val $vals[$j];
                    if (isset(
$arFields[$key]["WHERE"]))
                    {
                        
$arSqlSearch_tmp1 call_user_func_array(
                            
$arFields[$key]["WHERE"],
                            array(
$val$key$strOperation$strNegative$arFields[$key]["FIELD"], $arFields$arFilter)
                        );
                        if (
$arSqlSearch_tmp1 !== false)
                            
$arSqlSearch_tmp[] = $arSqlSearch_tmp1;
                    }
                    else
                    {
                        if (
$arFields[$key]["TYPE"] == "int")
                        {
                            if ((
IntVal($val) == 0) && (strpos($strOperation"=") !== False))
                                
$arSqlSearch_tmp[] = "(".$arFields[$key]["FIELD"]." IS ".(($strNegative == "Y") ? "NOT " "")."NULL) ".(($strNegative == "Y") ? "AND" "OR")." ".(($strNegative == "Y") ? "NOT " "")."(".$arFields[$key]["FIELD"]." ".$strOperation." 0)";
                            else
                                
$arSqlSearch_tmp[] = (($strNegative == "Y") ? " ".$arFields[$key]["FIELD"]." IS NULL OR NOT " "")."(".$arFields[$key]["FIELD"]." ".$strOperation." ".IntVal($val)." )";
                        }
                        elseif (
$arFields[$key]["TYPE"] == "double")
                        {
                            
$val str_replace(",""."$val);

                            if ((
DoubleVal($val) == 0) && (strpos($strOperation"=") !== False))
                                
$arSqlSearch_tmp[] = "(".$arFields[$key]["FIELD"]." IS ".(($strNegative == "Y") ? "NOT " "")."NULL) ".(($strNegative == "Y") ? "AND" "OR")." ".(($strNegative == "Y") ? "NOT " "")."(".$arFields[$key]["FIELD"]." ".$strOperation." 0)";
                            else
                                
$arSqlSearch_tmp[] = (($strNegative == "Y") ? " ".$arFields[$key]["FIELD"]." IS NULL OR NOT " "")."(".$arFields[$key]["FIELD"]." ".$strOperation." ".DoubleVal($val)." )";
                        }
                        elseif (
$arFields[$key]["TYPE"] == "string" || $arFields[$key]["TYPE"] == "char")
                        {
                            if (
$strOperation == "QUERY")
                            {
                                
$arSqlSearch_tmp[] = GetFilterQuery($arFields[$key]["FIELD"], $val"Y");
                            }
                            else
                            {
                                if ((
strlen($val) == 0) && (strpos($strOperation"=") !== False))
                                    
$arSqlSearch_tmp[] = "(".$arFields[$key]["FIELD"]." IS ".(($strNegative == "Y") ? "NOT " "")."NULL) ".(($strNegative == "Y") ? "AND NOT" "OR")." (".$DB->Length($arFields[$key]["FIELD"])." <= 0) ".(($strNegative == "Y") ? "AND NOT" "OR")." (".$arFields[$key]["FIELD"]." ".$strOperation." '".$DB->ForSql($val)."' )";
                                else
                                    
$arSqlSearch_tmp[] = (($strNegative == "Y") ? " ".$arFields[$key]["FIELD"]." IS NULL OR NOT " "")."(".$arFields[$key]["FIELD"]." ".$strOperation." '".$DB->ForSql($val)."' )";
                            }
                        }
                        elseif (
$arFields[$key]["TYPE"] == "datetime")
                        {
                            if (
strlen($val) <= 0)
                                
$arSqlSearch_tmp[] = ($strNegative=="Y"?"NOT":"")."(".$arFields[$key]["FIELD"]." IS NULL)";
                            else
                                
$arSqlSearch_tmp[] = ($strNegative=="Y"?" ".$arFields[$key]["FIELD"]." IS NULL OR NOT ":"")."(".$arFields[$key]["FIELD"]." ".$strOperation." ".$DB->CharToDateFunction($DB->ForSql($val), "FULL").")";
                        }
                        elseif (
$arFields[$key]["TYPE"] == "date")
                        {
                            if (
strlen($val) <= 0)
                                
$arSqlSearch_tmp[] = ($strNegative=="Y"?"NOT":"")."(".$arFields[$key]["FIELD"]." IS NULL)";
                            else
                                
$arSqlSearch_tmp[] = ($strNegative=="Y"?" ".$arFields[$key]["FIELD"]." IS NULL OR NOT ":"")."(".$arFields[$key]["FIELD"]." ".$strOperation." ".$DB->CharToDateFunction($DB->ForSql($val), "SHORT").")";
                        }
                    }
                }

                if (isset(
$arFields[$key]["FROM"])
                    && 
strlen($arFields[$key]["FROM"]) > 0
                    
&& !in_array($arFields[$key]["FROM"], $arAlreadyJoined))
                {
                    if (
strlen($strSqlFrom) > 0)
                        
$strSqlFrom .= " ";
                    
$strSqlFrom .= $arFields[$key]["FROM"];
                    
$arAlreadyJoined[] = $arFields[$key]["FROM"];
                }

                
$strSqlSearch_tmp "";
                
$cntSqlSearch_tmp count($arSqlSearch_tmp);

                for (
$j 0$j $cntSqlSearch_tmp$j++)
                {
                    if (
$j 0)
                        
$strSqlSearch_tmp .= ($strNegative=="Y" " AND " " OR ");
                    
$strSqlSearch_tmp .= "(".$arSqlSearch_tmp[$j].")";
                }
                if (
$strOrNull == "Y")
                {
                    if (
strlen($strSqlSearch_tmp) > 0)
                        
$strSqlSearch_tmp .= ($strNegative=="Y" " AND " " OR ");
                    
$strSqlSearch_tmp .= "(".$arFields[$key]["FIELD"]." IS ".($strNegative=="Y" "NOT " "")."NULL)";

                    if (
strlen($strSqlSearch_tmp) > 0)
                        
$strSqlSearch_tmp .= ($strNegative=="Y" " AND " " OR ");
                    if (
$arFields[$key]["TYPE"] == "int" || $arFields[$key]["TYPE"] == "double")
                        
$strSqlSearch_tmp .= "(".$arFields[$key]["FIELD"]." ".($strNegative=="Y" "<>" "=")." 0)";
                    elseif (
$arFields[$key]["TYPE"] == "string" || $arFields[$key]["TYPE"] == "char")
                        
$strSqlSearch_tmp .= "(".$arFields[$key]["FIELD"]." ".($strNegative=="Y" "<>" "=")." '')";
                    else
                        
$strSqlSearch_tmp .= ($strNegative=="Y" " (1=1) " " (1=0) ");
                }

                if (
$strSqlSearch_tmp != "")
                    
$arSqlSearch[] = "(".$strSqlSearch_tmp.")";
            }
        }

        
$cntSqlSearch count($arSqlSearch);
        for (
$i 0$i $cntSqlSearch$i++)
        {
            if (
strlen($strSqlWhere) > 0)
                
$strSqlWhere .= " AND ";
            
$strSqlWhere .= "(".$arSqlSearch[$i].")";
        }
        
// <-- WHERE

        // ORDER BY -->
        
$arSqlOrder = Array();
        foreach (
$arOrder as $by => $order)
        {
            
$by strtoupper($by);
            
$order strtoupper($order);

            if (
$order != "ASC")
                
$order "DESC";
            else
                
$order "ASC";

            if (
array_key_exists($by$arFields))
            {
                
$arSqlOrder[] = " ".$arFields[$by]["FIELD"]." ".$order." ";

                if (isset(
$arFields[$by]["FROM"])
                    && 
strlen($arFields[$by]["FROM"]) > 0
                    
&& !in_array($arFields[$by]["FROM"], $arAlreadyJoined))
                {
                    if (
strlen($strSqlFrom) > 0)
                        
$strSqlFrom .= " ";
                    
$strSqlFrom .= $arFields[$by]["FROM"];
                    
$arAlreadyJoined[] = $arFields[$by]["FROM"];
                }
            }
        }

        
DelDuplicateSort($arSqlOrder);
        
$cntSqlOrder count($arSqlOrder);
        for (
$i=0$i<$cntSqlOrder$i++)
        {
            if (
strlen($strSqlOrderBy) > 0)
                
$strSqlOrderBy .= ", ";

            if(
strtoupper($DB->type)=="ORACLE")
            {
                if(
substr($arSqlOrder[$i], -3)=="ASC")
                    
$strSqlOrderBy .= $arSqlOrder[$i]." NULLS FIRST";
                else
                    
$strSqlOrderBy .= $arSqlOrder[$i]." NULLS LAST";
            }
            else
                
$strSqlOrderBy .= $arSqlOrder[$i];
        }
        
// <-- ORDER BY

        
return array(
            
"SELECT" => $strSqlSelect,
            
"FROM" => $strSqlFrom,
            
"WHERE" => $strSqlWhere,
            
"GROUPBY" => $strSqlGroupBy,
            
"ORDERBY" => $strSqlOrderBy
        
);
    }

Блог разработчика

9 августа 2016 ResizeImageGet и простой водяной знак налету

Сегодня поговорим о том как проще всего воткнуть водяной знак на картинки в Битрикс. Например, на все изображения каталога.

21 июля 2016 Добавление вкладки в CRM коробки Битрикс24

В этом посте я покажу, как легко и просто добавить вкладку в сущность CRM. И не просто добавить, а вывести там свой контент.

21 июля 2016 Как просто обращаться из коробки Битрикс24 на сайт на базе Битрикс

К примеру вам хочется внутренним скриптом дернуть с сайта-магазина информацию, которая там, в свою очередь, закрыта некоторыми правами. Например, админскими. Можно конечно мутить свой REST, или иной формат общения, но проще всего воспользоваться штатным инструментом:

Текст сообщения*
Загрузить изображение