# Шаблоны

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

Для определения шаблона используется элемент [repr:Template](https://yandex.ru/dev/maps/ymapsml/doc/ru/ref/reference/representation-Template.md), внутри которого в контейнере [repr:text](https://yandex.ru/dev/maps/ymapsml/doc/ru/ref/reference/representation-text.md) размещается HTML-код (тело шаблона).

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

В ряде случаев стиль не позволяет изменить отображения внешнего вида объекта никаким другим образом, кроме использования шаблона (см. например, [repr:balloonContentStyle](https://yandex.ru/dev/maps/ymapsml/doc/ru/ref/reference/representation-balloonContentStyle.md)).

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

При использовании шаблона доступ к значению любого XML-элемента, находящегося внутри элемента [ymaps:GeoObject](https://yandex.ru/dev/maps/ymapsml/doc/ru/ref/reference/ymaps-GeoObject.md) или [ymaps:GeoObjectCollection](https://yandex.ru/dev/maps/ymapsml/doc/ru/ref/reference/ymaps-GeoObjectCollection.md) осуществляется с помощью обращения к соответствующей переменной.

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

Имя переменной представляет собой местоположение этого 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></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), он удаляется вместе со своим содержимым
||
|#
