ユーザーが一部のプロファイルフィールドの編集のみを許可する2番目の「アカウントの編集」ページを作成することはできますか?


15

私のサイトのユーザーは、登録時にかなり多くのフィールドに入力する必要があります。ただし、登録後、定期的に変更する必要があるのはこれらのフィールドのうち4つ(約20個のうち)だけです。ユーザーがこれらの4つのフィールドだけを変更して物事をシンプルにできるようにするために、別個の「編集」ページを作成したいと思います。

  • field_checkbox_a
  • field_checkbox_b
  • field_checkbox_c
  • field_checkbox_d

これらのフィールドはすべてフィールドグループに含まれているため、理想的には、ページにこのフィールドグループとその中の4つのチェックボックスが表示され、送信ボタンとキャンセルボタンがあります。

クイック編集モジュールのようなインプレース編集ではなく、個別のページとしてこれを行いたいです。

ユーザーは元のアカウントの編集ページにアクセスしてタイムゾーン、電子メールアドレスなどを変更できる必要がありますが、実際には別の画面を使用して、最も一般的なアカウントオプションを編集できます。

回答:


9

以前にも同じ状況で、フル機能のdruapl機能hook_form_alterで処理しました。ユーザー、登録、ユーザー編集の2つのフォームがあります

  • user_profile_form(編集中)
  • user_register_form(登録時)

編集方法で指定したフィールドを非表示にするだけでいいので、カスタムモジュールで

function yourmodule_form_alter(&$form, &$form_state, $form_id)
{
    global $user;

    if ($form_id == "user_profile_form") {
       // ym($form);
       // you also can perform this action for specified roles 
        //if (!(in_array('blogger', $user->roles) || in_array('administrator', $user->roles))) {
            hide($form['field_mytest']);
            // hide other field with this method
        //}
    }

}

以下に示すように、そのフィールドが登録に存在した後

ここに画像の説明を入力してください

編集方法では存在しない(非表示)

ここに画像の説明を入力してください

また、それらを非表示にする代わりに読み取り専用に設定することもできます$form['field']['#access'] = FALSE;

そして別の解決策は、フィールド許可モジュールを使用している

フィールド権限モジュールを使用すると、サイト管理者はフィールドレベルの権限を設定して、エンティティのフィールドを編集、表示、作成できます。特徴:

  • ノードだけでなく、任意のエンティティでフィールド権限を有効にします。
  • ユーザーのアクセス権に基づいてパターン化されたさまざまな表示を許可するロールベースのフィールド権限。
  • 作成者レベルの権限では、エンティティの所有者に基づいてフィールドを表示および編集できます。
  • 各フィールドの権限はデフォルトでは有効になっていません。代わりに、管理者はこの機能が必要なフィールドに対してこれらの権限を明示的に有効にできます。

このモジュールが提供する機能として、匿名ユーザー(登録解除ユーザーは、これらのフィールドを編集し、ユーザーのみを登録できます(読み取り専用)。


7

2つのフォームを使用する代わりに、デフォルトのフォームを使用して、次のような「すべての設定を表示」チェックボックスを追加できます。

$form['show_all_settings'] = array(
  '#type' => 'checkbox',
  '#title' => t('Show all settings'),
);

次に、チェックボックスが選択されたときに表示するフォームフィールドを変更し、それらのフォームフィールドに次のプロパティを含めることができます。

'#states' => array(
  'invisible' => array(
   ':input[name="show_all_settings"]' => array('checked' => FALSE),
  ),
),

このようにして、ユーザーはページから別の設定に移動することなく、すべての設定を表示するフォームと最小限の設定セットを表示するフォームを切り替えることができます。

参照資料


6

そのためにProfile2モジュールを使用できます。

  • プロファイルタイプを作成するか、デフォルトのメインプロファイルを使用します。
  • それらのフィールドをそのプロファイルタイプに追加し、登録フォームに表示されるように設定します。

それらのフィールドがユーザーアカウントから他のフィールドの中で登録フォームで利用できるように。しかし、これらのフィールドを編集するために、ユーザーがに行くべきプロフィールの編集の代わりにページユーザーの編集ページ。


ユーザー編集ページと独自のカスタムページに4つのチェックボックスを表示します。メインユーザー編集ページからそれらを削除したくありません。
パトリックケニー

2

VBOモジュールを試して、VBOページを作成し、ビューにUSER関係を追加し、ユーザーがmodに使用できるフィールドを追加して、権限を設定できます。現在のユーザーのみに「属する」コンテンツを選択してください(コンテキストフィルターを使用)


ユーザーがこれらのフィールドを編集できるようにするにはどうすればよいですか?VBOでは値を表示できますが、編集可能にする必要があります。
パトリックケニー

その後、(それが呼び出され、正確に覚えていないことができ、このようなもの)「を変更実体値」の動作をチェックVBOフィールドを追加
gilzero

おかげで、エンティティ値の変更と呼ばれています。残念ながら、これは私の場合にはうまくいきませんが、他の人にとっては有用な解決策かもしれません。
パトリックケニー

2

この質問に対するzhilevanの回答、およびdrupal.orgでのこの質問この議論に基づいて、私に役立つ実際のコードを以下に示します。

function MYMODULE_menu() {
  $items = array();
  $items['user/editpurposes'] = array(
    'title' => t('Change your purposes'),
    'page callback' => 'MYMODULE_purpose_edit_form',
    'access callback' => TRUE,
    'access arguments' => array('access content'),
    'description' => t('Purpose Edit Form'),
    'type' => MENU_CALLBACK,
  );
  return $items;
}

function MYMODULE_purpose_edit_form() {
  // Needed to load AJAX.
  module_load_include('inc', 'user', 'user.pages');
  global $user;
  $account = user_load($user->uid); // Load a user object
  $form = drupal_get_form('user_profile_form', $account, 'account', 'purposes');
  return $form;
}

function MYMODULE_form_user_profile_form_alter(&$form, &$form_state) {
  if(isset($form_state['build_info']['args'][2]) && $form_state['build_info']['args'][2] == 'purposes') {

    // Remove name, email, password, etc.
    $form['account']['#access'] = FALSE;
    // Remove language.
    $form['locale']['#access'] = FALSE;
    $form['timezone']['#access'] = FALSE;
    // Remove various custom fields.
    $form['field_acc_displayname']['#access'] = FALSE;
    $form['field_acc_code_agree']['#access'] = FALSE;

    // Needed to load AJAX.
    form_load_include($form_state, 'inc', 'user', 'user.pages');
  }
}

私の答えで提案したように、なぜProfile2がオプションではなかったのか尋ねることはできますか?
ЕлинЙ.

0

フィールドグループモジュールを使用すると、物事を少し整理できるはずです。たとえば、フィールドを別のタブに配置します。1つのタブの下にある一般的なものと、別のタブの下にある残りのもの。


このアイデアに感謝しますが、私はすでにフィールドグループモジュールを使用しています。それは良いことですが、本当にすべてではなく、4つのオプションをユーザーに見せたいだけです。
パトリックケニー

0

このコードを試してください。表示したくない他のフィールドを非表示にします。

<?php
global $user;
$user=user_load($user->uid);
module_load_include('inc', 'user', 'user.pages');
$user_form = drupal_get_form('user_profile_form', $user);
print(drupal_render($user_form));
?>
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.