Как настроить разметку переключателей в представлении редактирования/создания узла?


Итак, у меня есть тип контента с несколькими полями. Одно поле представляет собой набор из двух переключателей. Выходной код при создании/модерации контента выглядит следующим образом:

<div id="edit-group-content-access" class="field-type-list-integer field-name-group-content-access field-widget-options-buttons form-wrapper">
<div class="form-item form-type-radios form-item-group-content-access-und">
    <label for="edit-group-content-access-und">Group content visibility <span title="Diese Angabe wird benötigt." class="form-required">*</span></label>
    <div class="form-radios" id="edit-group-content-access-und">
        <div class="form-item form-type-radio form-item-group-content-access-und">
            <input type="radio" class="form-radio" checked="checked" value="1" name="group_content_access[und]" id="edit-group-content-access-und-1">
            <label for="edit-group-content-access-und-1" class="option">Public - accessible to all site users </label>
        </div>
        <div class="form-item form-type-radio form-item-group-content-access-und">
            <input type="radio" class="form-radio" value="2" name="group_content_access[und]" id="edit-group-content-access-und-2">
            <label for="edit-group-content-access-und-2" class="option">Private - accessible only to group members </label>
        </div>
    </div>
</div>

Теперь я хочу, чтобы это было что-то вроде этого:

<div class="form-radios" id="edit-group-content-access-und">
  <input type="radio" class="switch-input" name="group_content_access[und]" value="1" id="Public" checked>
  <label for="edit-group-content-access-und-1" class="switch-label switch-label-off">Public</label>
  <input type="radio" class="switch-input" name="group_content_access[und]" value="2" id="Private">
  <label for="edit-group-content-access-und-2" class="switch-label switch-label-on">Private</label>
  <span class="switch-selection"></span>
</div>

Как я могу изменить эту разметку? (Я запустил Display suite и попытался как-то настроить его с помощью настроек DS; не получилось.)


Устранение неполадок

Проблема № 1

В какой степени $output не используется больше для переключателей?

Проблема № 2

Как мне добавить <span class="switch-selection"></span> после моей второй метки-переключателя? (См. Пример выше.)

Проблема № 3

На первой странице отображается следующее сообщение.

Примечание: Неопределенная переменная: вывод в themename_form_element() (строка 309 из D:\root\sites\all\themes\themename\template.php).

Author: kiamlaluno, 2015-09-05

1 answers

Вы можете изменить вывод, переопределив следующие функции темы Drupal: theme_form_element, theme_radios и theme_radio. (Вам не понадобится theme_radio, если вы не хотите вносить изменения в тег <input>.)

Скопируйте эти функции в вашу тему template.php файл и замените "тему" в имени функции на название вашей темы. Настраивайте по мере необходимости. Вам придется очистить свой кэш, чтобы изменения вступили в силу аффект.

В theme_form_element(), если вы хотите ограничить свои изменения радиоэлементами, вы можете добавить это условие:

if ($element['#type'] == 'radios' || $element['#type'] == 'radio') {
  // your stripped down mark-up here
}
else {
  // default mark-up
}

Вы также можете проверить соответствие другим критериям, таким как #name и #id:

if (strpos($element['#id'], 'edit-group-content-access') !== FALSE) {
  // This form element has an id of 'edit-group-content-access-und-1' or 'edit-group-content-access-und-2'.
}  

Пример реального мира, который печатает оболочку только для элементов, которые НЕ ЯВЛЯЮТСЯ радиоэлементами (только измените отображаемый код и оставьте все остальное как есть):

ДО

function mytheme_form_element($variables) {
  // ... 
  $output = '<div' . drupal_attributes($attributes) . '>' . "\n";
  // ...
  $output .= "</div>\n";
  // ...
}

ПОСЛЕ

function mytheme_form_element($variables) {
  // ... 
  $output = '';
  if ($element['#type'] != 'radios' && $element['#type'] != 'radio') {
    $output = '<div' . drupal_attributes($attributes) . '>' . "\n";
  }  
  // ...
  if ($element['#type'] != 'radios' && $element['#type'] != 'radio') {
    $output .= "</div>\n";
  }  
  // ...
}

Бонусный совет:): Если вы просто хотите изменить атрибуты оболочки, а не удалять ее полностью, см. в этом примере.

 2
Author: othermachines, 2015-09-06 18:31:50