Skip to content

Commit cb8a673

Browse files
authored
Merge pull request #798 from ShevArtV/master
Добавил документацию ms_CDEK2
2 parents 9de2af2 + c184581 commit cb8a673

File tree

4 files changed

+727
-0
lines changed

4 files changed

+727
-0
lines changed
Lines changed: 245 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,245 @@
1+
# Разработка
2+
3+
## Изменение стилей
4+
5+
### Неправильный вариант:
6+
7+
1. Подключить свои стили ниже;
8+
2. Переопределить значения в них.
9+
10+
### Правильный вариант:
11+
12+
1. Скопировать стандартный файл;
13+
2. Переопределить нужные значения;
14+
3. Указать новый путь в системной настройке `ms_cdek2_frontend_css`
15+
16+
## Изменение чанков
17+
18+
То какие чанки использовать описано в пресетах, аналогичных тем, что использует SendIt.
19+
Чтобы указать свои чанки нужно в системной настройке `ms_cdek2_presets_path` указать путь к своему файлу пресетов.
20+
При этом менять параметры пресетов, назначение которых вы не понимаете, менять не стоит.
21+
22+
### Параметры чанков
23+
24+
1. **suggestItemTpl** - чанк элемента списка подсказов ввода адреса;
25+
2. **listWrapTpl** - чанк-обёртка списка ПВЗ (обязательно должен содержать `select[name="point"]`);
26+
3. **listItemTpl** - чанка элемента списка ПВЗ (обязательно должен быть `option`);
27+
4. **emptyTpl** - чанк который будет использован если ПВЗ не будут найдены по почтовому индексу;
28+
5. **statusTpl** - чанк статуса доставки.
29+
30+
:::info
31+
Чтобы узнать список доступных плейсхолдеров укажите пустое значение в параметре ( работает только для statusTpl и listItemTpl)
32+
:::
33+
34+
## Скрыть или изменить всплывающее сообщение
35+
36+
Тексты всплывающих сообщений хранятся в файлах словарей и имеют следующие ключи:
37+
38+
* `ms_cdek2_error`
39+
* `ms_cdek2_choose_pvz_error_message`
40+
41+
## Изменить масштаб карты при инициализации
42+
43+
```js:line-numbers
44+
document.addEventListener('mscdek:map:show', e => {
45+
const {object} = e.detail;
46+
object.mapUpdParams['zoom'] = 10;
47+
})
48+
```
49+
50+
## Запретить выбор подсказки, если не введена улица и выбрана доставка до двери
51+
52+
```js:line-numbers
53+
document.addEventListener('mscdek:address:select:suggestion', e => {
54+
const {location, object} = e.detail;
55+
const selectedDelivery = document.querySelector('[name="delivery"]:checked');
56+
if (!location.data.street && selectedDelivery.value === object.config.deliveriesByType.door) {
57+
e.preventDefault();
58+
object.sendit.Notify.error('Введите улицу');
59+
}
60+
})
61+
```
62+
63+
## Изменить стандартный вывод статуса на вплывающее уведомление
64+
65+
:::warning
66+
Удалите со страницы блок вывода статуса.
67+
:::
68+
69+
```js:line-numbers
70+
document.addEventListener('mscdek:status:get', e => {
71+
const {status, object} = e.detail;
72+
if (!object.statusBlock) {
73+
const message = `Доставим до ${status.calc_result.delivery_date_range.max} за ${status.delivery_cost} руб.`
74+
object.sendit.Notify.info(message);
75+
}
76+
})
77+
```
78+
79+
## Показывать карту в модальном окне
80+
81+
:::warning
82+
В примере используется библиотека [Fancybox](https://fancyapps.com/fancybox/getting-started/)
83+
:::
84+
85+
#### Добавим кнопку открытия модального окна, которая изначально скрыта с помощью класса `.hide`
86+
87+
```html
88+
89+
<button type="button" class="hide" data-fancybox data-src="#map-modal">Выбрать ПВЗ</button>
90+
```
91+
92+
#### Добавим JS, который будет менять видимость кнопки при загрузке страницы и смене способа доставки
93+
:::info
94+
`3` в функции `toggleMapButton` это ID способа доставки до ПВЗ
95+
:::
96+
97+
```js:line-numbers
98+
const toggleMapButton = () => {
99+
const btn = document.querySelector('[data-src="#map-modal"]');
100+
const delivery = document.querySelector('[name=delivery]:checked');
101+
if (Number(delivery.value) === 3) {
102+
btn.classList.remove('hide');
103+
} else {
104+
btn.classList.add('hide');
105+
}
106+
}
107+
108+
document.addEventListener('DOMContentLoaded', e => {
109+
toggleMapButton();
110+
})
111+
112+
document.addEventListener('change', e => {
113+
if (e.target.name === 'delivery') {
114+
toggleMapButton();
115+
}
116+
})
117+
```
118+
119+
#### Поместим блок вывода карты в модальное окно
120+
121+
```html:line-numbers
122+
<div id="map-modal" style="display:none;width:800px;max-width: 100%">
123+
<div data-mscdek-map class="hide"></div>
124+
</div>
125+
```
126+
127+
#### Добавим код для открытия модального окна при клике на нашу кнопку
128+
129+
```js:line-numbers
130+
document.addEventListener('click', e => {
131+
if (e.target.closest('[data-src="#map-modal"]')) {
132+
Fancybox.show([{src: "#map-modal", type: "inline"}]);
133+
}
134+
})
135+
```
136+
137+
## Вывод дополнительной информации о ПВЗ и подтверждение выбора кнопкой
138+
:::info
139+
Предполагается что на странице отсутствует блок
140+
```html:line-numbers
141+
<div class="hide" data-mscdek-list></div>
142+
```
143+
а вместо него выведено скрытое поле
144+
```html:line-numbers
145+
<input type="hidden" name="point">
146+
```
147+
:::
148+
#### Добавим шаблон блока дополнительной информации о ПВЗ
149+
150+
```html:line-numbers
151+
<template data-mscdek-baloon>
152+
<div data-pvz-details class="hide">
153+
<h5>Адрес:<br>
154+
<span data-mscdek-prop="address"></span>
155+
</h5>
156+
<p>Время работы:<br>
157+
<span data-mscdek-prop="work_time"></span>
158+
</p>
159+
<button id="select-pvz-btn" type="button">Выбрать</button>
160+
</div>
161+
</template>
162+
```
163+
164+
#### Добавим стили для блока с картой и для блока дополнительной информации
165+
166+
```css:line-numbers
167+
[data-mscdek-map] {
168+
position: relative;
169+
}
170+
171+
[data-pvz-details]:not(.hide) {
172+
flex-direction: column;
173+
display: flex;
174+
align-items: start;
175+
justify-content: center;
176+
position: absolute;
177+
left: 0;
178+
top: 0;
179+
height: 100%;
180+
background: rgba(0, 0, 0, .7);
181+
width: 40%;
182+
padding: 30px;
183+
color: white;
184+
}
185+
```
186+
187+
#### Поместим блок с дополнительной информацией в блок с картой после её инициализации
188+
```js:line-numbers
189+
document.addEventListener('mscdek:map:init', e => {
190+
const {mapBlock} = e.detail;
191+
192+
if (!mapBlock.querySelector('[data-pvz-details]')) {
193+
const baloonTemplate = document.querySelector('[data-mscdek-baloon]');
194+
mapBlock.insertAdjacentHTML('beforeend', baloonTemplate.innerHTML);
195+
baloonTemplate.innerHTML = '';
196+
}
197+
})
198+
```
199+
200+
#### Выводим дополнительную информацию о ПВЗ
201+
```js:line-numbers
202+
const showBaloon = (markerData) => {
203+
const baloon = document.querySelector('[data-pvz-details]');
204+
if (baloon) {
205+
const addressBlock = baloon.querySelector('[data-mscdek-prop="address"]');
206+
const workTimeBlock = baloon.querySelector('[data-mscdek-prop="work_time"]');
207+
addressBlock.innerHTML = markerData.location.address;
208+
workTimeBlock.innerHTML = markerData.work_time;
209+
210+
baloon.classList.remove('hide');
211+
return true;
212+
}
213+
return false;
214+
}
215+
216+
document.addEventListener('mscdek:map:choose', e => {
217+
const {markerData, object} = e.detail;
218+
showBaloon(markerData.properties)
219+
})
220+
```
221+
222+
#### Добавляем обработчик подтверждения выбора ПВЗ
223+
```js:line-numbers
224+
document.addEventListener('click', e => {
225+
if (e.target.closest('#select-pvz-btn')) {
226+
const addressBlock = document.querySelector('[data-pvz-details] [data-mscdek-prop="address"]');
227+
const pointField = document.querySelector('[name="point"]');
228+
pointField && (pointField.value = addressBlock.innerHTML);
229+
pointField && pointField.dispatchEvent(new Event('change', {bubbles: true}));
230+
231+
/* SendIt.Notify.info(`ПВЗ: ${addressBlock.innerHTML}`); */ // раскомментируйте для показа всплывающего уведомления с адресом выбранного ПВЗ
232+
/* Fancybox.close(); */ // раскоментируйте, если хотите чтобы модальное окно закрывалось после выбора
233+
}
234+
})
235+
```
236+
237+
## Изменить маркер для ПВЗ с чётным ID
238+
```js:line-numbers
239+
document.addEventListener('mscdek:marker:create', e => {
240+
const {marker, markerData} = e.detail;
241+
if (markerData.id % 2 === 0) {
242+
marker.querySelector('img').src = 'assets/marker.png';
243+
}
244+
})
245+
```

0 commit comments

Comments
 (0)