Исправление карты yandex

This commit is contained in:
Arsen Mirzaev Tatyano-Muradovich 2021-10-14 16:20:10 +10:00
parent e6944c9b6b
commit 1d06acf2e0
8 changed files with 202 additions and 250 deletions

View File

@ -1,22 +1,10 @@
<?php
/**
* @link http://www.yiiframework.com/
* @copyright Copyright (c) 2008 Yii Software LLC
* @license http://www.yiiframework.com/license/
*/
namespace app\assets;
use yii;
use yii\web\AssetBundle;
use yii\web\View;
/**
* Main application asset bundle.
*
* @author Qiang Xue <qiang.xue@gmail.com>
* @since 2.0
*/
class AppAsset extends AssetBundle
{
public $basePath = '@webroot';
@ -37,7 +25,7 @@ class AppAsset extends AssetBundle
'js/bootstrap/bootstrap.min.js',
'https://cdn.jsdelivr.net/bxslider/4.1.1/jquery.bxslider.min.js',
'https://unpkg.com/cookielib/src/cookie.min.js',
'https://api-maps.yandex.ru/2.0-stable/?load=package.standard&lang=ru-RU',
'https://api-maps.yandex.ru/2.1/?apikey=ff21ed7c-2d34-4f91-8d7f-2144ec3e4397&lang=ru_RU',
'js/moment.min.js',
'js/menu.js',
'js/main.js',
@ -45,7 +33,6 @@ class AppAsset extends AssetBundle
'js/search.js',
'js/notification.js',
'js/reinitialization.js',
'https://api-maps.yandex.ru/2.1/?apikey=0c4ba9aa-c448-4bd0-9c8c-6181f21ede90&lang=ru_RU',
'js/yandex/metrika.js',
'js/yandex/geolocation.js',
'https://www.googletagmanager.com/gtag/js?id=G-6XYKBJJWR4',

View File

@ -286,6 +286,8 @@ class ProductController extends Controller
$return['alert'] = "Товар удалён: $catn";
$return['location'] = '/';
} else {
// Не удалось удалить
// Запись кода ответа
yii::$app->response->statusCode = 500;

View File

@ -0,0 +1,43 @@
<?php
declare(strict_types=1);
namespace app\controllers;
use yii;
use yii\web\Controller;
use yii\web\Response;
use app\models\Terminal;
class TerminalController extends Controller
{
public function actionRead(): ?array
{
// Инициализация входных параметров
$amount = (int) yii::$app->request->post('amount') ?? yii::$app->request->get('amount');
if ($amount < 501) {
// Пройдена проверка
if (yii::$app->request->isPost) {
// POST-запрос
// Запись формата ответа
yii::$app->response->format = Response::FORMAT_JSON;
return [
'terminals' => Terminal::read($amount),
'_csrf' => yii::$app->request->getCsrfToken()
];
}
} else {
// Не пройдена проверка
// Запись кода ответа
yii::$app->response->statusCode = 500;
}
return false;
}
}

View File

@ -1,34 +1,36 @@
<link href="/css/pages/partners.css" rel="stylesheet">
<script src="https://api-maps.yandex.ru/2.1/?apikey=ff21ed7c-2d34-4f91-8d7f-2144ec3e4397&lang=ru_RU" type="text/javascript"></script>
<div id="page_partners" class="container mb-auto py-3">
<article class="py-3 rounded">
<div class="rounded overflow-hidden">
<!-- @deprecated -->
<!-- <iframe width="100%" height="400" src="https://maps.google.com/maps?width=800&amp;height=300&amp;hl=ru&amp;q=%D0%A5%D0%B0%D0%B1%D0%B0%D1%80%D0%BE%D0%B2%D1%81%D0%BA%20%D0%9F%D1%80%D0%BE%D0%BC%D1%8B%D1%88%D0%BB%D0%B5%D0%BD%D0%BD%D0%B0%D1%8F%203+(SkillParts)&amp;ie=UTF8&amp;t=&amp;z=13&amp;iwloc=B&amp;output=embed" frameborder="0" scrolling="no" marginheight="0" marginwidth="0"></iframe> -->
<div class="wrapper">
<div id="cityShop" class="cityShop">
<label for="cities" class="label">Выбор города</label>
<input type="text" id="suggest" value="Поиск города">
<div class="row">
<div class="pr-0 col-3 terminals">
<label for="cities" class="w-100 py-2 position-relative text-center text-white"><b>Выбор города</b></label>
<div name="cities" id="cities">
<!-- <ul id="shops" class="shops"></ul> -->
</div>
</div>
<div id="map"></div>
</div>
<div class="p-4">
<div id="map" class="pl-0 col"></div>
</div>
</div>
<!-- <pre>
<?php
// var_dump($terminals);
?>
</pre> -->
</article>
</div>
<script src="/js/yandex/ymap.js" defer></script>
<script src="/js/yandex/map.js" defer></script>
<script src="/js/yandex/provider.js" defer></script>
<script>
if (document.readyState === "complete") {
// Документ загружен
// Инициализация карты
ymaps.ready(partners_yandex_map_init);
} else {
// Документ не загружен
// Обработчик события загрузки документа
document.addEventListener('DOMContentLoaded', function() {
// Инициализация карты
ymaps.ready(partners_yandex_map_init);
}, false);
}
</script>

View File

@ -1,64 +1,32 @@
.wrapper {
display: flex;
justify-content: space-between;
}
/* Выбор города */
.label {
text-align: center;
font-weight: bold;
max-width: 240px;
width: 100%;
padding: 4px 0;
color: azure;
#page_partners>article label {
background-color: #123EAB;
position: fixed;
}
/* Блок городов */
.cityShop {
width: 240px;
#page_partners>article .terminals {
height: 400px;
background-color: #fff;
overflow-y: scroll;
scrollbar-width: none;
background-color: #fff;
}
.cityShop::-webkit-scrollbar {
width: 5px;
}
.cityShop::-webkit-scrollbar-thumb {
background-color: #123EAB;
border: 20px solid transparent;
}
.goto {
#page_partners>article .goto {
display: block;
text-decoration: none;
margin-left: 25px;
margin-top: 12px;
margin-bottom: 5px;
color: black;
max-width: 190px;
text-decoration: none;
color: black;
}
.goto:hover {
#page_partners>article .goto:hover {
font-weight: bold;
border-bottom: 2px solid #123EAB;
}
/* Карта */
#map {
max-width: 850px;
width: 100%;
#page_partners>article #map {
height: 400px;
}
}

