7
十一/080
十一/080
drupal的system_settings_form()函数
最近在修改收藏夹功能的时候,定义了一个表单,想根据节点类型来判断是否收藏。
function favorite_nodes_settings() { $form = array(); $form['admin'] = array( '#type' => 'fieldset', '#title' => t('Favorites Page Settings'), '#collapsible' => true, '#collapsed' => false, ); $form['admin']['favorite_nodes_page_limit'] = array( '#type' => 'textfield', '#title' => '收藏产品页个数', '#default_value' => variable_get('favorite_nodes_page_limit', 10), '#description' => '单个页面显示多少个标记收藏的产品。', ); $form['admin']['favorite_nodes_node_type'] = array( '#type' => 'checkboxes', '#title' => '可收藏的节点类型', '#options' => node_get_types('names'), '#default_value' => variable_get('favorite_nodes_node_type', array('product')), ); $form['array_filter'] = array('#type' => 'hidden'); // 注意这行。 return system_settings_form($form); } // 之前没有加上倒数第三行代码,保存后是个数组,问题始终解决不了,也就是说:在nodeapi钩子的view分支时, if (!in_array($node->type, variable_get('favorite_nodes_node_type', array('product')))) { break; }
这段代码不起作用,原因就是variable_get得到的结果不对。我们来查找下原因。看看drupal api中对system_settings_form_submit()这个函数的定义。
看到红色部分的代码就知道上面那行的含义了,用array_filter过滤掉空值数组,然后只取键,组成数组,刚好就是我们需要的节点类型列表。
function system_settings_form_submit($form_id, $form_values) { $op = isset($form_values['op']) ? $form_values['op'] : ''; unset($form_values['submit'], $form_values['reset'], $form_values['form_id'], $form_values['op'], $form_values['form_token']); foreach ($form_values as $key => $value) { if ($op == t('Reset to defaults')) { variable_del($key); } else { if (is_array($value) && isset($form_values['array_filter'])) { $value = array_keys(array_filter($value)); } variable_set($key, $value); } } if ($op == t('Reset to defaults')) { drupal_set_message(t('The configuration options have been reset to their default values.')); } else { drupal_set_message(t('The configuration options have been saved.')); } menu_rebuild(); }