[YandexMaps2] Кейс. Точки из MIGX с кастомными иконками на фронт-энде


В этой заметке мы рассмотрим, какие чудеса можно творить при помощи события плагина ymOnLoadObjects. В данном случае, мы реализуем подгрузку точек из MIGX таблицы с возможностью указания своей иконки для точки.

Шаг 1

Создаём ТВ MIGX ym2objects с такими полями:


Шаг 2

Заполняем в ресурсе это поле, как нам угодно:


Шаг 3

Вызываем карту в нужном месте данного ресурса:
{'!YandexMaps2' | snippet : [
    'parent' => $_modx->resource['id'],
    'class' => 'modDocument',
    'map' => 'ym2map-migx',
]}

Шаг 4

Создаём плагин на событие ymOnLoadObjects:
$sp = &$scriptProperties;
switch ($modx->event->name) {
    case 'ymOnLoadObjects':
        if (!in_array($snippetProperties['map'], ['ym2map-migx'])) {
            break;
        }
        if (!$resource = $modx->getObject('modResource', ['id' => (int)$data['parent']])) {
            break;
        }
        if (!$ym2 = $modx->getService('yandexmaps2', 'YandexMaps2', MODX_CORE_PATH . 'components/yandexmaps2/model/yandexmaps2/')) {
            break;
        }
        $ym2->initialize($modx->context->key);
        
        // Получаем данные из MIGX поля ресурса
        if ($ym2objects = $resource->getTvValue('ym2objects')) {
            $ym2objects = $ym2->tools->isJSON($ym2objects) ? $modx->fromJSON($ym2objects) : $ym2objects;
        }
        $ym2objects = is_array($ym2objects) ? $ym2objects : [];
        
        // 
        $objects = [];
        foreach ($ym2objects as $v) {
            $object = [
                'type' => 'placemark',
                'geometry' => [],
                'options' => [],
                'properties' => [
                    'iconContent' => '',
                    'iconCaption' => '',
                    'balloonContent' => '',
                ],
            ];
            $object['geometry'] = [$v['x'], $v['y']];
            $object['properties']['iconCaption'] = $v['caption'];
            $object['properties']['balloonContent'] = $v['balloon'];
            if (empty($v['icon'])) {
                $object['options'] = [
                    'fillOpacity' => 0.5,
                    'fillColor' => '#ed4543',
                    'strokeOpacity' => 0.9,
                    'strokeColor' => '#ed4543',
                    'strokeWidth' => 6,
                    'iconColor' => '#b3b3b3',
                    'preset' => 'islands#icon',
                ];
            } else {
                $object['options'] = [
                    'iconLayout' => 'default#image',
                    'iconImageHref' => $v['icon'],
                    'iconImageSize' => [36, 36],
                    'iconImageOffset' => [-18, -36],
                ];
            }
            $object = $ym2->setDefaultValues($object, $snippetProperties);
            $objects[] = $object;
            unset($object);
        }
        
        $modx->event->returnedValues['objects'] = $objects;
        break;
}

Важно!


Чтобы ресурс с картой был обработан плагином, надо единожды сохранить его с подключённой вкладкой YandexMaps2.

Итого


Вот так легко и просто мы можем через событие ymOnLoadObjects кастомизировать объекты, подгружаемые на карту. Простор для действий очень обширен!
Павел Гвоздь
30 ноября 2018, 06:45
modx.pro
2
1 530
+6
Поблагодарить автора Отправить деньги

Комментарии: 1

Никита
28 декабря 2021, 23:24
0
Здравствуйте, @Павел Гвоздь! Можете помочь с выводом кастомных значков через MIGX в YandexMaps2, как в статье?
Все сделал ровно по документации, но такое ощущение, что плагин не работает.
Сам плагин запускается, я проверил через логирование. Данные тоже передаются из migx, проверил каждое поле из массива $object в плагине. Никаких ошибок пошагово не смог найти.
В migx тоже все нормально, вывел без шаблона чуть выше по странице.
В общем ошибок нет, все правильно, но ничего не работает. В консоле браузера тоже пусто.
Помогите, пожалуйста
    Авторизуйтесь или зарегистрируйтесь, чтобы оставлять комментарии.
    1