Switch-блок представляет собой более универсальный метод реализации скрываемого блока, который предоставляет невозможный ранее в hide блоках функционал. В частности, стало возможным:
- Отделить контрол от самого скрываемого блока switch. Это означает, что контрол, нажатия на который позволяют изменять своё состояние и состояние связанных объектов, может находиться в любой части статьи (не обязательно внутри или рядом со скрываемым контентом).
- Привязать к одному контролу несколько разных блоков switch. Это позволяет разместить глобальный для всей статьи контрол, который, к примеру, будет модифицировать все разбросанные по статье примеры.
- Задать и блокам switch, и контролам неограниченное количество состояний – значений блока (аналогом скрытия блока в hide‘ах будет состояние блока с пустым значением). Необходимо для реализации не только функционала скрывания контента (т.е. двух состояний “есть контент” и “пустой блок”), но и разных чередований: например, можно сверстать комментарий к примеру с состояниями “<пусто>”, “краткий комментарий”, “развернутый комментарий” или в статье “времена года” сделать switch с четырьмя состояниями, хранящими картинки зимы, весны, лета и осени.
Тег switch
, определяющий начало блока switch может иметь четыре атрибута (два обязательных и два опциональных):
- Атрибут
inline
– это флаг, определяющий будет ли контент блока switch находиться на текущей строке или будет перенесен на следующую. Соответственно может принимать значения1
или0
. Этот атрибут является опциональным, если его не указывать, то значением по умолчанию будет1
(контент отобразится на текущей строке). - Атрибут
manage
определяет тип управления блоком (аналог атрибутаcontrol
в hide‘ах). Это обязательный атрибут, который на данный момент может принимать два значения:switch-control
– для блоков, управляемых контролами, иapplication settings
– для блоков, управляемых настройками приложения. В зависимости от значения этого атрибута обязательным атрибутом будет только один из двух оставшихся, поэтомуmanage
обязательно должен им предшествовать. - Атрибут
thematic
описывает тип контента блока (аналог атрибутаlabel
в hide‘ах). Является обязательным, если значение атрибутаmanage
равноapplication settings
, в других случаях может быть не указан. Может принимать одно из следующих значений. - Атрибут
label
содержит строку – уникальный идентификатор блока. Является обязательным, если значение атрибутаmanage
равноswitch-control
, в других случаях может быть не указан. Может принимать любые значения, которые затем будут использоваться в управляющем контроле.
Помимо атрибутов тег switch
должен содержать вложенные теги switch-state
, которые определяют состояния блока. Состояния блока представляются в виде циклического списка: в каком порядке они указаны, в таком и будут сменяться, последнее состояние сменяется первым. Для того чтобы switch-блок мог использоваться по своему прямому назначению, он должен иметь как минимум два состояния (то есть как минимум два вложенных тега switch-state
). Если switch-блок имеет два состояния и одно из них пустое, то в таком случае switch-блок будет работать как hide-блок.
Примеры объявления блоков switch:
<switch inline="1" manage="switch-control" label="label_1"><switch-state>контент1</switch-state><switch-state>контент2</switch-state></switch>
<switch inline="0" manage="switch-control" thematic="phrase" label="label_2"><switch-state>контент1</switch-state><switch-state>контент2</switch-state></switch>
<switch inline="0" manage="application settings" thematic="morph"><switch-state>контент1</switch-state><switch-state>контент2</switch-state><switch-state>контент3</switch-state></switch>
<switch inline="1" manage="application settings" thematic="idioms" label="label_3"><switch-state>контент1</switch-state><switch-state>контент2</switch-state></switch>
Тег switch-control
определяет контролирующий блок. Как и тег switch
, он должен содержать список состояний (вложенные теги switch-state
), а также может содержать список идентификаторов, контролируемых им switch-блоков. Для этого каждый идентификатор заключается в отдельный вложенный в контрол тег managed-switch
. При нажатии на контрол состояния самого контрола и зависимых от него switch-блоков будут синхронно изменяться. В принципе, контрол может и не иметь зависимых switch-блоков, в таком случае при нажатии на него будет изменяться только он сам.
Примеры объявления контролов:
<switch-control><managed-switch>label_1</managed-switch><managed-switch>label_2</managed-switch><switch-state>контент1</switch-state><switch-state>контент2</switch-state></switch>
<switch-control thematic="gram"><managed-switch>label_1</managed-switch><managed-switch>label_2</managed-switch><switch-state>контент1</switch-state><switch-state>контент2</switch-state></switch>
<switch-control><switch-state>контент1</switch-state><switch-state>контент2</switch-state></switch-control>
Дополнительные ограничения использования блоков switch, накладываемые компилятором при сборке во избежание рассинхронизации при переключении состояний:
- Все блоки switch одной тематики должны иметь одинаковое количество состояний.
- Также количество состояний должно быть одинаковым у контрола и всех зависимых от него блоков switch.
- Блок switch не может находиться в списке зависимых блоков контрола, если в его атрибуте указано, что он контролируется настройками приложения.