web-dev-qa-db-ja.com

別のページでuser_profile_formの一部を使用する

ユーザーが登録時に電話番号を入力します。入力できる値の量は無制限に設定されています。これを設定するとフィールドが変更され、下に別のフィールドを追加して電話番号を追加できます。ユーザーが/ user /%user/editに移動しなくても、登録後に番号を追加できるようにしたい

別のページで電話番号フィールドのみを返そうとしています。しかし、そのフォームを別のページに表示することはできません。他のフォームを表示しているときは、次のように呼び出しました。

drupal_render(drupal_get_form('user_profile_form'));

これは、フォームの一部、名、姓、国(すべてのカスタムフィールド)を返しますが、電話番号フィールドは返しません。私もかなりの数のエラーを受け取ります
未定義のインデックス:drupal_retrieve_form()のuser_profile_form
未定義のインデックス:block_form_user_profile_form_alterの#user_category
未定義のインデックス:overlay_form_user_profile_form_alter()の#user_category
未定義のインデックス:system_form_user_profile_form_alter()の#user_category
未定義のオフセット:uc_roles_form_user_profile_form_alter()で0

明らかに私は何か間違ったことをしています...

3
dooffas

この作品はエリックの作品をもとに制作しました。あなたができると思います['#access']=false不要なすべての値。

//Provide a custom page at /custom-profile to access our custom profile form
function mymodule_menu() {
  $items['custom-profile'] = array(
   'title' => 'Custom Profile!',
   'page callback' => 'mymodule_custom_profile',
   'access callback' => TRUE, 
   'type' => MENU_NORMAL_ITEM,
 );
}

//displays the custom form at /custom-profile
function mymodule_custom_profile() {
  module_load_include('inc', 'user', 'user.pages');

  global $user;  
  $user = user_load($user->uid);

  $form = drupal_get_form('user_profile_form', $user, 'account', 'custom'); 

  return $form;
}

function mymodule_form_user_profile_form_alter(&$form, &$form_state){
  //modifies the form_user_profile DO CUSTOM STUFF BELOW!
  if(isset($form_state['build_info']['args'][2]) && 
           $form_state['build_info']['args'][2] = 'custom'){

   //rename submit button
   $form['actions']['submit']['#value'] = t("dooo it!");

   //remove a few account things from this page
   $form['account']['#access']=FALSE;

   //needs to be there for the picture to work
   form_load_include($form_state, 'inc', 'user', 'user.pages');
  }
}
5
Jonathan Rowny

これを試して

module_load_include('inc', 'user', 'user.pages');
global $user;
print(drupal_get_form('user_profile_form', $user));

これは機能します。

3
niksmac
drupal_get_form('user_profile_form',$user,'account', 'my_parameter');      

function my_module_form_alter((&$form, &$form_state, $form_id) {
  switch($form_id) {   
      case 'user_profile_form':
        $info =  $form_state['build_info']['args'][2];
        if ( $info == 'my_parameter' ) {
           //do something with the form
           $form['my_field']['#access'] = false ;
           //prevent ajax errors
           form_load_include($form_state, 'inc', 'user', 'user.pages');
        } 
      break ;       
   }
}
1
Erik

@ pawel-dubielコメントに基づいて、user.pages.incをhook_menu()に直接追加しました。

function mymod_menu() {
   return array(
     'my-path' => array(
        'page callback' => 'mymod_page_callback',
        'file' => 'user.pages.inc',
        'file path' => drupal_get_path('module', 'user'),
     )
   );
}

チャームのように機能し、hook_init()の使用は避けられます。

0
Codium