Клуб API Карт

Как? Динамическое содержимое в YMapsML.Template

Никита
27 декабря 2009, 01:14

Понимаю, что html-код можно засунуть в description и не заморачиваться, но..

Возможен ли нестрогий вывод данных используя Template для формирования вида отображения балуна?

Т.е. если указан шаблон:

  • <text><img src="http:$[metaDataProperty.AnyMetaData.link]" alt=""/></text>


, то $[metaDataProperty.AnyMetaData.link] заменится только на 1 <link> из

  • <link>//api.yandex.ru/images/maps/ymapsml/examples/samokatnaya.jpg</link>


А можно ли не указывать точное количество этих изображений. Т.о. указав, например шаблон:

  • <text>
  •   {while !EOF(metaDataProperty.AnyMetaData.link)}
  •      <img src="http:$[metaDataProperty.AnyMetaData.link[]]" alt=""/>
  •   {/while}
  • </text>


ну или что то типо того.


Хм. как бы это попроще объяснить, а то я уже и сам не понимаю, что написал.

31 комментарий
Подписаться на комментарии к посту
Шаблоны не имеют внутреннего языка для создания циклов или условной логики.

Расскажите поподробнее о задаче, которую решаете. Постараюсь подсказать решение.
Спасибо, Саша, за ответ. Решили цикл запускать программно при создании xml в description засунуть готовый вариант.

У меня возникла проблема не по теме, но ооочень срочная.

