/var/log/life.log
Блог программиста из солнечной Бурятии

Яндекс карты для K2

На примере плагина яндекс карт для k2 хочу показать как делать плагины для компонента k2 для joomla.
Картинка для затравки:
k2 yandex map plugin

Не хотите читать? Можете сразу скачать [download id=»28″]

Плагин для k2 представляет собой joomla плагин, который устанавливается в папку plugins/k2.
Xml описание плагина стандартное, за исключением параметров:

< ?xml version="1.0" encoding="utf-8"?>
<install version="1.5" type="plugin" group="k2" method="upgrade">
    <name>Yandex Map K2 Plugin</name>
    <author>VampiRUS</author>
    <creationdate>July 2012</creationdate>
    <copyright>Copyright (c) vampirus.ru</copyright>
    <authoremail>vamp1rus@yandex.ru</authoremail>
    <authorurl>vampirus.ru</authorurl>
    <version>0.1</version>
    <license>http://www.gnu.org/licenses/gpl-2.0.html GNU/GPL</license>
    <description>Display yandex map for k2 meterials</description>
    <files>
        <filename plugin="ymap">ymap.php</filename>
        <folder>elements</folder>
    </files>
   
    <!-- Standard plugin parameters for Joomla! 1.6+ -->
    <config>
        <fields name="params">
            <fieldset name="basic">
                <field name="width" type="text" default="425" label="Map width" description="" />
                <field name="height" type="text" default="344" label="Map height" description="" />
            </fieldset>
        </fields>
    </config>
   
    <params group="item-extra-fields" addpath="/plugins/k2/ymap/elements">
        <param name="map" type="map" default="" label="Карта" description="" />
    </params>
</install>

Плагин для версии joomla > 1.5, поэтому отсутствует блок параметров. Зато есть блок «<params group=»item-extra-fields>». Но то и отвечает за отображение параметров в k2 при создании/редактировании элемента. group определяет место, в котором будут выводиться параметры. В данном случае, это страница редактирования материала, таб дополнительных параметров.

Доступные группы:
category — редактирование категории
user — редактирование пользователя
item-content — редактирование материала, таб «Контент»
item-image — редактирование материала, таб «Изображение»
item-gallery — редактирование материала, таб «Галерея изображений»
item-video — редактирование материала, таб «Медиа»
item-extra-fields — редактирование материала, таб «Доп. поля»
item-attachments — редактирование материала, таб «Вложения»
item-other — редактирование материала, таб «K2 плагины»

Параметры K2 полностью совместимы с параметрами joomla 1.5, это даёт возможность добавить свои типы параметров. elements/map.php и будет отвечать за вывод и хранение параметров карты. Карта, это сложный объект нужно запомнить параметры карты и параметры объектов на карте, а для хранения этих данных есть всего одно поле. Поэтому данные будут сохраняться в json, и удобно и есть возможность расширения для добавления нового функционала в будущем.

document.id("'.$control_name.$name.'").value = JSON.encode({
                    lat:point[0],
                    lng:point[1],
                    zoom:myMap.getZoom(),
                    type:myMap.getType(),
                    markers:[{icon:getMarkerType()}]
            });

широта, долгота, масштаб, тип карты и массив маркеров. Так как маркер сейчас один и его координаты совпадают с центром карты, то дабы не усложнять, для маркера записывается только тип иконки. Такую структуру можно будет расширить всем, на что хватит фантазии и api яндекс карт.

Так как используется вторая версия api, то есть одна особенность, о которой следует знать: карта не будет отображаться, если она изначально располагается в скрытом элементе. В нашем случает таб дополнительных параметров скрыт. Чтобы решить эту проблему используется код:

window.addEvent("domready",function(){
            $$("#tabExtraFields a").addEvent("click",function(){
                (function(){this.container.fitToViewport();}).delay(200,myMap);
            });
        });

С задержкой в 200мс после клика по табу вызывается метод fitToViewport(). Поэтому если потребуется перенести карту на другой таб, нужно также поменять id таба в этом коде.

Точка на карту добавлена и сохранена. Теперь её нужно отобразить на лицевой части сайта.
За это отвечает файл ymap.php плагина. Начинается всё стандартно

// no direct access
defined('_JEXEC') or die ('Restricted access');

// Load the K2 Plugin API
JLoader::register('K2Plugin', JPATH_ADMINISTRATOR.DS.'components'.DS.'com_k2'.DS.'lib'.DS.'k2plugin.php');

// Initiate class to hold plugin events
class plgK2YMap extends K2Plugin {

    // Some params
    var $pluginName = 'ymap';
    var $pluginNameHumanReadable = 'Яндекс карта';

    function plgK2Ymap( & $subject, $params) {
        parent::__construct($subject, $params);
    }
//...
}

