2010-12-08 71 views
1

我创建了一个小模块,用于改变名为“form_mods”的表单。我正在改变的形式是“user_profile_form”。我为额外的字段添加了一个名为“Profile”的类别。 我在Drupal管理员中创建了一个名为“profile_state”的选择字段,我在模块中改变了它,使其具有一个key =>值列表状态,并且以管理员身份登录时正在为我工​​作,但尝试登录的匿名用户注册看到一个空状态选择字段。这里是否存在权限问题?我试图在该字段中添加'access'=> user_access('访问内容'),但这不起作用。这里是我的代码:Drupal hook_form_alter匿名用户看不到字段

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

不挖了一个老问题,但如果解决了,你可以标记我一样的答案?现在它已经获得了多张选票,并解决了手头的问题。我正在努力清理我松散悬挂的答案。谢谢! – mikesir87 2011-02-11 04:22:19

回答

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

-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'] : '' 
      ); 

    } 

} 

感谢

+1

请更新您的原始帖子。另外,它看起来像你没有正确地重命名你的功能。如果该函数存在于您创建的“form_mods”模块中,则该函数应称为form_mods_form_alter() – 2010-12-11 01:17:35