是“ 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添加了提交按钮,并处理了表单提交,并保存了变量。它还添加了“重置为默认值”按钮-将所有变量重置为默认值。

我基本上猜到了它的作用,因为那里没有很多文档,而我的朋友也不知道它到底是做什么的。我的问题是它如何知道要保存/重置的变量?我不只是传递数组吗?

另外,在system_settings_form中还有其他我应该知道的魔术吗?

Answers:


14

有关实现的详细信息,请参见system_settings_formsystem_settings_form_submit。在Drupal 7中,“重置为默认”按钮从“系统设置”表单中删除。

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 2012年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.