コード例 #1
0
 function GetList($arSort = array("SORT" => "ASC"), $arFilter = array())
 {
     /*
     Filter:
     	"ACTIVE" => Y (default); 'ALL' for full list without activity check;
     	"SITE_ID" => SITE_ID (default); 'ALL' for full list without site check. Syn. SITE;
     	"COMPABILITY" => "N" (default); arOrder for additional check inside this method
     	"SID" => only with this SID. Syn: "ID";
     	"HANDLER" => check by part of handler path. Syn: "PATH"
     */
     global $DB;
     if (!defined('SALE_DH_INITIALIZED')) {
         CSaleDeliveryHandler::Initialize();
     }
     $arAllowedSort = array("SORT" => "SORT", "NAME" => "NAME", "SID" => "HID", "SITE_ID" => "LID", "HANDLER" => "HANDLER", "ACTIVE" => "ACTIVE");
     foreach ($arSort as $SORT => $SORT_DIR) {
         if (array_key_exists($SORT, $arAllowedSort)) {
             unset($arSort[$SORT]);
             $arSort[$arAllowedSort[$SORT]] = $SORT_DIR == "DESC" ? "DESC" : "ASC";
         } else {
             unset($arSort[$SORT]);
         }
     }
     // additional filter synonim check
     if (is_set($arFilter, "SITE") && !is_set($arFilter, "SITE_ID")) {
         $arFilter["SITE_ID"] = $arFilter["SITE"];
     }
     unset($arFilter["SITE"]);
     $arFilterDefault = array("SITE_ID" => SITE_ID, "COMPABILITY" => "N", "ACTIVE" => "Y");
     if (!is_array($arFilter)) {
         $arFilter = array();
     }
     foreach ($arFilterDefault as $key => $value) {
         if (!is_set($arFilter, $key)) {
             $arFilter[$key] = $value;
         }
     }
     $bAllSite = false;
     if ($arFilter["SITE_ID"] == "ALL") {
         $bAllSite = true;
         unset($arFilter["SITE_ID"]);
     }
     if ($arFilter["ACTIVE"] == "ALL") {
         unset($arFilter["ACTIVE"]);
     }
     $arWhere = array();
     $strWhere = "";
     $arFilterKeys = array_keys($arFilter);
     foreach ($arFilter as $key => $value) {
         $match_value_set = in_array($key . "_EXACT_MATCH", $arFilterKeys) ? true : false;
         $match = $arFilter[$key . "_EXACT_MATCH"] == "N" && $match_value_set ? "Y" : "N";
         $key = ToUpper($key);
         switch ($key) {
             // SITE_ID is unavailable for extended sorting! only direct selection; It's needed for after-select filtration.
             case "SITE_ID":
                 if (strlen($value) > 0) {
                     //$arWhere[] = GetFilterQuery("LID", $value, $match);
                     $arWhere[] = "LID='" . $DB->ForSql($value) . "' OR LID='' OR LID IS NULL";
                 }
                 break;
             case "ACTIVE":
                 if (strlen($value) > 0) {
                     $arWhere[] = "ACTIVE='" . ($value == 'N' ? 'N' : 'Y') . "'";
                 }
                 break;
             case "SID":
             case "ID":
                 if (strlen($value) > 0) {
                     $arWhere[] = GetFilterQuery("HID", $DB->ForSql($value), $match);
                 }
                 break;
             case "HANDLER":
             case "PATH":
                 if (strlen($value) > 0) {
                     $arWhere[] = GetFilterQuery("HANDLER", $DB->ForSql($value), $match);
                 }
         }
     }
     $strWhere = GetFilterSqlSearch($arWhere);
     $query = "\nSELECT HID AS SID\nFROM b_sale_delivery_handler\nWHERE\n" . $strWhere . "\n";
     if (count($arSort) > 0) {
         $query .= "ORDER BY ";
         $bFirst = true;
         foreach ($arSort as $SORT => $SORT_DIR) {
             if ($bFirst) {
                 $bFirst = false;
             } else {
                 $query .= ", ";
             }
             $query .= $SORT . " " . $SORT_DIR;
         }
     }
     $dbRes = $DB->Query($query);
     $arLoadedHandlers = array();
     $arLoadedHandlersMap = array();
     while ($arRes = $dbRes->Fetch()) {
         $arLoadedHandlersMap[$arRes["SID"]] = $arRes;
     }
     $arHandlersList = CSaleDeliveryHandler::__getRegisteredHandlers();
     if (is_array($arHandlersList)) {
         foreach ($arHandlersList as $key => $arHandler) {
             if (is_array($arLoadedHandlersMap) && !array_key_exists($arHandler["SID"], $arLoadedHandlersMap)) {
                 unset($arHandlersList[$key]);
             }
         }
         $arHandlersList = array_values($arHandlersList);
         $arHandlersList = CSaleDeliveryHandler::__getHandlersData($arHandlersList);
         if ($arFilter["SITE_ID"] != "ALL" && is_array($arHandlersList)) {
             foreach ($arHandlersList as $key => $arHandler) {
                 if (strlen($arHandler['LID']) > 0 && $arHandler['LID'] != $arFilter["SITE_ID"]) {
                     unset($arHandlersList[$key]);
                 }
             }
         }
         if (is_array($arFilter["COMPABILITY"]) && is_array($arHandlersList)) {
             foreach ($arHandlersList as $key => $arHandler) {
                 $arProfiles = CSaleDeliveryHandler::GetHandlerCompability($arFilter["COMPABILITY"], $arHandler);
                 if (!is_array($arProfiles) || count($arProfiles) <= 0) {
                     unset($arHandlersList[$key]);
                 } else {
                     $arHandlersList[$key]["PROFILES"] = $arProfiles;
                 }
             }
         }
         CSaleDeliveryHandler::__sortList($arHandlersList, $arSort);
     }
     $dbHandlers = new CDBResult();
     if (is_array($arHandlersList)) {
         reset($arHandlersList);
         $dbHandlers->InitFromArray($arHandlersList);
     } else {
         $dbHandlers->InitFromArray(array());
     }
     return $dbHandlers;
 }