http://imperor.ru/detail.php?id=1229
1. На карте есть flash-панорама, при перемещении карты панорама не пропадает за пределами , а остается видной на странице ((

2. При увеличенном просмотре фотографии поверх фото остается надпись-копирайт от карты.

Есть соображения?
1. При переходе на вкладку с картой скрывайте панораму с экрана.
2. Установите у фотографии z-index больший нежели у копирайтов. Например, 2000.
Еще при переходе на вкладку с картой вызывайте метод карты redraw(), чтобы не отображался серый прямоугольник.

Помогите, пожалуйста решить мою проблему: в содержимом балуна есть набор картинок, состав набора определяется условиями if. в итоге получается код:

общий шаблон:


       
 

кажый объект коллекции:


      Имя
 

     
                 

 

Когда код картинок подставляется в шаблон, ничего не происходит. а если добавить

подразумевается что разметка будет храниться в шаблоне, а из метаданных берется только текст и в эту разметку помещается.

Вставлять html в html думаю не получится

что же мне еще тысячу разных шаблонов насоздавать (у меня около тысячи маркеров) Неужели нет другого выхода?

думаю что это из соображений безопасности.

в данные пользователи могут положить что угодно (хоть тэг

Дорогая бабушка, Вы вечно как напишете, ничего не понятно( Можно поподробнее как их получить на клиенте и как зааппендить? или может где-то в документации про это написано?

На клиенте вы получаете YMapsML методом geoXml.load, который возвращает вам объект-обещание (т.к. это асинхронный http-вызов), вызвав у этого объекта метод then и передав ему в параметрах 2 функции в первой вы получите упорядоченную коллекцию геообъектов, перебирая элементы которой, вы можете получить доступ к данным геообъекта через поле properties

 

пример кода:

 

// Загрузка YMapsML-файлаymaps.geoXml.load("http://maps.yandex.ru/export/usermaps/2AFK6Hx6e5RmIizO09Ai_tdW5VaGwE8O/")
    .then(function (res) { // функция обрабатывает успешный результат получения YMapsML
        // перебор всех элементов геоколлекции
        res.geoObjects.each(function (geoObject) {
            // получение поля AnyMetaData
            console.log(geoObject.properties.get('metaDataProperty.AnyMetaData'));
            // получение всех полей
            console.log(geoObject.properties.getAll());
        });
        myMap.geoObjects.add(res.geoObjects); // Добавление геообъектов на карту
    }, function (error) { // Вызывается в случае неудачной загрузки YMapsML
        console.error('Ошибка: ' + error);});

Прошу меня простить за мою тупость! я по три раза прочитала материал по каждой из ссылок и не поняла ничего из этого(

попробовала вставить ваш пример кода себе, заменив адрес YMapsML-файла на свой. что-то еще надо было сделать?

 

$output .= 'ymaps.geoXml.load("'.$uri.'components/com_yandexmaps/twirl/my_file.xml")

    .then(function (res) { // функция обрабатывает успешный результат получения YMapsML

        // перебор всех элементов геоколлекции

        res.geoObjects.each(function (geoObject) { 

            // получение поля AnyMetaData

            console.log(geoObject.properties.get("metaDataProperty.AnyMetaData"));

            // получение всех полей

            console.log(geoObject.properties.getAll());

        });

        map'.$mC.'.geoObjects.add(res.geoObjects); // Добавление геообъектов на карту

    }, function (error) { // Вызывается в случае неудачной загрузки YMapsML

        console.error("Ошибка: " + error);

});';

 

я написал пример, который выводит в консоль броузера данные из metaDataProperty.AnyMetaData ваших геообъектов

Вы можете использовать эти данные по своему усмотрению, например вставить их в балун геообъекта или что-то еще.

В чем конкретно возникло затруднение, с чем не получилось разобраться?

Значит мне нужно заменить строчку про консоль на 

geoObject.setBalloonContent((geoObject.properties.get("metaDataProperty.AnyMetaData")), {maxWidth: 100});

- так?

а что еще нужно сделать,чтоб оно заработало?

geoObject.setBalloonContent((geoObject.properties.get("metaDataProperty.AnyMetaData")), {maxWidth: 100});


у геообъекта во 2-й версии нет метода setBalloonContent

Но мысль в целом верная, берете свои данные и вставляете их в балун

а какой метод использовать? по этой ссылке ничего не открывается.

Извините за долгий ответ, в вашем случае более изящным вариантом будет передавать  в AnyMetaData только урлы картинок.

 

Для текущего варианта с html-эскейпленными тэгами я сделал вам пример

Спасибо, я долго мучилась (ваш пример мне помог) и у меня получился такой код вывода карты:

<script type="text/javascript">//script>
У меня коллекции разбиты на группы (чтобы каждой группе задать свой стиль)
и видимо из-за этих групп возникает ошибка вот тут:
res.geoObjects.each(function (item) {

 

У меня коллекции разбиты на группы (чтобы каждой группе задать свой стиль)
и видимо из-за этих групп возникает ошибка вот тут:
res.geoObjects.each(function (item) {

если ваши геообъекты содержаться во вложенных коллекциях, вам надо перебирать их во втором each

res.geoObjects.each(function (item) {
    item.each(function (geoObject) {
        ...
    });

добавила второй each, но почему-то не помогло.может быть глянете, пожалуйста, что не так (если коллеции сделать не вложенными,то точно работает)?

http://test.hotschool.ru/index.php?option=com_content&view=article&id=1&Itemid=2

Вы неправильно подключаете АПИ

Подключаете первую версию, а код пишете под вторую. =)

ооо,меня это с ума скоро сведет(

если я подключю версию 2.0, то у меня вообще ничего работать не будет. а возможно переписать этот код под первую версию?

Рекомендую заглядывать в консоль ошибок

там написано почему ничего не работает

 

по ссылке которую я давал выше 2 способа подключения АПИ

в самом простом случае замените

YMaps.jQuery(function () {

на

ymaps.ready(function () {

я попробовала по-всякому изменить это подключение, все равно пишет ReferenceError: ymaps is not defined

а если через function init() {

как в примере по вашей ссылке, то не выдает никаких ошибок, но все равно пустой экран.



ну как же оно будет работать если у Вас так и подключено 1-е АПИ?!

 

 

 

Посмотрите какой у второго АПИ урл по той ссылке что я давал

ааа, а я спрашивала как тот код переделать под первую версию,думала вы на это ответили. все, теперь я поняла.

у меня получилось вывести объекты,но не могу найти как стили с иконками получить из YMapsML файла, предполагаю, что как-то так, а что писать в скобках?

, {

    iconImageHref: item.options.get(''), 

 }

Вы зачем-то всё излишне усложнили.

У Вас уже есть метки и шаблоны балуна в YMapsML, и новые создавать не нужно.

Нужно просто сформировать тэги картинок из данных и вставить их на тоже место

 

Я сделал Вам пример, чтобы еще 3 дня не переписываться =)

 

PS: обратите внимание что у Вас в YMapsML приходят местами некорректные данные

мухина,wc.jpg,

Спасибо, дорогая бабушка!обожаю вас!

я наверно вас уже достала, но у меня еще вопрос) 

как мне теперь все это совместить с активными областями и тайлами? даже не представляю какое место переделывать под наш новый код...

По идее одно другому не мешает.

Впрочем, если возникают трудности, рекомендую создать новую тему в клубе,

а то мы уже заспамили оповещениями топикстартера.

Проблема в том, что все эти файлы, генеирующие тайлы и прочее написаны на api1.1 (или где-то есть под 2.0?), там надо кучу файлов переделывать под вторую версию, я попробовала просто вставить, уже миллион ошибок вылетел.

поэтому думаю, что может возможно этот наш код (для создания динамического содержимого балуна) переписать под певую версию апи? 

Бабушка, не бросайте меня, пожалуйста!

создай новую тему с примером не работающего кода