Форум русской поддержки Joomla!® CMS
06.12.2016, 04:55:26 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
   
   Начало   Поиск Joomla 3.0 FAQ Joomla 2.5 FAQ Joomla 1.5 FAQ Правила форума Новости Joomla Реклама Войти Регистрация Помощь  
Страниц: [1]   Вниз
  Добавить закладку  |  Печать  
Автор

Вывод в формате JSON и подключение к Яндекс карте

 (Прочитано 548 раз)
0 Пользователей и 1 Гость смотрят эту тему.
Septdir
Живу я здесь
******

Репутация: +35/-3
Offline Offline

Пол: Мужской
Сообщений: 838


Skype: septdir


« : 10.05.2016, 20:03:04 »

Здравствуйте, разрабатываю свой компонент и столкнулся с проблемой.

Задача следующая. Вывести метки на Яндекс карту через objectManager, следовательно надо получать данные с сайта в формате JSON
Для тестирования сделал view.josn.php (на скорую руку, потом уберу в контролер и сделаю модель) Сам вывод:http://test.joomlazen.com/index.php?option=com_jz_location&view=ymap&format=json
Код вывода:
Код:
class JZLocationViewYmap extends JViewLegacy {
public function getMapObject($data) {
    $item = new stdClass();
    $item->type = 'Feature';
    $item->id = $data->id;
    $item->geometry = new stdClass();
    $item->geometry->type = 'Point';
    $item->geometry->coordinates = '[55.831903,37.411961]';
    $item->properties = new stdClass();
    $item->properties->balloonContent = 'Content';
    $item->properties->clusterCaption = 'Cluste';
    $item->properties->hintContent = 'Hint';
    return $item;
    }
public function getMapFeatures() {
    $db = JFactory::getDbo();
    $query = $db->getQuery(true);
    $query
        ->select('*')
        ->from($db->quoteName('#__k2_items','a'))
        ->group($db->quoteName('a.id'))
        ->order('a.id DESC')
    ;
    $db->setQuery($query);
    $rows = $db->loadObjectList();
    if ($rows) {
        foreach ($rows as $row) {
            $main[] = $this->getMapObject($row);            
        }
        return $main;
    }
    return false;
}

public function display($tpl = NULL) {
    $app = JFactory::getApplication();
    $app->setHeader('Content-Type', 'application/json; charset=utf-8');
    $data = new stdClass();
    $data->type = "FeatureCollection";
    $data->features = $this->getMapFeatures();
    echo json_encode($data);
}
И соответственно создал вывод для удобства в простом HTML (Пример взял из Песочницы Яндекс, а на сайте сделал Access-Control-Allow-Origin:"*" )
Код:
<!DOCTYPE html>
<html>
<head>
    <title>Примеры. Добавление на карту большо числа объектов</title>
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
    <!-- Если вы используете API локально, то в URL ресурса необходимо указывать протокол в стандартном виде (http://...)-->
    <script src="http://api-maps.yandex.ru/2.1/?lang=ru-RU" type="text/javascript"></script>
    <script src="http://yandex.st/jquery/2.1.0/jquery.min.js" type="text/javascript"></script>
    <script>
ymaps.ready(init);

function init () {
    var myMap = new ymaps.Map('map', {
            center: [55.831903,37.411961],
            zoom: 10
        }, {
            searchControlProvider: 'yandex#search'
        }),
        objectManager = new ymaps.ObjectManager({
            // Чтобы метки начали кластеризоваться, выставляем опцию.
            clusterize: true,
            // ObjectManager принимает те же опции, что и кластеризатор.
            gridSize: 32
        });

    // Чтобы задать опции одиночным объектам и кластерам,
    // обратимся к дочерним коллекциям ObjectManager.
    objectManager.objects.options.set('preset', 'islands#greenDotIcon');
    objectManager.clusters.options.set('preset', 'islands#greenClusterIcons');
    myMap.geoObjects.add(objectManager);

    $.ajax({
        url: 'http://test.joomlazen.com/index.php?option=com_jz_location&view=ymap&format=json'
    }).done(function(data) {
        objectManager.add(data);
    });

}</script>
<style>
        HTML, body, #map {
            width: 100%; height: 100%; padding: 0; margin: 0;
        }
    </style>
</head>
<body>
<div id="map"></div>
</body>
</html>
Честно говоря с AJAX не сильно дружу. поэтому прошу помочь разобраться. Заранее благодарен.

Для тех кому удобнее отвечать на stackoverflow вот ссылки http://ru.stackoverflow.com/questions/521697/joomla-json-yandex-map http://stackoverflow.com/questions/37134854/joomla-json-output-ajax
Записан
Arkadiy
Группа развития
*****

Репутация: +431/-0
Offline Offline

Пол: Мужской
Сообщений: 5314


Крепитесь, други.


« Ответ #1 : 10.05.2016, 20:06:17 »

Аякс тут совсем не нужен, собирайте данные в массив или объект, как вам надо для карты, потом с этим массивом/объектом json_encode() и все.
Записан
Septdir
Живу я здесь
******

Репутация: +35/-3
Offline Offline

Пол: Мужской
Сообщений: 838


Skype: septdir


« Ответ #2 : 10.05.2016, 20:20:19 »

Аякс тут совсем не нужен, собирайте данные в массив или объект, как вам надо для карты, потом с этим массивом/объектом json_encode() и все.
Так вся, как я понимаю и проблема в JSON, точнее в том что карта не понимает что это json (хотя по логу ссылка распознается как "application/json; charset=utf-8")
Посмотрите пожалуйста код. может в нем проблема. А Акс мне потом понадобиться но дальше то я управлюсь просто застрял на этом месте
Записан
Arkadiy
Группа развития
*****

Репутация: +431/-0
Offline Offline

Пол: Мужской
Сообщений: 5314


Крепитесь, други.


« Ответ #3 : 10.05.2016, 20:27:24 »

Из кода не видно что у вас в data приходит, на вскидку добавьте еще в AJAX параметр dataType : 'json', тогда данные в data будут не строкой а объектом (если там действительно json приходит).
Записан
Septdir
Живу я здесь
******

Репутация: +35/-3
Offline Offline

Пол: Мужской
Сообщений: 838


Skype: septdir


« Ответ #4 : 10.05.2016, 20:33:36 »

Из кода не видно что у вас в data приходит, на вскидку добавьте еще в AJAX параметр dataType : 'json', тогда данные в data будут не строкой а объектом (если там действительно json приходит).
сам JSON вывод http://test.joomlazen.com/index.php?option=com_jz_location&view=ymap&format=json
 dataType : 'json', - попробовал не помогает
Записан
Arkadiy
Группа развития
*****

Репутация: +431/-0
Offline Offline

Пол: Мужской
Сообщений: 5314


Крепитесь, други.


« Ответ #5 : 10.05.2016, 22:07:28 »

Включайте FireBug, отлавливайте ошибки. json с виду вполне нормальный.
Записан
Septdir
Живу я здесь
******

Репутация: +35/-3
Offline Offline

Пол: Мужской
Сообщений: 838


Skype: septdir


« Ответ #6 : 10.05.2016, 22:26:36 »

Включайте FireBug, отлавливайте ошибки. json с виду вполне нормальный.
Да в том то и дело, что там пусто. data в консоль тоже передается
Записан
Septdir
Живу я здесь
******

Репутация: +35/-3
Offline Offline

Пол: Мужской
Сообщений: 838


Skype: septdir


« Ответ #7 : 10.05.2016, 22:58:37 »

Проблему удалось решить путем добавления контролера. Код контролера
Код:
function __construct($config = array()) {
    parent::__construct( $config );
}

 public function getMapObject($data) {
    $item = new stdClass();
    $item->type = 'Feature';
    $item->id = $data->id;
    $item->geometry = new stdClass();
    $item->geometry->type = 'Point';
    $item->geometry->coordinates = array(55.831903,37.411961);
    $item->properties = new stdClass();
    $item->properties->balloonContent = 'Content';
    $item->properties->clusterCaption = 'Cluste';
    $item->properties->hintContent = 'Hint';
    return $item;
    }
public function getMapFeatures() {
    $db = JFactory::getDbo();
    $query = $db->getQuery(true);
    $query
        ->select('*')
        ->from($db->quoteName('#__k2_items','a'))
        ->group($db->quoteName('a.id'))
        ->order('a.id DESC')
    ;
    $db->setQuery($query);
    $rows = $db->loadObjectList();
    if ($rows) {
        foreach ($rows as $row) {
            $main[] = $this->getMapObject($row);            
        }
        return $main;
    }
    return false;
}

public function some() {
    $app = JFactory::getApplication();
    $app->setHeader('Content-Type', 'application/json; charset=utf-8');
    $data = new stdClass();
    $data->type = "FeatureCollection";
    $data->features = $this->getMapFeatures();
    echo json_encode($data);

}
Так же была ошибка в координатах  
Код:
$item->geometry->coordinates = '[55.831903,37.411961]';
Они должны быть массивом
Код:
$item->geometry->coordinates = array(55.831903,37.411961);
« Последнее редактирование: 16.05.2016, 12:41:43 от Septdir » Записан
b2z
Support Team
*****

Репутация: +709/-0
Offline Offline

Пол: Мужской
Сообщений: 7522


Разраблю понемногу


« Ответ #8 : 16.05.2016, 18:40:02 »

Почеме в контроллере работаете с базой данных?
Записан
Septdir
Живу я здесь
******

Репутация: +35/-3
Offline Offline

Пол: Мужской
Сообщений: 838


Skype: septdir


« Ответ #9 : 16.05.2016, 19:07:29 »

Почеме в контроллере работаете с базой данных?
еще не окончательная версия, пока не более чем набросок для тестов (а тестировать удобно когда все в одном файле). Пока, не думал как в итоге сделать, но точно по другому.
Все операции с базой как полагается будут в model, возможно формирование объекта тоже(причем в одной функции). А вот дальше пока не знаю. С одной стороны формировать json под аякс  во view тоже не комильфо, с другой стороны это все же вывод.
« Последнее редактирование: 16.05.2016, 20:10:31 от Septdir » Записан
b2z
Support Team
*****

Репутация: +709/-0
Offline Offline

Пол: Мужской
Сообщений: 7522


Разраблю понемногу


« Ответ #10 : 16.05.2016, 20:40:59 »

Ну отдайте представлению чистые данные, а оно пусть само решает, что с ними делать. Либо в контроллере получите данные и дальше представлению, хотя при аяксе представление по сути лишнее. Как правило, в контроллере сразу JResponseJson формируете, забрав данные у модели, и отдаёте через echo.
Записан
Septdir
Живу я здесь
******

Репутация: +35/-3
Offline Offline

Пол: Мужской
Сообщений: 838


Skype: septdir


« Ответ #11 : 16.05.2016, 20:55:50 »

Как правило, в контроллере сразу JResponseJson формируете, забрав данные у модели, и отдаёте через echo.
Ну вот я пока именно в эту сторону склоняюсь. Но все же до этого мне по плану еще далеко, просто не удержался с картой поиграться
« Последнее редактирование: 16.05.2016, 21:00:42 от Septdir » Записан
Страниц: [1]   Вверх
  Добавить закладку  |  Печать  
 
Перейти в:  

Powered by SMF 1.1.21 | SMF © 2006, Simple Machines

Joomlaforum.ru is not affiliated with or endorsed by the Joomla! Project or Open Source Matters.
The Joomla! name and logo is used under a limited license granted by Open Source Matters
the trademark holder in the United States and other countries.

LiveInternet