Как создать расширение для xmap
Расширение для поддержки компонента estateAgent.
Расширение минимум состоит из 2 файлов xml описания и файла с кодом.
Именоваться должно соответственно компоненту, для которого создаётся расширение, т.е. в данном случае com_estateagent.xml и com_estateagent.php
Формат xml:
<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>
Параметры
<!-- выводить категории или нет -->
<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
Имя класса строится как 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
$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()
$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
$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) . Метод вызывается перед выводом пункта меню.
15.10.2012 в 21:06
Интересно, не знаю поможет ли, искал в гугле метод changeLevel. Нашел эту статью, буду пробовать для Zoo
16.10.2012 в 16:18
Код, приведенный в этой статье напрямую не применил, но смысл выявил и немного переписав этот код получил то, что нужно, а нужно было категории с вложенностью 3-го порядка в компоненте Zoo вывести в карте XMap не сплошным списком, а соблюдая иерархию, дерево каталогов Zoo. Поэтому спасибо. Важным был самый главный элемент changeLevel. Теперь я являюсь единственным надеюсь человеком, который владеет полноценным плагином для генерации карты Zoo XMap с иерархией каталогов ))) Приятно