사용자가 일부 프로필 필드 만 편집 할 수있는 두 번째 "계정 편집"페이지를 만들 수 있습니까?


14

내 상황은 다음과 같습니다. 내 사이트의 사용자는 등록시 상당히 많은 수의 필드를 작성해야합니다. 그러나 등록한 후에는이 필드 중 4 개 (약 20 개) 만 정기적으로 변경하면됩니다. 사용자가이 네 가지 필드 만 수정하여 간단하게 유지할 수 있도록 별도의 "편집"페이지를 만들고 싶습니다.

  • field_checkbox_a
  • field_checkbox_b
  • field_checkbox_c
  • field_checkbox_d

이러한 필드는 모두 필드 그룹에 포함 되어 있으므로 이상적으로 페이지에는이 필드 그룹과 그 안에있는 네 개의 확인란이 표시되고 제출 및 취소 버튼이 있습니다.

빠른 편집 모듈 과 같은 내부 편집이 아닌 별도의 페이지 로이 작업을 수행하고 싶습니다 .

사용자는 여전히 원래의 계정 편집 페이지에 액세스하여 시간대, 전자 메일 주소 등을 변경할 수 있어야하지만 별도의 화면을 사용하여 가장 일반적인 계정 옵션을 편집 할 수 있습니다.

답변:


8

나는 이전과 같은 상황을 겪었고 파워 풀 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;

또 다른 솔루션은 필드 권한 모듈을 사용하는 것 입니다

필드 권한 모듈을 사용하면 사이트 관리자가 필드 수준 권한을 설정하여 모든 엔터티에서 필드를 편집, 조회 및 만들 수 있습니다. 풍모:

  • 노드뿐만 아니라 모든 엔티티에서 필드 권한을 사용하십시오.
  • 사용자의 액세스 권한에 따라 다른보기를 패턴화할 수있는 역할 기반 필드 권한.
  • 작성자 수준 권한을 통해 엔터티 소유자가 누구인지에 따라 필드를보고 편집 할 수 있습니다.
  • 각 필드에 대한 권한은 기본적으로 활성화되어 있지 않습니다. 대신 관리자는이 기능이 필요한 필드에 대해 이러한 권한을 명시 적으로 활성화 할 수 있습니다.

이 모듈이 익명 사용자에게 제공하는 기능으로 (등록 취소 사용자는 해당 필드를 편집하고 사용자를 등록 할 수만 있습니다 (읽기 전용 방식)).


6

두 가지 양식을 사용하는 대신 기본 양식을 사용하고 다음과 같은 "모든 설정 표시"확인란을 추가 할 수 있습니다.

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

그런 다음 확인란을 선택할 때 표시 할 양식 필드를 변경하고 해당 양식 필드에 다음 속성을 포함시킬 수 있습니다.

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

이러한 방식으로 사용자는 모든 설정을 표시하는 양식과 최소 설정 세트를 표시하는 양식간에 전환 할 수 있으며 페이지에서 다른 설정으로 전달하지 않아도됩니다.

참고 문헌


5

이를 위해 Profile2 모듈을 사용할 수 있습니다 .

  • 프로파일 유형을 작성하거나 기본 기본 프로파일을 사용하십시오.
  • 해당 필드를 해당 프로파일 유형에 추가하고 등록 양식에 표시되도록 설정하십시오.

이러한 필드는 사용자 계정 의 다른 필드 중 등록 양식 에서 사용할 수 있습니다 . 그러나 해당 필드 편집에, 사용자는 이동합니다 프로필 편집 페이지 대신 사용자 편집 페이지입니다.


사용자 편집 페이지와 자체 사용자 정의 페이지에 네 개의 확인란을 표시하고 싶습니다. 기본 사용자 편집 페이지에서 제거하고 싶지 않습니다.
Patrick Kenny

1

VBO 모듈을 사용해보십시오 . VBO 페이지를 생성하고, 뷰에서 USER 관계를 추가하고, 사용자가 수정할 수있는 필드를 추가하고, 권한을 설정하십시오. 상황 별 필터를 통해 현재 사용자에게만 "포함"컨텐츠를 선택해야합니다.


사용자가이 필드를 편집하도록하려면 어떻게해야합니까? VBO에서는 값을 표시 할 수 있지만 편집 가능해야합니다.
Patrick Kenny

vbo 필드를 추가 한 다음 '엔터티 값 수정'작업을 선택합니다 (이와 같은 것이 정확히 무엇인지 기억할 수 없음)
gilzero

감사 합니다 . 엔티티 값 수정 이라고 합니다 . 불행히도 이것은 내 경우에는 효과가 없지만 다른 사람들에게는 유용한 솔루션 일 수 있습니다.
Patrick Kenny

1

이 질문에 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

필드 그룹 모듈을 사용하여 필드를 약간 정리할 수 있어야한다고 생각합니다 ( 예 : 필드를 다른 탭에 배치). 한 탭 아래의 공통 탭과 다른 탭 아래의 공통 탭


이 아이디어에 감사하지만 이미 필드 그룹 모듈을 사용하고 있습니다. 그것은 좋지만 실제로 모든 것이 아니라 사용자에게 네 가지 옵션을 보여주고 싶습니다.
Patrick Kenny

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.