View File

@ -0,0 +1,123 @@
function partners_yandex_map_init() {
// Функция ymaps.ready() будет вызвана, когда
// загрузятся все компоненты API, а также когда будет готово DOM-дерево.
let myMap;
let placemarkCollections = {};
let placemarkList = {};
// Создаем карту
myMap = new ymaps.Map("map", {
center: [48.486518, 135.115512],
zoom: 15,
controls: [
'zoomControl'
],
zoomMargin: [20]
});
let terminals = partners_terminals_read();
for (let i = 0; i < shopList.length; i++) {
// Добавляем название города в список
$('div#cities').append('<a href="#" id="goto" class="goto" data-goto= ' + i + ' title=' + shopList[i].cityName + '>' + shopList[i].cityName + '</a>')
// Создаём коллекцию меток для города
let cityCollection = new ymaps.GeoObjectCollection();
for (let c = 0; c < shopList[i].shops.length; c++) {
let shopInfo = shopList[i].shops[c];
let shopPlacemark = new ymaps.Placemark(
shopInfo.coordinates,
{
hintContent: shopInfo.name,
balloonContent: shopInfo.name,
},
);
if (!placemarkList[i]) placemarkList[i] = {};
placemarkList[i][c] = shopPlacemark;
// Добавляем метку в коллекцию
cityCollection.add(shopPlacemark);
}
placemarkCollections[i] = cityCollection;
// Добавляем коллекцию на карту
myMap.geoObjects.add(cityCollection);
}
}
function partners_terminals_read(amount = 300) {
let terminals;
$.ajax({
url: '/terminals/read',
type: 'post',
dataType: 'json',
data: {
'_csrf': yii.getCsrfToken(),
amount
},
success: function (data, status, xhr) {
if (data !== undefined) {
// Получены данные с сервера
// Список терминалов
if (data.terminals !== undefined) {
terminals = data.terminals;
}
}
return yandex_map_response(data, status, xhr);
},
error: yandex_map_response_error
});
return terminals;
}
// Переключение города
$('div#cities').on('click', 'a#goto', function () {
let cityId = $(this).attr('data-goto');
// Масштабируем и выравниваем карту так, чтобы были видны метки для выбранного города
myMap.setBounds(placemarkCollections[cityId].getBounds(), { checkZoomRange: true }).then(function () {
if (myMap.getZoom() > 15) myMap.setZoom(15); // Если значение zoom превышает 15, то устанавливаем 15.
});
// Добавление списка филиалов определенного города
// $('#shops').html('');
// for (let c = 0; c < shopList[cityId].shops.length; c++) {
// $('#shops').append('<li value="' + c + '">' + shopList[cityId].shops[c].name + '</li>');
// }
});
function yandex_map_response(data, status, xhr) {
// Обработка ответов
main_response(data, status, xhr);
};
function yandex_map_response_success(data, status, xhr) {
// Обработка ответов от удавшихся запросов
yandex_map_response(data, status, xhr);
};
function yandex_map_response_error(data, status, xhr) {
// Обработка ответов от неудавшихся запросов
// Инициализация
data = data.responseJSON;
yandex_map_response(data, status, xhr);
};

View File

