Задать вопрос
@Glebash111

Как подключить ресурс kladr-api к input через JS или PHP?

Нужна помощь в подключении ресурса с данными улиц к input. Я уже смотрел документацию и на сайте, и на gitHub, но данный вопрос у меня до сих пор вызывает трудности. https://kladr-api.ru/docs Это сайт с документацией.
Если не сложно, ответьте более развернуто, пожалуйста. В ответе хотелось бы увидеть код JS (PHP) с подключением к библиотеке и самим запросом.
Скорее всего для JS нужно использовать библиотеку jquery. Ее я вроде подключил.

В общем, есть input, в котором при написании букв должен выводиться список улиц определенного города (в моем случае Новороссийск его id - 2300000600000):
Файл index.php

<!DOCTYPE html>
<html>
<head>
    <link rel="stylesheet" type="text/css" href="./style.css">
    <meta http-equiv="content-type" content="text/html; charset=utf-8">
    <title>Поиск улицы</title>
</head>
<body>
<script type="text/javascript" src="https://code.jquery.com/jquery-3.6.0.min.js"crossorigin="anonymous" ></script> 
<script src="https://code.jquery.com/ui/1.13.1/jquery-ui.js"></script>
<div class="address">
    <h1>Поиск улицы Новороссийска</h1>
    <form class="js-form-address">
        <div class="field">
            <input name="street" type="text" value="" placeholder="улица">
        </div>
    </form>
    <div>
        <p id="address"></p>
    </div>
</div>
</body>
</html>


Есть CSS Файл (style.css):
body, input {
    color: #555;
    font-size: 14px;
    font-family: Helvetica, Arial, sans-serif;
}

input, button {
    outline: none;
}

.address {
    width: 400px;
    margin: 40px auto 0;
    padding: 40px 40px 30px;
    border: 2px solid #e1e1e1;
    background-color: #f7f7f7;
    box-shadow: rgba(0, 0, 0, 0.075) 1px 1px 5px;
}

.address h1 {
    margin: 0;
    padding: 0;
    font-size: 20px;
    padding-bottom: 40px;
    text-align: center;
}

.field {
    margin-bottom: 10px;
    padding: 0;
}

.field input {
    height: 2em;
    width: 370px;
    border: 1px solid #d8d8d8;
    padding: 0 7px;
    color: #666;
}
  • Вопрос задан
  • 399 просмотров
Подписаться 1 Средний 4 комментария
Решения вопроса 1
Real_Fermer
@Real_Fermer
Программист PHP
js скрипт где происходит обработка ввода в input и вывод результата

window.addEventListener('load', function (e) {  

  document.querySelectorAll('[name="street"]').forEach(function (el, indx) {
    el.addEventListener('input', async (e) => {    

      let street_name=el.value

if(street_name.length>3){
  let data = {
    adress: street_name,
    task:'getKladr'
  }
  let url = '/controllers/ajax.php'
  let response = await fetch(url, {
    method: 'POST',
    headers: {
      'Content-Type': 'application/x-www-form-urlencoded'
    },
    body: 'data='+JSON.stringify(data)
  })

  let result = await response.json();
  let eladd_res=document.getElementById("address")
  eladd_res.innerHTML=""
  let json=JSON.parse(result)

  console.log(json)

  let html=""

  Object.entries(json.result).forEach(([key, value]) => {
    html+="<p>"+value["name"]+"</p>"
  })

  eladd_res.innerHTML=html
  console.log(json['result'])
}
    })
  })
})


Скрипт /controllers/ajax.php - куда отправляется AJAX запрос

require_once $_SERVER['DOCUMENT_ROOT']."/models/kladr.php";

$res=GetInput();

echo json_encode($res);

function GetInput()
{
            $data=getData();
            return call_user_func($data['task'],$data);
}
function getData() : array{
    $method=$_SERVER['REQUEST_METHOD'];
    $_vars=[];
    switch ($method){
        case 'GET':
            $_vars=requestGet();
            break;
        case 'POST':
            $_vars=requestPost();
            break;
    }
    return $_vars;
}
 function requestGet() : array{
        return $_GET;
    }
    function requestPost() : array{
        return json_decode($_POST['data'],true);
    }

function getKladr($data){

    $kladr= new Kladr();

    $res=$kladr->getStreet($data['adress']);

    return $res;
}

Сам класс Kladr /models/kladr.php откуда происходит вызов API и обработка ответа
class Kladr
{
    private $api_key;

    public function __construct()
    {
        //$this->api_key = KLADRAPIKEY; //не понадобился        
    }

    public function getStreet($street){
        $res=$this->request($street, "street", "2300000600000");

        return $res;
    }

    private function request($adress, $type, $cityid)
    {
        $res=[];
        $base_url = "https://kladr-api.ru/api.php?";
        $query_data = [
        //    'token'  => $this->api_key,
            'query'  => $adress,
            'contentType'   => !empty($type) ? $type : "street",
            'cityId' => !empty($cityid) ? $cityid : "2900000100000",
        ];
        $data_get = http_build_query($query_data);
        $url = $base_url.$data_get;
        //query=Ломоносова &contentType=street &cityId=2900000100000
       // $url="https://kladr-api.ru/api.php?query=Анапск&contentType=street&cityid=2900000100000&limit=5";

        $ch = curl_init();
        $defaults = [
            CURLOPT_RETURNTRANSFER => true,
            CURLOPT_URL => $url,
            CURLOPT_HTTPGET => true,
            CURLOPT_TIMEOUT => 10,
        ];

        $curl = curl_init();
        curl_setopt_array($curl, $defaults);
        $response = json_decode(curl_exec($curl), true);

        $curlErrorNumber = curl_errno($curl);

        if ($curlErrorNumber) {
            $res['error']['msg'] = 'Error curl';
            $res['error']['uri'] = $url;
            $res['error']['curl_n'] = $curlErrorNumber;
            curl_close($curl);
      
        } else {
            $res = curl_exec($curl);
            curl_close($curl);
        }

      

        return $res;

    }
}


Если ответ подошел. Поставьте пожалуйста отметку - ответ
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы