示例#1
0
 /**
  * 
  * $parameters is an ORM`s getList compatible array of parameters
  * 
  * 
  */
 public static function find($parameters, $behaviour = array('FALLBACK_TO_NOINDEX_ON_NOTFOUND' => true, 'USE_INDEX' => true, 'USE_ORM' => true))
 {
     /////////////////////////////////
     // parameter check and process
     Assert::expectArray($parameters, '$parameters');
     if (!is_array($behaviour)) {
         $behaviour = array();
     }
     if (!isset($behaviour['FALLBACK_TO_NOINDEX_ON_NOTFOUND'])) {
         $behaviour['FALLBACK_TO_NOINDEX_ON_NOTFOUND'] = true;
     }
     if (!isset($behaviour['USE_INDEX'])) {
         $behaviour['USE_INDEX'] = true;
     }
     if (!isset($behaviour['USE_ORM'])) {
         $behaviour['USE_ORM'] = true;
     }
     if (!isset($parameters['select'])) {
         $parameters['select'] = array('ID');
     }
     Assert::expectArray($parameters['select'], '$parameters[select]');
     if (isset($parameters['filter'])) {
         Assert::expectArray($parameters['filter'], '$parameters[filter]');
         // spikes, refactor later
         if (isset($parameters['filter']['PHRASE']) || isset($parameters['filter']['=PHRASE'])) {
             $key = isset($parameters['filter']['PHRASE']) ? 'PHRASE' : '=PHRASE';
             $parameters['filter'][$key] = Assert::expectStringNotNull($parameters['filter'][$key], '$parameters[filter][' . $key . ']');
             $parameters['filter'][$key] = str_replace('%', '', $parameters['filter'][$key]);
             // cannot pass '%' to like
         }
         if (isset($parameters['filter']['SITE_ID']) || isset($parameters['filter']['=SITE_ID'])) {
             $key = isset($parameters['filter']['SITE_ID']) ? 'SITE_ID' : '=SITE_ID';
             $parameters['filter'][$key] = Assert::expectStringNotNull($parameters['filter'][$key], '$parameters[filter][' . $key . ']');
             // stronger here
             if (!Location\SiteLocationTable::checkLinkUsageAny($parameters['filter'][$key])) {
                 unset($parameters['filter'][$key]);
             }
         }
     }
     if (isset($parameters['limit'])) {
         $parameters['limit'] = Assert::expectIntegerNonNegative($parameters['limit'], '$parameters[limit]');
     }
     if (isset($parameters['offset'])) {
         $parameters['offset'] = Assert::expectIntegerNonNegative($parameters['offset'], '$parameters[offset]');
     }
     /////////////////////////////////
     if (isset($parameters['filter']['PHRASE']) || isset($parameters['filter']['SITE_ID']) || isset($parameters['filter']['=PHRASE']) || isset($parameters['filter']['=SITE_ID']) || $behaviour['USE_ORM'] === false) {
         if (static::checkIndexValid() && $behaviour['USE_INDEX']) {
             $result = static::findUsingIndex($parameters);
             if (!$behaviour['FALLBACK_TO_NOINDEX_ON_NOTFOUND']) {
                 return $result;
             } else {
                 $temporalBuffer = array();
                 while ($item = $result->fetch()) {
                     $temporalBuffer[] = $item;
                 }
                 if (empty($temporalBuffer)) {
                     return static::findNoIndex($parameters);
                 } else {
                     return new DB\ArrayResult($temporalBuffer);
                 }
             }
         } else {
             return static::findNoIndex($parameters);
         }
     } else {
         return Location\LocationTable::getList($parameters);
     }
 }
示例#2
0
 public static function getSelectedIds($siteId)
 {
     $typesAll = \CSaleLocation::getTypes();
     $types = array();
     if (isset($typesAll['COUNTRY'])) {
         $types[] = "'" . intval($typesAll['COUNTRY']) . "'";
     }
     if (isset($typesAll['REGION'])) {
         $types[] = "'" . intval($typesAll['REGION']) . "'";
     }
     if (isset($typesAll['CITY'])) {
         $types[] = "'" . intval($typesAll['CITY']) . "'";
     }
     $typesAll = array_flip($typesAll);
     if ((string) $siteId != '' && \Bitrix\Sale\Location\SiteLocationTable::checkLinkUsageAny($siteId) && !empty($types)) {
         $result = array();
         $sql = \Bitrix\Sale\Location\SiteLocationTable::getConnectedLocationsSql($siteId, array('select' => array('ID', 'LEFT_MARGIN', 'RIGHT_MARGIN')), array('GET_LINKED_THROUGH_GROUPS' => true));
         if ((string) $sql != '') {
             $res = $GLOBALS['DB']->query("\n\n\t\t\t\t\tselect SL.ID, SL.TYPE_ID from b_sale_location SL \n\t\t\t\t\t\tinner join (\n\t\t\t\t\t\t" . $sql . "\n\t\t\t\t\t\t) as TT on \n\t\t\t\t\t\t\t(\n\t\t\t\t\t\t\t\t(\n\t\t\t\t\t\t\t\t\t(\n\t\t\t\t\t\t\t\t\t\tSL.LEFT_MARGIN >= TT.LEFT_MARGIN \n\t\t\t\t\t\t\t\t\t\tand \n\t\t\t\t\t\t\t\t\t\tSL.RIGHT_MARGIN <= TT.RIGHT_MARGIN\n\t\t\t\t\t\t\t\t\t)\n\t\t\t\t\t\t\t\t\tor\n\t\t\t\t\t\t\t\t\t(\n\t\t\t\t\t\t\t\t\t\tSL.LEFT_MARGIN <= TT.LEFT_MARGIN \n\t\t\t\t\t\t\t\t\t\tand \n\t\t\t\t\t\t\t\t\t\tSL.RIGHT_MARGIN >= TT.RIGHT_MARGIN\n\t\t\t\t\t\t\t\t\t)\n\t\t\t\t\t\t\t\t)\n\t\t\t\t\t\t\t\tand\n\t\t\t\t\t\t\t\tSL.TYPE_ID in (" . implode(', ', $types) . ")\n\t\t\t\t\t\t\t)\n\n\t\t\t\t\tgroup by SL.ID\n\t\t\t\t");
             while ($item = $res->fetch()) {
                 $typeId = $item['TYPE_ID'];
                 unset($item['TYPE_ID']);
                 $result[$typesAll[$typeId]][$item['ID']] = $item['ID'];
             }
             // special case: when all types are actually selected, an empty string ('') SHOULD be present among $index[$siteId][$type]
             $res = Location\LocationTable::getList(array('filter' => array('TYPE_ID' => $types), 'runtime' => array('CNT' => array('data_type' => 'integer', 'expression' => array('COUNT(*)'))), 'select' => array('CNT', 'TYPE_ID')));
             while ($item = $res->fetch()) {
                 if (intval($item['TYPE_ID'])) {
                     $typeCode = $typesAll[$item['TYPE_ID']];
                     if (isset($result[$typeCode]) && $item['CNT'] == count($result[$typeCode])) {
                         $result[$typeCode][] = '';
                     }
                 }
             }
         }
         return $result;
     } else {
         return array('COUNTRY' => array(''), 'REGION' => array(''), 'CITY' => array(''));
         // means "all"
     }
 }