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

Как создать расширение для 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
<?php
defined('_JEXEC') or die('Direct Access to this location is not allowed.');
class xmap_com_estateagent {
//...
}

Имя класса строится как 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&amp;act=showCE&amp;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) . Метод вызывается перед выводом пункта меню.