예제 #1
0
파일: City.php 프로젝트: niranjan2m/Voyanga
 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;
 }
예제 #2
0
 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;
 }