1

「form_mods」と呼ばれるフォームを変更するための小さなモジュールを作成しました。私が変更しているフォームは「user_profile_form」です。「プロファイル」という追加フィールドのカテゴリを追加しました。「profile_state」と呼ばれる Drupal 管理者に選択フィールドを作成し、モジュールでキー => 状態の値リストを持つように変更しています。管理者としてログインしているが、匿名ユーザーがregister は空の状態選択フィールドを認識します。ここに権限の問題はありますか?フィールドに 'access' => user_access('access content') を追加しようとしましたが、うまくいきませんでした。これが私のコードです:

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;

}

ありがとう

4

2 に答える 2

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) {

また

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

于 2010-12-08T14:26:59.120 に答える
-2

mikesir87さん、参考リンクありがとうございます。私は自分の問題を理解しました。私が作成したフィールドを使用している 2 つの異なるフォームがあります。それらは異なるフォーム 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'] : ''
            );

    }

}

ありがとう

于 2010-12-08T15:01:14.140 に答える