Как создать расширение для xmap
Расширение для поддержки компонента estateAgent.
Расширение минимум состоит из 2 файлов xml описания и файла с кодом.
Именоваться должно соответственно компоненту, для которого создаётся расширение, т.е. в данном случае com_estateagent.xml и com_estateagent.php
Формат xml:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | < ?xml version="1.0" encoding="utf-8"?> <install type="xmap_ext" version="1.5.0"> <name>Название</name> <author>Автор</author> <creationdate>Дата</creationdate> <copyright>правообладатель</copyright> <license>лицензия</license> <authoremail>email</authoremail> <authorurl>сайт</authorurl> <version>Версия</version> <description>Описание</description> <files> <filename xmap_ext="com_estateagent">com_estateagent.php</filename> </files> <params> <!-- параметры --> </params> |
Параметры
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 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 | <params> <!-- выводить категории или нет --> <param name="include_category" type="list" default="1" label="Show Category" description="Should we include category into the sitemap?"> <option value="0">Never</option> <option value="1">Always</option> <option value="2">In XML Sitemap Only</option> <option value="3">In Site Sitemap Only</option> </param> <!-- Выводить объекты или нет--> <param name="include_obj" type="list" default="1" label="Show Objects" description="Should we include objects into the sitemap?"> <option value="0">Never</option> <option value="1">Always</option> <option value="2">In XML Sitemap Only</option> <option value="3">In Site Sitemap Only</option> </param> <param name="@spacer" type="spacer" default="" label="XML Sitemap" description="Options for the XML sitemap only" /> <!-- приоритет категорий --> <param name="category_priority" type="list" default="-1" label="Category Priority" description="Set the priority for the properties pages"> <option value="-1">Use Parent Menu Settings</option> <option value="0.0">0.0</option> <option value="0.1">0.1</option> <option value="0.2">0.2</option> <option value="0.3">0.3</option> <option value="0.4">0.4</option> <option value="0.5">0.5</option> <option value="0.6">0.6</option> <option value="0.7">0.7</option> <option value="0.8">0.8</option> <option value="0.9">0.9</option> <option value="1">1</option> </param> <!-- частота обновления категорий--> <param name="category_changefreq" type="list" default="-1" label="Category Change frequency" description="Set the change frequency for the properties pages"> <option value="-1">Use Parent Menu Settings</option> <option value="always">Always</option> <option value="hourly">Hourly</option> <option value="daily">Daily</option> <option value="weekly">Weekly</option> <option value="monthly">Monthly</option> <option value="yearly">Yearly</option> <option value="never">Never</option> </param> <!-- приоритет объектов --> <param name="obj_priority" type="list" default="-1" label="Object Priority" description="Set the priority for the companies pages"> <option value="-1">Use Parent Menu Settings</option> <option value="0.0">0.0</option> <option value="0.1">0.1</option> <option value="0.2">0.2</option> <option value="0.3">0.3</option> <option value="0.4">0.4</option> <option value="0.5">0.5</option> <option value="0.6">0.6</option> <option value="0.7">0.7</option> <option value="0.8">0.8</option> <option value="0.9">0.9</option> <option value="1">1</option> </param> <!-- частота изменения объектов--> <param name="obj_changefreq" type="list" default="-1" label="Object Change frequency" description="Set the change frequency for the companies pages"> <option value="-1">Use Parent Menu Settings</option> <option value="always">Always</option> <option value="hourly">Hourly</option> <option value="daily">Daily</option> <option value="weekly">Weekly</option> <option value="monthly">Monthly</option> <option value="yearly">Yearly</option> <option value="never">Never</option> </param> </params> |
com_estateagent.php
1 2 3 4 5 |
Имя класса строится как xml_название_компонента
Для начала нужно определиться с типами ссылок компонента и что из этого мы хотим отображать на карте.
index.php?option=com_estateagent&act=showCE&id=1 – категории
index.php?option=com_estateagent&act=showEO&id=1 – объекты
index.php?option=com_estateagent&act=listAgents – список агентов
index.php?option=com_estateagent&act=listAO&id=1 – предложения агента
Будем делать вывод на карте категорий и объектов, агентов будем игнорировать.
Метод, который ответственен за вывод дерева и который нужно реализовать, называется getTree
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 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 | function getTree( &$xmap, &$parent, $params ) { $type=$company=0; $link_query = parse_url( $parent->link ); parse_str( html_entity_decode($link_query['query']), $link_vars); // разбираем ссылку на параметры $act = $xmap->getParam($link_vars,'act',0); //получаем значение $act $id = intval($xmap->getParam($link_vars,'id',0)); // получаем значение $id if (!in_array($act,array('showCE','showEO'))) return; // если это не категория или объект, то ничего не делаем $include_category = $xmap->getParam($params,'include_category',1); //получаем значение параметров вывода категории $include_category = ( $include_category == 1 || ( $include_category == 2 && $xmap->view == 'xml') || ( $include_category == 3 && $xmap->view == 'html') || $xmap->view == 'navigator'); $params['include_category'] = $include_properties; $include_obj = $xmap->getParam($params,'include_obj',1);//получаем значение параметров вывода объектов $include_obj = ( $include_obj == 1 || ( $include_obj == 2 && $xmap->view == 'xml') || ( $include_obj == 3 && $xmap->view == 'html') || $xmap->view == 'navigator'); $params['include_obj'] = $include_obj; /* получение значений параметров приоритета и частоты обновлений */ $priority = $xmap->getParam($params,'category_priority',$parent->priority); $changefreq = $xmap->getParam($params,'category_changefreq',$parent->changefreq); if ($priority == '-1') $priority = $parent->priority; if ($changefreq == '-1') $changefreq = $parent->changefreq; $params['category_priority'] = $priority; $params['category_changefreq'] = $changefreq; $priority = $xmap->getParam($params,'obj_priority',$parent->priority); $changefreq = $xmap->getParam($params,'obj_changefreq',$parent->changefreq); if ($priority == '-1') $priority = $parent->priority; if ($changefreq == '-1') $changefreq = $parent->changefreq; $params['obj_priority'] = $priority; $params['obj_changefreq'] = $changefreq; // если категория, то строим дерево для категории if ($act=='showCE') xmap_com_estateagent::getCategoriesTree($xmap, $parent,$params, $id); // если объект, то выводим ссылку if ($act=='showEO') xmap_com_estateagent::getObjects($xmap, $parent,$params, $id); } |
getCategoriesTree()
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 | function getCategoriesTree(&$xmap, &$parent,&$params, $catid=0,$p_id = 0) { $db = &JFactory::getDBO(); $where = ''; if ($catid)$where = " AND id={$catid}"; $sql = "select id,name,parent as pid from #__estateagent_categories where published=1 and parent={$p_id} $where order by name"; $db->setQuery($sql); $rows = $db->loadObjectList(); // получаем список подкатегорий $xmap->changeLevel(1); // увеличиваем уровень вложенности foreach($rows as $row) { $node = new stdclass; $node->id = $parent->id; $node->uid = $parent->uid.'c'.$row->id; $node->browserNav = $parent->browserNav; $node->name = stripslashes($row->name); $node->modified = intval(strtotime('now')); $node->priority = $params['category_priority']; $node->changefreq = $params['category_changefreq']; $node->link = 'index.php?option=com_estateagent&act=showCE&id='.$row->id; $node->pid = $row->pid; if ($xmap->printNode($node) !== FALSE) { // добавляем ноду с подкатегорией в дерево. xmap_com_estateagent::getCategoriesTree( $xmap, $parent, $params, 0, $row->id); // пробуем добавить подкатегории для текущей категории if ( $params['include_obj'] ) { // если в параметрах включити вывод объектов, то добавляем ссылки на объекты в категории xmap_com_estateagent::getObjects($xmap, $parent, $params, $row->id); } } } $xmap->changeLevel(-1); // возвращаемся на уровень выше } |
getObjects
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 | function getObjects(&$xmap, &$parent,&$params, $catid=0, $element = 0){ $db = &JFactory::getDBO(); $where = ''; if ($catid)$where .= " AND cat={$catid}"; if ($element)$where .= " AND id={$element}"; $sql = "select id,title,modified as mdate from #__estateagent where published=1 $where order by title"; $db->setQuery($sql); $rows = $db->loadObjectList();//поучаем список объектов категории $xmap->changeLevel(1); // добавляем новый уровень foreach($rows as $row) { $node = new stdclass; $node->id = $parent->id; $node->uid = $parent->uid.'o'.$row->id; $node->browserNav = $parent->browserNav; $node->name = stripslashes($row->title); $node->modified = intval(strtotime($row->mdate)); $node->priority = $params['obj_priority']; $node->changefreq = $params['obj_changefreq']; $node->link = 'index.php?option=com_estateagent&act=showEO&id='.$row->id; $node->pid = ''; // parent id $xmap->printNode($node);// добавляем в дерево } $xmap->changeLevel(-1); // возвращаемся на уровень выше return true; } |
Так же есть метод prepareMenuItem(&$node,&$params) . Метод вызывается перед выводом пункта меню.