/** * * $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); } }
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" } }