@ -1,96 +0,0 @@
// Список городов и филиалов в них
var shopList = [
{
'cityName': 'Архангельск',
'shops': [
{'coordinates': [64.539304, 40.518735], 'name': 'Рязанский проспект, 6Ас21'},
]
},
{
'cityName': 'Владивосток',
'shops': [
{'coordinates': [43.134019, 131.928379], 'name': 'Рязанский проспект, 6Ас21'},
]
},
{
'cityName': 'Екатеринбург',
'shops': [
{'coordinates': [56.838002, 60.597295], 'name': 'Будапештская улица, 36к2'},
]
},
{
'cityName': 'Калининград',
'shops': [
{'coordinates': [55.916229, 37.854467], 'name': 'Будапештская улица, 36к2'},
]
},
{
'cityName': 'Краснодар',
'shops': [
{'coordinates': [59.99486277158917, 30.406505207030918], 'name': 'проспект Непокорённых'},
]
},
{
'cityName': 'Красноярск',
'shops': [
{'coordinates': [59.863210042666125, 30.37903938671841], 'name': 'Будапештская улица, 36к2'},
{'coordinates': [59.99486277158917, 30.406505207030918], 'name': 'проспект Непокорённых'}
]
},
{
'cityName': 'Комосомольск-на-Амуре',
'shops': [
{'coordinates': [50.54986, 137.007867], 'name': 'Будапештская улица, 36к2'},
]
},
{
'cityName': 'Москва',
'shops': [
{'coordinates': [55.72532368326033, 37.748675112058876], 'name': 'Рязанский проспект, 6Ас21'},
]
},
{
'cityName': 'Мурманск',
'shops': [
{'coordinates': [68.96956299999999, 33.07454], 'name': 'Будапештская улица, 36к2'},
]
},
{
'cityName': 'Находка',
'shops': [
{'coordinates': [59.863210042666125, 30.37903938671841], 'name': 'Будапештская улица, 36к2'},
]
},
{
'cityName': 'Новосибирск',
'shops': [
{'coordinates': [55.028739, 82.90692799999999], 'name': 'Будапештская улица, 36к2'},
]
},
{
'cityName': 'Омск',
'shops': [
{'coordinates': [54.989342, 73.368212], 'name': 'Будапештская улица, 36к2'},
]
},
{
'cityName': 'Санкт-Петербург',
'shops': [
{'coordinates': [59.863210042666125, 30.37903938671841], 'name': 'Будапештская улица, 36к2'},
{'coordinates': [59.99486277158917, 30.406505207030918], 'name': 'проспект Непокорённых'}
]
},
{
'cityName': 'Сочи',
'shops': [
{'coordinates': [59.863210042666125, 30.37903938671841], 'name': 'Будапештская улица, 36к2'},
{'coordinates': [59.99486277158917, 30.406505207030918], 'name': 'проспект Непокорённых'}
]
},
{
'cityName': 'Хабаровск',
'shops': [
{'coordinates': [48.486518, 135.115512], 'name': 'Промышленная, 3'},
]
},
];

View File

@ -1,77 +0,0 @@
// Функция ymaps.ready() будет вызвана, когда
// загрузятся все компоненты API, а также когда будет готово DOM-дерево.
var myMap;
var placemarkCollections = {};
var placemarkList = {};
ymaps.ready(init);
function init() {
// Создаем карту
myMap = new ymaps.Map("map", {
center: [48.486518, 135.115512],
zoom: 15,
controls: [
'zoomControl'
],
zoomMargin: [20]
});
// var suggestView1 = new ymaps.SuggestView('suggest', { results: 3});
for (var i = 0; i < shopList.length; i++) {
// Добавляем название города в список
$('div#cities').append('<a href="#" id="goto" class="goto" data-goto= ' + i + ' title=' + shopList[i].cityName + '>' + shopList[i].cityName + '</a>')
// Создаём коллекцию меток для города
var cityCollection = new ymaps.GeoObjectCollection();
for (var c = 0; c < shopList[i].shops.length; c++) {
var shopInfo = shopList[i].shops[c];
var shopPlacemark = new ymaps.Placemark(
shopInfo.coordinates,
{
hintContent: shopInfo.name,
balloonContent: shopInfo.name,
},
);
if (!placemarkList[i]) placemarkList[i] = {};
placemarkList[i][c] = shopPlacemark;
// Добавляем метку в коллекцию
cityCollection.add(shopPlacemark);
}
placemarkCollections[i] = cityCollection;
// Добавляем коллекцию на карту
myMap.geoObjects.add(cityCollection);
}
}
// Переключение города
$('div#cities').on('click', 'a#goto', function () {
var cityId = $(this).attr('data-goto');
// Масштабируем и выравниваем карту так, чтобы были видны метки для выбранного города
myMap.setBounds(placemarkCollections[cityId].getBounds(), {checkZoomRange:true}).then(function(){
if(myMap.getZoom() > 15) myMap.setZoom(15); // Если значение zoom превышает 15, то устанавливаем 15.
});
// Добавление списка филиалов определенного города
// $('#shops').html('');
// for (var c = 0; c < shopList[cityId].shops.length; c++) {
// $('#shops').append('<li value="' + c + '">' + shopList[cityId].shops[c].name + '</li>');
// }
});