Начинается всё стандартно, за исключением того что нужно подгрузить API плагинов K2 и свойства $pluginNameHumanReadable — то, как будет называться облать с настройками плагина в админке.
Далее идут методы, которые могут быть вызваны из плагина во время отображения страницы во фронтэнде. По месту вызова и названию они совпадают с событиями в joomla, только с префиксом onK2.

function onK2PrepareContent( &$item, &$params, $limitstart) // Вызывается когда материал уже получен, и мы может как-то предварительно его модифицировать
function onK2AfterDisplay( &$item, &$params, $limitstart) // Вызывается уже после того, как вся информация уже отображена
function onK2BeforeDisplay( &$item, &$params, $limitstart) // Вызывается перед тем как начинается вывод информации
function onK2AfterDisplayTitle( &$item, &$params, $limitstart) //Вызывается после отображения заголовка, возвращаемый результат будет отображён непосредственно после заголовка
function onK2BeforeDisplayContent( &$item, &$params, $limitstart) //Вызывается перед отображением материала, возвращаемый результат будет отображён непосредственно перед материалом
function onK2AfterDisplayContent( &$item, &$params, $limitstart) //Вызывается после отображения материала, возвращаемый результат будет отображён непосредственно осле материала
function onK2CategoryDisplay( & $category, & $params, $limitstart) //Вызывается при отображении категории
function onK2UserDisplay( & $user, & $params, $limitstart) //Вызывается при отображении страницы пользователя

Карту будем показывать после материала, поэтом блок для карты будем выводить в onK2AfterDisplayContent. Но так как функциональность карты обеспечивается через javascript, то лучше бы добавить его в начало страницы, поэтому потребуется метод onK2PrepareContent, когда мы ещё можем модифицировать заголовок.

Немного про параметры.

У нас 2 типа параметров: общие, которые настраиваются на странице плагина, это ширина и высота карты и для каждого материала в отдельности — данные карты.
общие параметры получаются как обычно для плагинов joomla

        $plugin = &JPluginHelper::getPlugin('k2', $this->pluginName);
        $pluginParams = new JParameter($plugin->params);

Индивидуальные получают следующим образом:

$params = new K2Parameter($item->plugins, '', $this->pluginName);

Плагин готов и его можно скачать [download id=»28″]

18 комментариев на запись «Яндекс карты для K2»

  1. Kirill Khatkevich пишет:

    а есть такой же, но для 2.5 ??

  2. VampiRUS пишет:

    это для 2,5

  3. Александр пишет:

    Отличный плагин получился! Все работает. А есть ли возможность расширить функционал плагина, чтобы не вручную искать объект? Как в самом яндексе: поисковая строка, туда вбиваем улицу и дом и он появляется на карте. Не знаю, то это или нет: http://api.yandex.ru/maps/doc/geocoder/
    И возможно ли добавлять на карту сразу несколько объектов?

  4. VampiRUS пишет:

    задел на это есть, ничего не мешает это реализовать. У меня к сожадению пока нет времени это сделать.

  5. Sergey пишет:

    Спасибо за плагин, вопрос только вот — как убрать отображение карты из блога категории K2, а то она мне нужна лишь в полной записи материала?

  6. VampiRUS пишет:

    отключить плагины, на этой странице

  7. михаил пишет:

    Как сделать, чтобы информация о метках хранилась в определенной таблице в разных столбцах. спасибо

  8. VampiRUS пишет:

    не совсем понял

  9. михаил пишет:

    чтобы параметр lat хранился в столбце lat а lon в столбце lon

  10. Sergey пишет:

    Отлично, искал параметры для написания плагина под K2 и вспомнил про твою статью… Очень помогла. Амперса́нды перед переменными можно убрать? Это ведь не влияет на работу в PHP5?

  11. VampiRUS пишет:

    да

  12. Sergey пишет:

    item-other – редактирование материала, таб “K2 плагины” — а есть возможность переопределить название этой вкладки каким бы то нибыло способом?

  13. VampiRUS пишет:

    переименновать в языковом менеджере

  14. Sergey пишет:

    Надо бы еще пару параметров дописать для выбора места вывода: над и под контентом, но думаю сам добавлю… благо код понятный

  15. Альберт пишет:

    Добрый день! Установил плагин. скажите, пожалуйста, а где писать адрес, чтобы на карте он отобразился?

  16. VampiRUS пишет:

    Только точку на карте можно указать.

  17. Иван пишет:

    Доброго времени! Может дополнишь плагин, хотелось бы возможность добавлять много меток на карту и контент метки. Готов внести небольшое пожертвование! или подскажи, как это правильно реализовать!

  18. Алексей Гладкий пишет:

    Это у меня одного карта отображается без элементов управления(zoom, выбор типа)? Или у всех так? и как эти элементы управления на ней отобразить, подскажите если знаете. Заранее благодарен.

Оставить комментарий

Вы так же можете оставить комментарий используя ваш OpenId, для этого нужно войти.