needlogin=true; $me = new User(); $me->loadMe(); $this->me = $me; $this->layout()->set("me",$me); if(!$me->is(["Admin", "netowner", "pipeplanner"])) { $this->redirect("Dashboard"); } } protected function apiAction() { if(!$this->me->is(["Admin","netowner"])) { $this->redirect("Dashboard"); } $do = $this->request->do; $data = []; switch($do) { case "findAddress": $return = $this->findAddressApi(); break; case "getFilteredBuildings": $return = $this->getFilteredBuildingsApi(); break; case "getUnits": $return = $this->getUnitsApi(); break; case "findCities": $return = $this->findCitiesApi(); break; case 'findBuildings': $return = $this->findBuildingsApi(); break; case "findUnit": break; default: $return = false; } if(!is_array($return) || !count($return)) { $data = ["status" => "error"]; $this->returnJson($data); } $data['status'] = "OK"; $data['result'] = $return; $this->returnJson($data); } private function findAddressApi() { $addresses = []; $search = trim($this->request->q); $results = []; $search_parts = explode(" ", $search); $ort_search = $strasse_search = $plz_search = $hausnummer_search = []; foreach($search_parts as $p) { $p = trim($p); if(!$p) continue; $ort_search[] = "ortschaft like '%$p%'"; $strasse_search[] = "strasse like '%$p%'"; $plz_search[] = "plz like '%$p%'"; $hausnummer_search[] = "hausnummer like '%$p%'"; } $sql = "SELECT * FROM view_hausnummer WHERE (".implode(" OR ", $ort_search).") OR (".implode(" OR ", $strasse_search).") OR (".implode(" OR ", $plz_search).") OR (".implode(" OR ", $hausnummer_search).")"; //echo $sql;exit; $adb = FronkDB::singleton(ADDRESSDB_DBHOST, ADDRESSDB_DBUSER, ADDRESSDB_DBPASS, ADDRESSDB_DBNAME); $res = $adb->query($sql); if(!$adb->num_rows($res)) { header("Content-Type: application/json"); echo json_encode(["results" => []]); exit; } while($data = $adb->fetch_object($res)) { $address_string = $data->plz." ".$data->ortschaft.", ".$data->strasse." ".$data->hausnummer; $address = []; $address['id'] = $data->hausnummer_id; $address["text"] = $address_string; $addresses[] = $address; } // sort results by most occurences of search strings $sort = []; foreach($addresses as $address) { $count = 0; foreach($search_parts as $p) { $count += substr_count(strtolower($address['text']), strtolower($p)); } //echo $address['text']." $p $count
\n"; if(!array_key_exists($count, $sort)) { $sort[$count] = []; } $sort[$count][] = $address; } ksort($sort, SORT_NUMERIC); $sort = array_reverse($sort, true); //var_dump($sort);exit; foreach($sort as $res) { foreach($res as $a) { $results[] = $a; } } header("Content-Type: application/json"); echo json_encode(["results" => $results]); exit; } private function getUnitsApi() { $results = []; $hausnummer_id = intval($this->request->hausnummer_id); if(!$hausnummer_id) { return ['results' => []]; } $units = ADBWohneinheitModel::search(['hausnummer_id' => $hausnummer_id]); foreach($units as $unit) { $u = []; $u['id'] = $unit->id; $u['zip'] = $unit->hausnummer->plz->plzstring; $u['city'] = $unit->hausnummer->strasse->ortschaft->name; $u['street'] = $unit->hausnummer->strasse->name; $u['housenumber'] = $unit->hausnummer->hausnummer; $u['block'] = $unit->block; $u['stiege'] = $unit->stiege; $u['stock'] = $unit->stock; $u['tuer'] = $unit->tuer; $u['extra'] = (string)$unit; $u['zusatz'] = $unit->zusatz; $u['usage'] = $unit->nutzung; $results[] = $u; } return ['units' => $results]; } private function findCitiesApi() { $cities = []; $search = $this->request->search; $ort_ids = []; if(is_numeric($search)) { $adb = FronkDB::singleton(ADDRESSDB_DBHOST, ADDRESSDB_DBUSER, ADDRESSDB_DBPASS, ADDRESSDB_DBNAME); $sql = "SELECT ortschaft_id from view_wohneinheit WHERE plz like '%$search%' GROUP BY ortschaft_id"; $res = $adb->query($sql); if($adb->num_rows($res)) { while($data = $adb->fetch_object($res)) { $ort_ids[] = $data->ortschaft_id; } } } if($ort_ids) { foreach($ort_ids as $oid) { $results[] = new ADBOrtschaft($oid); } } else { $results = ADBOrtschaftModel::search(['name%' => $search]); } foreach($results as $city) { $gemeinde = new ADBGemeinde($city->gemeinde_id); $data = []; $data['id'] = $city->id; $data['gemeinde_id'] = $city->gemeinde_id; $data['gemeinde'] = $gemeinde->name; $data['kennziffer'] = $city->kennziffer; $data['name'] = $city->name; $cities[] = $data; } return ['cities' => $cities]; } private function getFilteredBuildingsApi() { $buildings = []; $filter = $this->request->filter; $results = BuildingModel::search($filter); foreach($results as $building) { $data = $building->data; $data->id = $building->id; $buildings[] = $data; } return ["buildings" => $buildings]; } private function findBuildingsApi() { $buildings = []; $search = $this->request->search; $city_id = intval($this->request->city_id); $sql = "SELECT * FROM view_hausnummer WHERE (ortschaft like '%$search%' OR strasse like '%$search%' OR plz like '%$search%' OR hausnummer like '%$search%')"; if($city_id) { $sql .= " AND ortschaft_id=$city_id"; } $adb = FronkDB::singleton(ADDRESSDB_DBHOST, ADDRESSDB_DBUSER, ADDRESSDB_DBPASS, ADDRESSDB_DBNAME); $res = $adb->query($sql); if(!$adb->num_rows($res)) { return ["count" => 0, "buildings" => []]; } while($data = $adb->fetch_object($res)) { $buildings[$data->hausnummer_id] = $data; } $unsorted = []; foreach($buildings as $building) { $u = []; $u['id'] = $building->hausnummer_id; $u['street'] = $building->strasse . " ".$building->hausnummer; $u['zip'] = $building->plz; $u['city'] = $building->ortschaft; $u['oan_id'] = ($building->oan_id) ? $building->oan_id : ""; $u['code'] = ($building->code) ? $building->code : ""; $u['units'] = ($building->units) ? $building->units : 1; //$u['units_used'] = $building->getUsedTerminationCount(true); $u['units_used'] = 1; //$u['status'] = $building->status->name; $u['status'] = ""; $unsorted[$building->strasse."-".$building->hausnummer_id] = $u; } ksort($unsorted); $results = []; foreach($unsorted as $r) { $results[] = $r; /*if(count($results) >= 20) { break; }*/ } return ["count" => count($buildings), "buildings" => $results]; } }