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 не может находиться в списке зависимых блоков контрола, если в его атрибуте указано, что он контролируется настройками приложения.