/** * Метод для поиска родителей объекта * * @param array $arCodes Массив кодов объекта * @param string $cityOwnerId ID города-родителя объекта / временный хак * @return array Массив родителей объекта */ public static function findParents($arCodes, $cityOwnerId = null) { if (!$arCodes) { return array(); } $arCodes = array_slice($arCodes, 0, count($arCodes) - 1); $arReturn = array(); $object = array(); foreach ($arCodes as $field => $code) { $contentType = ''; switch ($field) { case KladrFields::CodeRegion: $object = Regions::findFirst(array(array(KladrFields::CodeRegion => $arCodes[KladrFields::CodeRegion], KladrFields::Bad => false))); $contentType = Regions::ContentType; break; case KladrFields::CodeDistrict: $object = Districts::findFirst(array(array(KladrFields::CodeRegion => $arCodes[KladrFields::CodeRegion], KladrFields::CodeDistrict => $arCodes[KladrFields::CodeDistrict], KladrFields::Bad => false))); $contentType = Districts::ContentType; break; case KladrFields::CodeLocality: $object = Cities::findFirst(array(array(KladrFields::CodeRegion => $arCodes[KladrFields::CodeRegion], KladrFields::CodeDistrict => $arCodes[KladrFields::CodeDistrict], KladrFields::CodeLocality => $arCodes[KladrFields::CodeLocality], KladrFields::Bad => false))); $contentType = Cities::ContentType; break; case KladrFields::CodeStreet: $object = Streets::findFirst(array(array(KladrFields::CodeRegion => $arCodes[KladrFields::CodeRegion], KladrFields::CodeDistrict => $arCodes[KladrFields::CodeDistrict], KladrFields::CodeLocality => $arCodes[KladrFields::CodeLocality], KladrFields::CodeStreet => $arCodes[KladrFields::CodeStreet], KladrFields::Bad => false))); $contentType = Streets::ContentType; break; } if ($object) { $arReturn[] = array('id' => $object->readAttribute(KladrFields::Id), 'name' => $object->readAttribute(KladrFields::Name), 'zip' => $object->readAttribute(KladrFields::ZipCode), 'type' => $object->readAttribute(KladrFields::Type), 'typeShort' => $object->readAttribute(KladrFields::TypeShort), 'okato' => $object->readAttribute(KladrFields::Okato), 'contentType' => $contentType); } } if ($cityOwnerId) { $owner = Cities::findByQuery(null, $cityOwnerId); if ($owner && is_array($owner) && count($owner) > 0) { $owner = $owner[0]; $owner['contentType'] = 'cityOwner'; $arReturn[] = $owner; } } return $arReturn; }
/** * Выполняет обработку запроса * * @param \Phalcon\Http\Request $request * @param \Kladr\Core\Plugins\Base\PluginResult $prevResult * @return \Kladr\Core\Plugins\Base\PluginResult */ public function process(Request $request, PluginResult $prevResult) { if ($prevResult->error) { return $prevResult; } // Проверяем, что ищем город // с принадлежностью региону if ($request->getQuery('contentType') != 'city') { return $prevResult; } if (!$request->getQuery('regionId')) { return $prevResult; } // добавляем к результату поиск в другом регионе $arRegionCodeSpecialCases = array(50 => 77, 47 => 78); $objects = $this->cache->get('SpecialCasesPlugin', $request); if ($objects === null) { $objects = array(); $arCodes = array(); // regionId $regionId = $request->getQuery('regionId'); if ($regionId) { $arCodes = Regions::getCodes($regionId); } // districtId $districtId = $request->getQuery('districtId'); if ($districtId) { $arCodes = Districts::getCodes($districtId); } // cityId $cityId = $request->getQuery('cityId'); if ($cityId) { $arCodes = Cities::getCodes($cityId); } // streetId $streetId = $request->getQuery('streetId'); if ($streetId) { $arCodes = Streets::getCodes($streetId); } // buildingId $buildingId = $request->getQuery('buildingId'); if ($buildingId) { $arCodes = Buildings::getCodes($buildingId); } if (!isset($arCodes[KladrFields::CodeRegion]) && !isset($arRegionCodeSpecialCases[$arCodes[KladrFields::CodeRegion]])) { return $prevResult; } $arCodes[KladrFields::CodeRegion] = $arRegionCodeSpecialCases[$arCodes[KladrFields::CodeRegion]]; // query $query = $request->getQuery('query'); $query = Tools::Key($query); $query = Tools::Normalize($query); // limit $limit = $request->getQuery('limit'); $limit = intval($limit); $limit = $limit ? $limit : 5000; if ($limit > 400) { $limit = 400; } switch ($request->getQuery('contentType')) { case Regions::ContentType: $objects = Regions::findByQuery($query, $arCodes, $limit); break; case Districts::ContentType: $objects = Districts::findByQuery($query, $arCodes, $limit); break; case Cities::ContentType: $objects = Cities::findByQuery($query, $arCodes, $limit); break; case Streets::ContentType: $objects = Streets::findByQuery($query, $arCodes, $limit); break; case Buildings::ContentType: $objects = Buildings::findByQuery($query, $arCodes, $limit); break; } $this->cache->set('SpecialCasesPlugin', $request, $objects); } $result = $prevResult; $result->result = array_merge($prevResult->result, $objects); return $result; }
/** * Выполняет обработку запроса * * @param \Phalcon\Http\Request $request * @param \Kladr\Core\Plugins\Base\PluginResult $prevResult * @return \Kladr\Core\Plugins\Base\PluginResult */ public function process(Request $request, PluginResult $prevResult) { if ($prevResult->error || $prevResult->isPluginDisabled('FindPlugin')) { return $prevResult; } $objects = null; $objects = $this->cache->get('FindPlugin', $request); if ($objects === null) { $objects = array(); // query $query = $request->getQuery('query'); $query = Tools::Key($query); $query = Tools::Normalize($query); $arCodes = null; // regionId $regionId = $request->getQuery('regionId'); if ($regionId) { $arCodes = $request->getQuery('contentType') == 'region' ? $regionId : Regions::getCodes($regionId); } // districtId $districtId = $request->getQuery('districtId'); if ($districtId) { $arCodes = $request->getQuery('contentType') == 'district' ? $districtId : Districts::getCodes($districtId); } // cityId $cityId = $request->getQuery('cityId'); if ($cityId) { $arCodes = $request->getQuery('contentType') == 'city' ? $cityId : Cities::getCodes($cityId); } // streetId $streetId = $request->getQuery('streetId'); if ($streetId) { $arCodes = $request->getQuery('contentType') == 'street' ? $streetId : Streets::getCodes($streetId); } // buildingId $buildingId = $request->getQuery('buildingId'); if ($buildingId) { $arCodes = Buildings::getCodes($buildingId); } // zip $zip = (int) $request->getQuery('zip'); if ($zip <= 0 || $zip > 999999) { $zip = null; } // limit $limit = $request->getQuery('limit'); $limit = intval($limit); $limit = $limit ? $limit : 400; if ($limit > 400) { $limit = 400; } //offset $offset = $request->getQuery('offset'); $offset = intval($offset); $typeCodes = self::ConvertCodeTypeToArray($request->getQuery('typeCode')); switch ($request->getQuery('contentType')) { case Regions::ContentType: $objects = Regions::findByQuery($query, $arCodes, $limit, $offset); break; case Districts::ContentType: $objects = Districts::findByQuery($query, $arCodes, $limit, $offset); break; case Cities::ContentType: $objects = Cities::findByQuery($query, $arCodes, $limit, $offset, $typeCodes); break; case Streets::ContentType: $objects = Streets::findByQuery($query, $arCodes, $limit, $offset); break; case Buildings::ContentType: $objects = Buildings::findByQuery($query, $arCodes, $limit, $zip); break; } $this->cache->set('FindPlugin', $request, $objects); } $result = $prevResult; $result->result = $objects; return $result; }
/** * Выполняет обработку запроса * * @param \Phalcon\Http\Request $request * @param \Kladr\Core\Plugins\Base\PluginResult $prevResult * @return \Kladr\Core\Plugins\Base\PluginResult */ public function process(Request $request, PluginResult $prevResult) { if ($prevResult->error) { return $prevResult; } $objects = $this->cache->get('DuplicatePlugin', $request); if ($objects === null) { $objects = array(); $arCodes = array(); $existDuplicate = false; // regionId $regionId = $request->getQuery('regionId'); if ($regionId && $this->arDuplicates[$regionId]) { $arCodes = Regions::getCodes($this->arDuplicates[$regionId]); $existDuplicate = true; } // districtId $districtId = $request->getQuery('districtId'); if ($districtId && $this->arDuplicates[$districtId]) { $arCodes = Districts::getCodes($this->arDuplicates[$districtId]); $existDuplicate = true; } // cityId $cityId = $request->getQuery('cityId'); if ($cityId && $this->arDuplicates[$cityId]) { $arCodes = Cities::getCodes($this->arDuplicates[$cityId]); $existDuplicate = true; } // streetId $streetId = $request->getQuery('streetId'); if ($streetId && $this->arDuplicates[$streetId]) { $arCodes = Streets::getCodes($streetId); $existDuplicate = true; } // buildingId $buildingId = $request->getQuery('buildingId'); if ($buildingId && $this->arDuplicates[$buildingId]) { $arCodes = Buildings::getCodes($this->arDuplicates[$buildingId]); $existDuplicate = true; } if ($existDuplicate) { // query $query = $request->getQuery('query'); $query = Tools::Key($query); $query = Tools::Normalize($query); // limit $limit = $request->getQuery('limit'); $limit = intval($limit); $limit = $limit ? $limit : 5000; if ($limit > 400) { $limit = 400; } switch ($request->getQuery('contentType')) { case Regions::ContentType: $objects = Regions::findByQuery($query, $arCodes, $limit); break; case Districts::ContentType: $objects = Districts::findByQuery($query, $arCodes, $limit); break; case Cities::ContentType: $objects = Cities::findByQuery($query, $arCodes, $limit); break; case Streets::ContentType: $objects = Streets::findByQuery($query, $arCodes, $limit); break; case Buildings::ContentType: $objects = Buildings::findByQuery($query, $arCodes, $limit); break; } } $this->cache->set('DuplicatePlugin', $request, $objects); } $result = $prevResult; $objects = array_merge($prevResult->result, $objects); $arResult = array(); $arIgnore = array(); foreach ($objects as $object) { $ignoreId = isset($this->arDuplicates[$object['id']]) ? $this->arDuplicates[$object['id']] : false; if ($ignoreId) { $arIgnore[] = $ignoreId; } if (!in_array($object['id'], $arIgnore)) { $arResult[] = $object; } } $result->result = $objects; return $result; }