Отображение поля в зависимости от нажатия чекбокса, drupal way

Решил задачу с помощью написания виджета поля и form api. Решение на картинке. На самом деле там для поля появляется атрибут disabled, но т.к. у обертки поля будет класс form-disabled то с помощью css можно поле скрыть.

Оформил в это дело в отдельным модуль под названием mark_checkbox_to_show_field, info файл:

name = Mark checkbox to show field
description = Provide field setting to display field only when checkbox checked
core = 7.x
package = Custom

В самом модуле я использовал три хука:
добавил widget через hook_field_widget_info():

/**
 * Implements of hook_field_widget_info().
 *
 * @see hook_field_widget_info()
 */
function mark_checkbox_to_show_field_field_widget_info() {
  return array(
    'text_mark_checkbox_to_show_field' => array(
      'label' => t('Text field with checkbox'),
      'field types' => array('text'),
      'settings' => array('size' => 60),
      'behaviors' => array(
        'multiple values' => FIELD_BEHAVIOR_DEFAULT,
        'default value' => FIELD_BEHAVIOR_DEFAULT,
      ),
    ),
  );
}

Параметром field types указал что виджет будет доступен только для поля типа text.
Дальше в hook_field_widget_settings_form() использовал форму настройки виджета text_textfield из функции text_field_widget_settings_form():

/**
 * Implements hook_field_widget_settings_form().
 *
 * @see hook_field_widget_settings_form()
 */
function mark_checkbox_to_show_field_field_widget_settings_form($field, $instance) {
  $widget = $instance['widget'];
  $settings = $widget['settings'];

  $form['size'] = array(
    '#type' => 'textfield',
    '#title' => t('Size of textfield'),
    '#default_value' => $settings['size'],
    '#required' => TRUE,
    '#element_validate' => array('element_validate_integer_positive'),
  );

  return $form;
}

Последний хук это hook_field_widget_form() в котором и вывел чекбокс перед полем, а с помощью #states из Form API указал что если чекбокс выключен то поле будет доступно.

/**
 * Implements hook_field_widget_form().
 *
 * @see hook_field_widget_form()
 */
function mark_checkbox_to_show_field_field_widget_form(&$form, &$form_state, $field, $instance, $langcode, $items, $delta, $element) {
  $checkbox = array(
    '#type' => 'checkbox',
    '#title' => $element['#title'],
    '#weight' => -1,
    '#default_value' => isset($items[$delta]['value']),
  );
  unset($element['#title']);

  $path = array_values($element['#field_parents']);
  $path[] = $element['#field_name'];
  $path[] = $element['#language'];
  $path[] = $element['#delta'];
  $path[] = 'mark_checkbox_to_show_field';
  $name = '';
  foreach ($path as $i => $el) {
    if ($i == 0) {
      $name = $el;
    }
    else {
      $name .= '[' . $el . ']';
    }
  }

  $element += array(
    '#type' => 'textfield',
    '#default_value' => isset($items[$delta]['value']) ? $items[$delta]['value'] : NULL,
    '#size' => $instance['widget']['settings']['size'],
    '#maxlength' => $field['settings']['max_length'],
    '#attributes' => array('class' => array('text-full')),
    '#states' => array(
      'enabled' => array(
        ':input[name="' . $name . '"]' => array('checked' => TRUE),
      ),
    ),
    '#element_validate' => array('mark_checkbox_to_show_field_field_widget_validate'),
  );

  return array(
    'mark_checkbox_to_show_field' => $checkbox,
    'value' => $element,
  );
}

И добавил валидатор через #element_validate который и проверит включен ли чекбокс при заполнении поля или нет:

/**
 * Element validate callback function.
 */
function mark_checkbox_to_show_field_field_widget_validate($element, &$form_state, $form) {
  $parents = $element['#parents'];
  $parents[count($parents)-1] = 'mark_checkbox_to_show_field';
  $checkbox = drupal_array_get_nested_value($form_state['values'], $parents);
  if ($checkbox && empty($element['#value'])) {
    form_error($element, t('This field is required.'));
  }
  elseif (!$checkbox && !empty($element['#value'])) {
    $value = &drupal_array_get_nested_value($form_state['values'], $element['#parents']);
    $value = '';
  }
}

Отображение поля в зависимости от нажатия чекбокса, drupal way: 5 комментариев

  1. Геннадий

    Как пользоваться модулем???
    У меня создан тип материала «Слайды», где мне нужно чтобы поле Link выводилось если я его включу «галочкой». Поле Link выводится как кнопка «Подробнее…», но некоторых слайдах она не нужна. Как мне для этого использовать этот модуль?

    1. zviryatko Автор записи

      Включаешь модуль, заходишь на страницу на управления полями, добавляешь текстовое поле выбираешь подтип «Поле с чекбоксом». Дальше заходишь на добавление ноды с этим полем и смотришь на поле с чекбоксом.

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *