2010-12-08 70 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