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

If you have found a spelling error, please, notify us by selecting that text and pressing Ctrl+Enter.