Drupal field_settings_form - PullRequest
       13

Drupal field_settings_form

1 голос
/ 15 декабря 2011

Я создал собственное поле в Drupal для адреса.Он отображает такие вещи, как улица, номер, почтовый индекс, ... Пока все хорошо.Но по какой-то причине ВСЕ поля обязательны для заполнения.Хотя есть набор обязательных в пользовательском интерфейсе или массиве.

Так что я хотел бы отредактировать его field_settings_form.Я нашел себе пример в коде ядра Drupal, но он мне мало помогает.Цель field_settings - сделать поля видимыми или нет и обязательными или нет.Поэтому я придумал этот код (я получил его от user_reference.module)

function mymodule_field_settings_form($field, $instance, $has_data) {
    $settings = array_keys($field['settings']);
    $form = array();
    $form['required_fields'] = array(
        '#type' => 'checkboxes',
        '#title' => t('Required fields'),
        '#default_value' => is_array($settings['required_fields'])
            ? array('required')
            : array(),
        '#options' => $settings,
    );
    return $form;
}

Но я застрял здесь.Кто-нибудь с некоторым опытом в этом вопросе?

Ответы [ 2 ]

2 голосов
/ 15 декабря 2011

После долгих исследований и еще большего количества проб и ошибок я нашел это сам. Во-первых, мне нужно заполнить страницу «Настройки формы», чтобы мы могли проверить, должна ли страница быть видимой / обязательной.

function mymodule_field_settings_form($field, $instance, $has_data) {
    $address_fields = array_keys($field['columns']);

    // Get all the address values and put them in an array
    $options = array();
    foreach ($address_fields as $value) {
        $options[$value] = $value;
    }

    // Fill in the values in the dropdown
    $form = array();
    $form['required_fields']['#type'] = 'checkboxes';
    $form['required_fields']['#title'] =  t('Required fields');
    $form['required_fields']['#default_value'] = $field['settings']['required_fields'];
    $form['required_fields']['#options'] = $options;

    $form['visible_fields']['#type'] = 'checkboxes';
    $form['visible_fields']['#title'] =  t('Visible fields');
    $form['visible_fields']['#default_value'] = $field['settings']['visible_fields'];
    $form['visible_fields']['#options'] = $options;

return $form;
}

А в функции пыльника я это заявил. $element вызывает функцию, которая возвращает все доступные элементы. Он имеет те же значения, что и $options в функции выше. Если 'required_field' включен, мы делаем это необходимым, если 'visible_field' не включен, мы сбрасываем его!

  $element = _mymodule_load_element_fields();

    foreach (array_keys($element) as $field_key) {
       $element[$field_key]['#default_value'] = isset($items[$delta][$field_key]) ? $items[$delta][$field_key] : '';        // Set default value
       $element[$field_key]['#required'] = $field['settings']['required_fields'][$field_key] != '0';

    // Set required property
    if ($field['settings']['visible_fields'][$field_key] == '0') {
        unset($element[$field_key]);
    }

Надеюсь, это поможет вам!

1 голос
/ 15 декабря 2011

Проблема в том, что «поле» в этом контексте - это совокупность элементов формы в целом, а не каждого отдельного элемента формы.Когда требуется «поле», отсутствует механизм для указания конкретных элементов формы, которые должны быть обязательными или нет.

Я пока не нашел удовлетворительного решения (я сталкивался с этим несколько раз)сейчас) лучшее, что я смог сделать, - это сделать поле не обязательным, а затем подключиться к проверке с помощью hook_field_validate и выполнить там мою «обязательную» проверку.Это не идеально, но работает:

function mymodule_field_validate($entity_type, $entity, $field, $instance, $langcode, $items, &$errors) {
  if ($field['type'] == 'the_field_type') {

    // Loop through field values
    foreach ($items as $delta => $item) {

      // Validate what you need to against the individual field columns
      if (empty($item['address_line_1'])) {
        $errors[$field['field_name']][$langcode][$delta][] = array(
          'error' => 'mymodule_address_error', 
          'message' => 'The first line of the address is required.',
        );
      }

      if (empty($item['town'])) {
        $errors[$field['field_name']][$langcode][$delta][] = array(
          'error' => 'mymodule_address_error', 
          'message' => 'The town of the address is required.',
        );
      }

      // And so on...
    }
  }
}
...