验证用户提交的设置 如果由函数system_settings_form()
为我们管理表单的话,那么我们如何才能检查是否在每一节点多少个注释的输入框内输入的是一个真实的数字?我们可以钩住表单提交的处理过程么?以及怎么钩
住?当然我们可以。我们仅需在我们的表单定义中定义一个验证函数,然后创建这个验证函数。 /** * Define the settings form. */ function annotate_admin_settings() { $form[‘annotate_nodetypes‘] = array( 28 CHAPTER 3 ■ MODULE-SPECI F IC SETTINGS ‘#type‘ => ‘checkboxes‘, ‘#title‘ => t(‘Users may annotate these node types‘), ‘#options‘ => node_get_types(‘names‘), ‘#default_value‘ => variable_get(‘annotate_nodetypes‘, array(‘story‘)), ‘#description‘ => t(‘A text field will be available on these node types to make user-specific notes.‘), ); $form[‘annotate_deletion‘] = array( ‘#type‘ => ‘radios‘, ‘#title‘ => t(‘Annotations will be deleted‘), ‘#description‘ => t(‘Select a method for deleting annotations.‘), ‘#options‘ => array( t(‘Never‘), t(‘Randomly‘), t(‘After 30 days‘) ), ‘#default_value‘ => variable_get(‘annotate_deletion‘, 0) // default to Never ); $form[‘annotate_limit_per_node‘] = array( ‘#type‘ => ‘textfield‘, ‘#title‘ => t(‘Annotations per node‘), ‘#description‘ => t(‘Enter the maximum number of annotations allowed per node (0 for no limit).‘), ‘#default_value‘ => variable_get(‘annotate_limit_per_node‘, 1), ‘#size‘ => 3 ); // Define a validation function. $form[‘#validate‘] = array( ‘annotate_admin_settings_validate‘ => array() ); return system_settings_form($form); } // Validate the settings form. function annotate_admin_settings_validate($form_id, $form_values) { if (!is_numeric($form_values[‘annotation_limit_per_node‘])) { form_set_error(‘annotate_limit_per_node‘, t(‘Please enter a number.‘)); } } 现在当Drupal处理这个表单时,它将回调annotate_admin_settings_validate()来进行验证。如果我们检测到输入的数据是坏的,我们将在错误出现的字段上设置一个错误信息,这反映为在页面上方出现一个警告信息,并将该字段的值转化为红色,如图3-4所示: 图3-4 验证脚本设置了一个错误信息 存储设置 在前面的例子中,改变设置然后点击”Save configuration”按钮,可以正常工作。如果点击了”Reset to defaults”按钮,各字段值将重置为它们的默认值。下面部分将描述这是如何工作的。 使用Drupal的变量数据库表 首先,让我们看一下字段“Annotations per node”。它的#default_value这样设置: variable_get(‘annotate_limit_per_node‘, 1) Drupal在数据库中有一个名为variables的表,并且键值对可以使用方法variable_set($key,$value)来存储,使用方法variable_get($key,$default)来回显。所以我们要说的就是,“将字段‘Annotations per node’的默认值设置为数据库表variables所存储的变量annotate_limit_per_node的值,如果不存在的话,使用1作为默认值”。所以当点击“Reset to defaults“按钮时,Drupal将使用默认值1. 警告:为了使在variables表中存储和回显的设置没有命名空间的冲突,你应该是你的表单字段名和变量的键(如上例中的annotate_limit_per_node)名称相同。命名方式为你的模块名加上一个描述性的名称。 由于“ Annotations will be deleted”字段是一个单选按钮,它看起来复杂一点。这个字段的#option如下所示: ‘#options‘ => array( t(‘Never‘), t(‘Randomly‘), t(‘After 30 days‘) ) 当PHP遇到一个没有键的数组时,它默认的为其插入数字键,所以这个数组的真实表示如下所示: ‘#options‘ => array( [0] => t(‘Never‘), [1] => t(‘Randomly‘), [2] => t(‘After 30 days‘) ) 当我们为这个字段设置默认值时,我们使用: ‘#default_value‘ => variable_get(‘annotate_deletion‘, 0) //默认为Never 它意味着,当有效时,默认为数组的第键值为0的元素,即是t(“Never”). 使用variable_get()来回显存储的值 当你的模块回显存储的设置时,应该采用 // Get stored setting of maximum number of annotations per node. $max = variable_get(‘annotate_limit_per_node‘, 1); 注意,在这里variable_get()的默认值,也是在没有存储值可用的情况使用(可能管理员还没有访问设置页面)。 总结 当读完本章后,你应该可以: 创建一个链接,在Drupal的主配置页面,来指向你的模块的特定的配置设置页面。 在Drupal的主管理页面创建一个新的管理分类 定义一个表单,使得管理员可以为你的模块选择特定的选项 验证选项并且如果验证失败的话返回一个错误信息反馈。 理解Drupal如何使用自己内建的持久化变量系统来存储和回显模块的设置 发表于 @ 2007年09月22日 21:21:00|评论(0 )|编辑 |
|