Шаблоны

Шаблоны позволяют сформировать произвольное HTML-представление геообъектов, балунов и хинтов. Например, если для отображения метки требуется использовать не только изображение с тенью, но и текст, необходимо сконструировать соответствующий его шаблон и задействовать его в стиле, использующемся для отображения метки.

Для определения шаблона используется элемент repr:Template, внутри которого в контейнере repr:text размещается HTML-код (тело шаблона).

<repr:Template gml:id="hintTemplate">
  <repr:text><div style="color:blue">Подсказка</div></repr:text>
</repr:Template>

В ряде случаев стиль не позволяет изменить отображения внешнего вида объекта никаким другим образом, кроме использования шаблона (см. например, repr:balloonContentStyle).

Шаблон является составной частью стиля, на который ссылается географический объект или коллекция.

При использовании шаблона доступ к значению любого XML-элемента, находящегося внутри элемента ymaps:GeoObject или ymaps:GeoObjectCollection осуществляется с помощью обращения к соответствующей переменной.

Для определения переменных используются строки вида $[имя_переменной|значение_по_умолчанию].

Имя переменной представляет собой местоположение этого XML-элемента внутри элемента, к которому применяется стиль. Местоположение задаётся последовательным перечислением названий всех родительских элементов и названия самого элемента, в качестве разделителя используется точка.

Допустим, описание географического объекта выглядит следующим образом:

<GeoObject>
  <gml:name>Офис Яндекса на улице Льва Толстого</gml:name>
  <gml:metaDataProperty>
     <AnyMetaData>
       <address>119021, Москва, ул. Льва Толстого, 16</address>
       <phone>+7 495 739-70-00</phone>
       <fax>+7 495 739-70-70</fax>
      </AnyMetaData>
  </gml:metaDataProperty>
  <gml:Point>
    <gml:pos>37.58828 55.733913</gml:pos>
  </gml:Point>
</GeoObject>

Тогда шаблон балуна, отображающего название объекта, адрес и телефон офиса, может выглядеть следующим образом.

<Template gml:id="balloonTemplate">
  <text>
    <div style="font-size:12px;">
      <div style="color:#ff0303;font-weight:bold">$[name]</div>
      <div>Адрес: $[metaDataProperty.AnyMetaData.address]</div>
      <div>Телефон: $[metaDataProperty.AnyMetaData.phone|не указан]</div>
  <text>
</Template>

Если не задать телефон офиса (т. е. удалить из приведённого примера элемент phone), то вместо номера телефона будет отображена строка «не указан».

Существует несколько правил, ограничивающих использование в тексте шаблона некоторых HTML-элементов и атрибутов. Список ограничений приведён в следующей таблице.

Ограничения на использование HTML в шаблонах
Игнорируются элементы script и iframe

Элементы script и iframe удаляются вместе с их содержимым.

Пример:

<div><script>alert(\"XSS\")"</script></div>

заменяется на

<div />
Игнорируются атрибуты, отвечающие за вызов обработчиков событий

Атрибуты, отвечающие за вызов обработчиков событий (onclick, onchange, onkeypress и т. д.), удаляются из элементов вместе со своим содержимым.

Пример:

<div onclick="alert(\"XSS\")">$[name]</div>

заменяется на

<div>$[name]</div>
Игнорируется атрибут class

Атрибут class удаляется из элементов вместе со своим содержимым.

Пример:

<div class="login">$[name]</div>

заменяется на

<div>$[name]</div>
В URL ссылки атрибута href должна быть указана схема; схема javascript игнорируется

Атрибут href удаляется вместе со своим содержимым, если в URL ссылки не указана схема (протокол) или используется схема javascript.

Пример:

<a href="$[metaDataProperty.AnyMetaData.test.a]">link</a>

заменяется на

<a>link</a>
Игнорируется свойство position:absolute атрибута style

Если атрибут style содержит свойство position:absoute, данное свойство удаляется.

Пример:

<div style="position:absolute">$[name]</div>

заменяется на

<div>$[name]</div>
Игнорируются CSS expressions

Если атрибут style содержит CSS expressions (поддерживаются только браузерами Internet Explorer до версии 8), он удаляется вместе со своим содержимым