我创建了一个用于更改名为“form_mods”的表单的小模块。我正在改变的形式是“user_profile_form”。我添加了一个名为“Profile”的额外字段的类别。 我在Drupal管理员中创建了一个名为“profile_state”的选择字段,我在我的模块中更改它以获得一个键=>状态值列表,当我以管理员身份登录时,它对我有用,但是尝试注册的匿名用户看到空状态选择字段。这里有权限问题吗?我试图添加'access'=> user_access('访问内容')到该字段但不起作用。这是我的代码:
function form_mods_form_alter($form, $form_state, $form_id) {
switch ($form_id) {
## user_profile_form ###################################################################################
case 'user_profile_form': // This is our form ID.
//echo '###'.$form['_category']['#value'].'###';
if($form['_category']['#value'] == 'Profile'){
// Modify the states dropdown list
$states = load_states_list();
$form['Profile']['profile_state'] = array(
'#type' => 'select',
'#title' => t('State'),
'#options' => $states,
'#required' => TRUE,
'#default_value' => isset($form['Profile']['profile_state']['#default_value']) ? $form['Profile']['profile_state']['#default_value'] : '',
'#element_validate' => array('profile_state_validate')
);
}
####################################################################################
break;
}
}
function load_states_list() {
$states = array('' => '-- Select a state'); // add a default empty value
$results = db_query("SELECT * FROM {states_list} ORDER BY name ASC");
while ($state = db_fetch_array($results)) {
$states[$state['code']] = $state['name'];
}
return $states;
}
由于
答案 0 :(得分:3)
首先,你确定你的功能会被运行吗?拥有以你的方式命名的功能,我认为不是。如果模块名称为“form_mods”,则应调用您的函数
function form_mods_form_alter
或者......因为您只修改了user_profile_form表单,所以可以使用函数名称
function form_mods_user_profile_form_alter
现在,它不起作用的原因是因为你没有&在参数列表中的$ form前面。 &基本上将变量作为引用传递,因此您对$ form变量所做的任何更改都将被保存并传递回调用函数。所以,你的功能看起来应该是
function form_mods_form_alter(&$form, &$form_state, $form_id) {
OR
function form_mods_user_profile_form_alter(&$form, &$form_state) {
参考:http://api.drupal.org/api/drupal/developer--hooks--core.php/function/hook_form_alter/6
答案 1 :(得分:-2)
感谢mikesir87的参考链接。我想出了我的问题。 有两种不同的形式正在使用我创建的那些字段。他们有不同的形式ID。我必须查找“user_profile_form”和“user_register”表单id。
这是我的新代码:
function form_mods_form_alter($form, $form_state, $form_id) {
if( (($form_id == 'user_profile_form') && ($form['_category']['#value'] == 'Profile')) || ($form_id == 'user_register') ){
// Modify the states dropdown list
$states = form_mods_load_states_list();
$form['Profile']['profile_state'] = array(
'#type' => 'select',
'#title' => t('State'),
'#options' => $states,
'#required' => TRUE,
'#default_value' => isset($form['Profile']['profile_state']['#default_value']) ? $form['Profile']['profile_state']['#default_value'] : ''
);
}
}
感谢