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

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

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

Не хотите читать? Можете сразу скачать плагин яндекс карт для k2 (868)

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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
< ?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, и удобно и есть возможность расширения для добавления нового функционала в будущем.

1
2
3
4
5
6
7
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, то есть одна особенность, о которой следует знать: карта не будет отображаться, если она изначально располагается в скрытом элементе. В нашем случает таб дополнительных параметров скрыт. Чтобы решить эту проблему используется код:

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

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

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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
// 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.

1
2
3
4
5
6
7
8
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

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

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

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

Плагин готов и его можно скачать плагин яндекс карт для k2 (868)