public function guess($query) { $currentLimit = 1; $items = array(); if (!$items) { $items = array(); $cityIds = array(); //try to search via code $criteria = new CDbCriteria(); $criteria->limit = $currentLimit; $criteria->params[':code'] = $query; $criteria->addCondition('t.code = :code'); $criteria->addCondition('t.hotelbookId > 0'); $criteria->with = 'country'; /** @var City[] $cities */ $cities = City::model()->findAll($criteria); if ($cities) { foreach ($cities as $city) { $items[] = $city; $cityIds[$city->id] = $city->id; } } $currentLimit -= count($items); //try to search via names $criteria = new CDbCriteria(); $criteria->limit = $currentLimit; $criteria->params[':localRu'] = $query . '%'; $criteria->params[':localEn'] = $query . '%'; $criteria->addCondition('t.localRu LIKE :localRu OR t.localEn LIKE :localEn'); $criteria->addCondition('t.hotelbookId > 0'); if ($cityIds) { $criteria->addCondition('t.id NOT IN (' . join(',', $cityIds) . ')'); } $criteria->with = 'country'; $criteria->order = 'country.position desc, t.position desc'; $cities = City::model()->findAll($criteria); if ($cities) { foreach ($cities as $city) { $items[] = $city; $cityIds[$city->id] = $city->id; } } $currentLimit -= count($items); if ($currentLimit) { $criteria = new CDbCriteria(); $criteria->limit = $currentLimit; if (UtilsHelper::countRussianCharacters($query) > 0) { $nameRu = $query; } else { $nameRu = UtilsHelper::cityNameToRus($query); } $metaphoneRu = UtilsHelper::ruMetaphone($nameRu); if ($metaphoneRu) { $criteria->params[':metaphoneRu'] = $metaphoneRu; $criteria->addCondition('t.metaphoneRu = :metaphoneRu'); $criteria->addCondition('t.hotelbookId > 0'); if ($cityIds) { $criteria->addCondition('t.id NOT IN (' . join(',', $cityIds) . ')'); } $criteria->with = 'country'; $criteria->order = 'country.position desc, t.position desc'; $cities = City::model()->findAll($criteria); if ($cities) { foreach ($cities as $city) { $items[] = $city; $cityIds[$city->id] = $city->id; } } $currentLimit -= count($items); } } } return $items; }
public static function getCities($query) { $currentLimit = appParams('autocompleteLimit'); $items = Yii::app()->cache->get('autocompleteCities' . $query); if (!$items) { $items = array(); $cityIds = array(); if (strlen($query) == 3) { $criteria = new CDbCriteria(); $criteria->limit = $currentLimit; $criteria->with = 'country'; $criteria->params[':code'] = $query; $criteria->addCondition('t.code = :code'); $criteria->order = 'country.position desc, t.position desc'; /** @var City[] $cities */ $cities = City::model()->findAll($criteria); if ($cities) { foreach ($cities as $city) { $items[] = array('id' => $city->primaryKey, 'label' => self::parseTemplate(self::templateForLabelAutocomplete(), $city), 'value' => self::parseTemplate(self::templateForValueAutocomplete(), $city)); $cityIds[$city->id] = $city->id; } } $currentLimit -= count($items); } $criteria = new CDbCriteria(); $criteria->limit = $currentLimit; $criteria->params[':localRu'] = $query . '%'; $criteria->params[':localEn'] = $query . '%'; $criteria->addCondition('t.localRu LIKE :localRu OR t.localEn LIKE :localEn'); if ($cityIds) { $criteria->addCondition('t.id NOT IN (' . join(',', $cityIds) . ')'); } $criteria->with = 'country'; $criteria->order = 'country.position desc, t.position desc'; $cities = City::model()->findAll($criteria); if ($cities) { foreach ($cities as $city) { $items[] = array('id' => $city->primaryKey, 'label' => self::parseTemplate(self::templateForLabelAutocomplete(), $city), 'value' => self::parseTemplate(self::templateForValueAutocomplete(), $city)); $cityIds[$city->id] = $city->id; } } $currentLimit -= count($items); if ($currentLimit) { $criteria = new CDbCriteria(); $criteria->limit = $currentLimit; if (UtilsHelper::countRussianCharacters($query) > 0) { $nameRu = $query; } else { $nameRu = UtilsHelper::cityNameToRus($query); } $metaphoneRu = UtilsHelper::ruMetaphone($nameRu); if ($metaphoneRu) { $criteria->params[':metaphoneRu'] = $metaphoneRu; $criteria->addCondition('t.metaphoneRu = :metaphoneRu'); if ($cityIds) { $criteria->addCondition('t.id NOT IN (' . join(',', $cityIds) . ')'); } $criteria->with = 'country'; $criteria->order = 'country.position desc, t.position desc'; $cities = City::model()->findAll($criteria); if ($cities) { foreach ($cities as $city) { $items[] = array('id' => $city->primaryKey, 'label' => self::parseTemplate(self::templateForLabelAutocomplete(), $city), 'value' => self::parseTemplate(self::templateForValueAutocomplete(), $city)); $cityIds[$city->id] = $city->id; } } $currentLimit -= count($items); } } Yii::app()->cache->set('autocompleteCities' . $query, $items, appParams('autocompleteCacheTime')); } return $items; }