Анонимный пользователь Drupal hook_form_alter не может видеть поля

Я создал небольшой модуль для изменения форм под названием «form_mods». Форма, которую я изменяю, называется user_profile_form. Я добавил категорию для дополнительных полей под названием «Профиль». Я создал поле выбора в администраторе Drupal под названием «profile_state», и я изменяю его в своем модуле, чтобы иметь список состояний ключ => значение, и он работает для меня, когда я вошел в систему как администратор, но анонимный пользователь, который пытается register видит пустое поле выбора состояний. Здесь есть проблема с разрешениями? Я попытался добавить в поле 'доступ' => 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;

}

Спасибо


person EricP    schedule 08.12.2010    source источник
comment
Чтобы не раскапывать старый вопрос, но если он решен, можете ли вы отметить мой как ответ? К настоящему времени он получил несколько голосов и решил проблему. Я пытаюсь убрать свои разрозненные ответы. Спасибо!   -  person mikesir87    schedule 11.02.2011


Ответы (2)


Прежде всего, вы уверены, что ваша функция когда-нибудь будет запущена? Я не думаю, что если функция названа так, как вы это делаете. Если имя модуля - "form_mods", ваша функция должна быть вызвана

function form_mods_form_alter

Или ... поскольку вы изменяете только форму user_profile_form, вы можете использовать имя функции

function form_mods_user_profile_form_alter

Причина, по которой он не работает, заключается в том, что у вас нет символа & перед формой $ в списке параметров. & В основном передает переменную как ссылку, поэтому любые изменения, которые вы вносите в переменную $ 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

person mikesir87    schedule 08.12.2010

Спасибо mikesir87 за справочную ссылку. Я понял свою проблему. Есть 2 разные формы, которые используют те поля, которые я создал. У них разные идентификаторы формы. Мне нужно искать идентификаторы формы user_profile_form и user_register.

Вот мой новый код, который работает:

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

    }

}

Благодарность

person EricP    schedule 08.12.2010
comment
пожалуйста, обновите исходный пост. Кроме того, похоже, что вы неправильно переименовали свою функцию. если эта функция находится в созданном вами модуле form_mods, функция должна называться form_mods_form_alter () - person Erik Ahlswede; 11.12.2010
comment
Спасибо, Эрик. Сейчас это исправлено. Вы имеете в виду, что я обновляю свой исходный пост своим решением вместо того, чтобы отвечать на него? Благодарность - person EricP; 13.12.2010