Có thể tạo một trang web chỉnh sửa tài khoản thứ hai của Cameron chỉ cho phép người dùng chỉnh sửa một số trường hồ sơ?


15

Vì vậy, đây là tình huống của tôi: người dùng trên trang web của tôi phải điền vào một số lượng khá lớn các lĩnh vực khi đăng ký. Tuy nhiên, sau khi họ đăng ký, chỉ có bốn (trong số khoảng hai mươi) trong số các lĩnh vực này cần phải được thay đổi thường xuyên. Tôi muốn tạo một trang "chỉnh sửa" riêng để cho phép người dùng sửa đổi chỉ bốn trường này để đơn giản hóa mọi thứ.

  • trường_checkbox_a
  • trường_checkbox_b
  • trường_checkbox_c
  • trường_checkbox_d

Các trường này đều được chứa trong một nhóm trường, vì vậy lý tưởng là trang sẽ hiển thị nhóm trường này, bốn hộp kiểm bên trong nó và sau đó có nút gửi và hủy, đó là nút đó.

Tôi muốn làm điều này như một trang riêng biệt, không phải chỉnh sửa tại chỗ như Chỉnh sửa nhanh mô-đun .

Người dùng vẫn cần có thể truy cập trang tài khoản chỉnh sửa ban đầu để thay đổi múi giờ, địa chỉ email, v.v. nhưng tôi thực sự có thể sử dụng một màn hình riêng để cho phép họ chỉnh sửa các tùy chọn tài khoản phổ biến nhất.

Câu trả lời:


9

Tôi đã có tình huống tương tự trước đây và xử lý nó với tính năng druapl đầy đủ sức mạnh hook_form_alter , chúng tôi có 2 biểu mẫu cho người dùng, đăng ký và chỉnh sửa người dùng

  • user_profile_form (đang chỉnh sửa)
  • user_register_form (đang đăng ký)

Chúng tôi chỉ cần ẩn các trường được chỉ định của bạn theo cách chỉnh sửa Vì vậy, trong mô-đun tùy chỉnh của bạn

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
        //}
    }

}

Sau khi trường đó tồn tại trong đăng ký như bạn có thể thấy dưới đây

nhập mô tả hình ảnh ở đây

và không tồn tại (ẩn) theo cách chỉnh sửa

nhập mô tả hình ảnh ở đây

Ngoài ra, bạn có thể đặt chúng chỉ đọc thay vì ẩn chúng với$form['field']['#access'] = FALSE;

Và một giải pháp khác là sử dụng mô-đun cấp phép trường

Mô-đun Cấp phép Trường cho phép quản trị viên trang web đặt quyền cấp trường để chỉnh sửa, xem và tạo các trường trên bất kỳ thực thể nào. Đặc trưng:

  • Cho phép trường trên bất kỳ thực thể nào, không chỉ các nút.
  • Quyền của trường dựa trên vai trò cho phép xem khác nhau theo mẫu dựa trên quyền truy cập của người dùng.
  • Quyền cấp độ tác giả cho phép xem và chỉnh sửa các trường dựa trên ai là chủ sở hữu thực thể.
  • Quyền cho từng lĩnh vực không được bật theo mặc định. Thay vào đó, quản trị viên có thể kích hoạt các quyền này một cách rõ ràng cho các trường có tính năng này là cần thiết.

Vì các tính năng mà mô-đun này cung cấp cho chúng tôi người dùng ẩn danh (người dùng chưa đăng ký có thể chỉnh sửa các trường đó và người dùng đăng ký chỉ nhìn thấy (cách đọc chỉ).


7

Thay vì có hai biểu mẫu, bạn có thể sử dụng biểu mẫu mặc định và thêm hộp kiểm "Hiển thị tất cả cài đặt", chẳng hạn như biểu mẫu sau.

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

Sau đó, bạn có thể thay đổi các trường biểu mẫu bạn muốn hiển thị khi hộp kiểm được chọn và bao gồm các thuộc tính sau cho các trường biểu mẫu đó.

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

Theo cách này, người dùng sẽ có thể chuyển đổi giữa một biểu mẫu hiển thị tất cả cài đặt và một biểu mẫu hiển thị một bộ cài đặt tối thiểu mà không cần chuyển từ trang này sang trang khác.

Người giới thiệu


6

Bạn có thể sử dụng mô-đun Profile2 cho điều đó.

  • Tạo một loại hồ sơ hoặc sử dụng hồ sơ chính mặc định.
  • Thêm các trường vào loại hồ sơ đó và đặt chúng để được hiển thị trên mẫu đăng ký.

Vì vậy, các trường đó sẽ có sẵn trên mẫu đăng ký trong số các trường khác từ tài khoản người dùng . Nhưng để chỉnh sửa các trường đó, người dùng nên vào trang chỉnh sửa hồ sơ thay vì trang chỉnh sửa người dùng .


Tôi muốn hiển thị bốn hộp kiểm trên trang chỉnh sửa người dùng và trang tùy chỉnh của riêng họ; Tôi không muốn xóa chúng khỏi trang chỉnh sửa người dùng chính.
Patrick Kenny

2

Hãy thử mô-đun VBO , bạn có thể tạo trang VBO, thêm mối quan hệ USER trong chế độ xem, thêm các trường có sẵn cho người dùng để sửa đổi, đặt Quyền. Đảm bảo bạn chỉ chọn nội dung "thuộc về" người dùng HIỆN TẠI (thông qua Bộ lọc ngữ cảnh)


Làm cách nào tôi có thể cho phép người dùng chỉnh sửa các trường này? VBO cho phép tôi hiển thị các giá trị, nhưng tôi cần chúng có thể chỉnh sửa được.
Patrick Kenny

Thêm trường vbo sau đó đánh dấu vào hoạt động 'sửa đổi giá trị thực thể' (đại loại như thế này, không thể nhớ chính xác nó được gọi là gì)
gilzero

Cảm ơn, nó được gọi là sửa đổi giá trị thực thể . Thật không may, điều này không hiệu quả với trường hợp của tôi, nhưng nó có thể là một giải pháp hữu ích cho những người khác.
Patrick Kenny

2

Dựa trên câu trả lời của zhilevan cho câu hỏi này và câu hỏi nàycuộc thảo luận này trên drupal.org , đây là mã thực tế phù hợp với tôi:

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');
  }
}

Tôi có thể hỏi tại sao Profile2 không phải là một lựa chọn, như tôi đã đề xuất trong câu trả lời của mình không?
ЕЕннн

0

Tôi nghĩ rằng bạn sẽ có thể thu dọn mọi thứ một chút với mô-đun nhóm Trường , ví dụ: đặt các trường dưới các tab khác nhau. Những cái phổ biến dưới một tab và phần còn lại dưới một tab khác.


Cảm ơn ý tưởng này, nhưng tôi đã sử dụng mô-đun Field Group. Điều đó tốt nhưng tôi thực sự chỉ muốn hiển thị bốn tùy chọn cho người dùng, không phải tất cả mọi thứ.
Patrick Kenny

0

thử mã này và ẩn các lĩnh vực khác bạn không muốn hiển thị.

<?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));
?>
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.