Яндекс карты для K2
На примере плагина яндекс карт для k2 хочу показать как делать плагины для компонента k2 для joomla.
Картинка для затравки:
Не хотите читать? Можете сразу скачать [download id=”28″]
Плагин для 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); |
Плагин готов и его можно скачать [download id=”28″]