Является ли «system_settings_form» вуду?

8

Друг только что показал мне system_settings_form в действии в файле конфигурации для формы.

Рассматриваемый код выглядит следующим образом (упрощенно).

function my_module_generateAdminForm($form){
  $form = array();
  $form['super_secret_password'] = array(
    '#type' => 'textfield',
    '#title' => t('Headline'),
    '#default_value' => variable_get('super_secret_password','password'),
  );
  system_settings_form($form);
}

system_settings_form добавляет кнопки отправки и обрабатывает отправку формы, сохраняя переменные. Также добавлена ​​кнопка «Reset to default», которая сбрасывает все переменные по умолчанию.

Я в основном догадался, что он делает, потому что там не так много документации, и мой друг тоже не знает точно, что он делает. Мой вопрос, как он знает переменные для сохранения / сброса? Разве я не просто передаю массив?

Также есть ли какая-то другая магия в system_settings_form, о которой я должен знать?

Coomie
источник

Ответы:

14

Посмотрите system_settings_form и system_settings_form_submit для деталей реализации. В Drupal 7 кнопка Reset to Default удаляется из формы системных настроек.

function system_settings_form($form) {
  $form['actions']['#type'] = 'actions';
  $form['actions']['submit'] = array(
    '#type' => 'submit',
    '#value' => t('Save configuration'),
  );

  if (!empty($_POST) && form_get_errors()) {
    drupal_set_message(t('The settings have not been saved because of the errors.'), 'error');
  }
  $form['#submit'][] = 'system_settings_form_submit';
  // By default, render the form using theme_system_settings_form().
  if (!isset($form['#theme'])) {
    $form['#theme'] = 'system_settings_form';
  }
  return $form;
}

System_settings_form:

Добавьте сохраненную конфигурацию кнопку «Отправить» и отправьте обратный вызов функции system_settings_form_submit.

system_settings_form_submit:

function system_settings_form_submit($form, &$form_state) {
  // Exclude unnecessary elements.
  form_state_values_clean($form_state);

  foreach ($form_state['values'] as $key => $value) {
    if (is_array($value) && isset($form_state['values']['array_filter'])) {
      $value = array_keys(array_filter($value));
    }
    variable_set($key, $value);
  }

  drupal_set_message(t('The configuration options have been saved.'));
}

Выполняет итерацию по всем элементам формы и устанавливает переменные для каждого элемента формы с ключом в качестве ключа элемента формы и значением в качестве значения элемента формы, переданного пользователем, считанного с использованием $ form_state ['values']

Итак, это просто форма с обработчиком отправки, который устанавливает переменные для всех значений формы с помощью функции variable_set.

Анил Сагар
источник
5
Хорошее объяснение. Если вас смущает «каждый элемент формы с ключом в качестве ключа элемента формы», он имеет в виду, что в приведенном выше примере $ form ['super_secret_password'] заставит Drupal вызывать variable_set ('super_secret_password', ...), потому что system_settings_form_submit берет имя переменной из ключа массива ('super_secret_password') вашей формы.
greg_1_anderson
1
Это полезно Почему api.drupal.org не может просто объяснить, что он делает на простом английском языке. Вместо этого он просто дает код ... Итак, в общем, не вуду, просто используя мои ключи полей.
Кум
1
Я думаю, что стоит отметить, что вы не должны использовать это для хранения больших переменных, так как они будут оставаться в памяти для каждого запроса страницы, независимо от того, был ли для этого прямой variable_get или нет. Все они кешируются один раз в памяти. Кроме того, обычные обработчики отправки и проверки будут работать без проблем. Не стесняйтесь добавлять их.
AyeshK