7
十一/08
0

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();
}


相关文章

关键字:
评论 (0) Trackbacks (0)

没有评论

发表评论

No trackbacks yet.