Небольшой скрипт для выборки отделений Новой Почты по городам. Пока что больше от этого скрипта не требуется.
Для начала скачиваем отсюда PHP класс.
Затем зарегистрировать на сайте Новой Почты и в личном кабинете сгенерировать ключ доступа.

В принципе, там есть описание как с ним работать но у меня не пошло, может кому-то больше повезет.
Я делал следующим образом: склонировал в отдельную папку по пути /var/www/html/novaposhta.
php composer.phar require lis-dev/nova-poshta-api-2:dev-master
Получил такой ответ:
./composer.json has been created
Loading composer repositories with package information
Updating dependencies (including require-dev)
- Installing lis-dev/nova-poshta-api-2 (dev-master 44e964c)
Cloning 44e964c189c9e53bb850dfa8110eba42aff3428c
Writing lock file
Generating autoload files
Значит все в порядке, все файлы загрузились.
Дальше, создал файл скрипта, пусть будет nova-post-api.php.
Так как выводить нужно будет только список городов и подтягивать номера отделений по каждому городу, то понадобится всего два метода: getCities() для городов и getWarehouses для отделений.
Выведем список городов.
require_once('src/Delivery/NovaPoshtaApi2.php');
require_once('src/Delivery/NovaPoshtaApi2Areas.php');
$np = new \LisDev\Delivery\NovaPoshtaApi2('NP_KEY');
$cities = $np->getCities();
echo '<pre>';
print_r($cities);
echo '</pre>';
Выведется массив городов.
Отделения в каждом городе можно выбрать по артикулу [Ref].
$wh = $np->getWarehouses($city_id);
foreach ($wh['data'] as $warehouse) {
echo '<option value="'.$warehouse['Ref'].'">'.$warehouse['DescriptionRu'].'</option>';
}
Теперь нужно обернуть это в более-менее приличную обертку, например вызывать аяксом.
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<script src="https://code.jquery.com/jquery-2.2.4.min.js<a href="https://code.jquery.com/jquery-2.2.4.min.js"">"</a> integrity="sha256-BbhdlvQf/xTY9gja0Dq3HiwQF8LaCRTXxZKRutelT44=" crossorigin="anonymous"></script>
<title>Title</title>
</head>
<body>
<form method="post" action="" id="citis">
<select id="cities" name="city"></select>
</form>
<select id="warehouses"></select>
<script>
// load cities
$("#cities").load( "file.php" );
// get warehouses
$('#cities').change(function(){
var wh = $(this).val();
$.ajax({
url : 'file.php',
type : 'POST',
data : {
'warehouses' : wh,
},
success : function(data) {
$('#warehouses').html(data);
},
error : function(request,error)
{
$('#warehouses').html('<option>-</option>');
}
});
})
</script>
</body>
</html>
Обработчик
<?php
require_once('src/Delivery/NovaPoshtaApi2.php');
require_once('src/Delivery/NovaPoshtaApi2Areas.php');
$np = new \LisDev\Delivery\NovaPoshtaApi2(
'NP_API_KEY',
'ru', // Язык возвращаемых данных: ru (default) | ua | en
FALSE, // При ошибке в запросе выбрасывать Exception: FALSE (default) | TRUE
'curl' // Используемый механизм запроса: curl (defalut) | file_get_content
);
if($_POST['warehouses']) {
$wh = $np->getWarehouses($_POST['warehouses']);
foreach ($wh['data'] as $warehouse) {
echo '<option value="'.$warehouse['Ref'].'">'.$warehouse['DescriptionRu'].'</option>';
}
} else {
$cities = $np->getCities();
foreach ($cities['data'] as $city) {
echo '<option value="'.$city['Ref'].'">'.$city['DescriptionRu'].'</option>';
}
}
?>