Cách tạo trường chỉ đọc bằng hook_form_alter


12

Tôi đang cố gắng tạo một số trường mẫu hồ sơ Drupal dưới dạng chỉ đọc trong chế độ chỉnh sửa. Tôi đang sử dụng đoạn mã sau trong hook_alter

$form[field_organisation_company_name][und][0]['#after_build'][]='_build_element_readonly';

function _build_element_readonly($element, &$form_state) {  
    $element['value']['#attributes']['readonly'] = 'readonly';
    return $element;
}

Trong giao diện người dùng được hiển thị dưới dạng chỉ đọc, nhưng vẫn có thể thay đổi giá trị bằng cách sử dụng fireorms và lưu. Có cách nào để ngăn chặn hành vi này?

Câu trả lời:


6

Có vẻ như bạn có thể thực hiện những gì bạn cần với Quyền hạn Trường . Trên cơ sở từng trường, bạn có thể đặt quyền thành:

  • Tạo giá trị riêng cho trường
  • Chỉnh sửa giá trị riêng cho trường
  • Chỉnh sửa giá trị của bất kỳ ai cho trường
  • Xem giá trị riêng cho trường
  • Xem giá trị của bất cứ ai cho lĩnh vực này

Vì vậy, bạn sẽ dễ dàng có thể cho phép người dùng của mình tạo giá trị cho trường ban đầu, nhưng ngay khi họ có nó chỉ có thể chỉnh sửa bởi quản trị viên.


+1. Vì OP muốn cho phép quản trị viên chỉnh sửa giá trị, field_permissionssẽ dễ dàng hơn thực hiện công việc theo cách bẩn thỉu.
AyeshK

Vâng, đây là một câu trả lời tốt hơn nhiều so với của tôi :)
Alfred Armstrong

6

Khi bạn đặt trường dưới dạng readonly, trình duyệt sẽ khóa trường và gửi dữ liệu trở lại máy chủ khi gửi. Thuộc tính khác là disabledkhóa trường và không gửi dữ liệu trở lại máy chủ.

Đối với cả hai trường hợp, bạn có thể mạnh mẽ đặt giá trị là như nhau sau khi gửi. Vì vậy, ngay cả khi trường được đặt thành readonlyhoặc disabled, và người dùng đã sửa đổi HTML và gửi dữ liệu khác nhau, $form_state['values']sẽ vẫn không thay đổi.

function _build_element_readonly($element, &$form_state) {  
    $element['value']['#attributes']['readonly'] = 'readonly';
    $element['value']['#value'] = isset($element['value']['#default_value']) 
       ?  $element['value']['#default_value']
       :  ''; 
    return $element;
}

Lưu ý rằng chúng tôi đặt #value từ #default_value. #default_value là cách thông thường để đặt giá trị mặc định tải lên khi biểu mẫu được tạo và $form_state['values']sẽ chứa default_value hoặc đầu vào của người dùng. Khi bạn đặt #valuerõ ràng, đầu vào của người dùng sẽ bị bỏ qua và #valuesẽ được sử dụng.

Dù sao, tôi khuyên bạn nên sử dụng '#access' => FALSE,khi ẩn các phần tử biểu mẫu. Nó sẽ loại bỏ hoàn toàn phần tử, đồng thời cho phép bạn sử dụng các giá trị của nó.


1

Bạn không thể ngăn Firebird thay đổi các trường chỉ đọc. Nhưng nếu trường văn bản chỉ đọc, mục đích duy nhất là hiển thị dữ liệu. Vậy tại sao không thay đổi thành phần đầu vào so với thành phần văn bản?

Thay vào đó, bạn có thể sử dụng thuộc tính "bị vô hiệu hóa" vì các trường đầu vào bị vô hiệu hóa không được gửi đến máy chủ.

Bạn cũng có thể xóa thuộc tính "bị vô hiệu hóa" với fireorms, nhưng lõi drupal không phản ứng với những thay đổi của các trường đầu vào bị vô hiệu hóa!


Cảm ơn larrydahooster đã giúp đỡ. Yêu cầu của tôi là một cái gì đó như khóa một số trường được điền bởi người dùng tại thời điểm đăng ký. Mặc dù trên chế độ chỉnh sửa hồ sơ muốn hiển thị thông tin này cho người dùng, nhưng muốn ngăn người dùng cập nhật các trường này. Chỉ siêu người dùng mới có thể chỉnh sửa các trường này
Jayesh Jose

1

Cách an toàn nhất để làm điều này là thay đổi loại trường thành 'mục'. http://api.drupal.org/api/drupal/developer!topics!forms_api_Vference.html/7#item


Sử dụng thuộc tính #disables tôi giải quyết vấn đề. Trong trường hợp của tôi, chỉ một số người dùng có thể chỉnh sửa trường, trong khi những người khác chỉ có thể xem trường. Tôi đã viết một logic dựa trên vai trò người dùng và giải quyết vấn đề. Cảm ơn tất cả các bạn
Jayesh Jose

1

Bạn có thể sử dụng Quyền trường + Chỉ đọc trường .

Quyền của trường sẽ cho phép bạn làm cho một số trường của bạn không thể truy cập được đối với một số người dùng nhất định.

Trường Readonly sẽ cho phép bạn hiển thị các trường không thể truy cập dưới dạng các mục chỉ đọc trên các biểu mẫu chỉnh sửa (thay vì ẩn chúng).


1

Tôi nghĩ rằng sử dụng #disabled = true;là cách dễ nhất để đạt được điều này thay vì thêm một số mô-đun nặng vào lõi của bạn, như một ví dụ tôi vô hiệu hóa chỉnh sửa trường hình ảnh tùy chỉnh trong user_profile_form khi nó được người dùng điền vào trước đó.

function MY_CUSTOM_MODULE_form_alter(&$form, $form_state, $form_id){

        if($form_id == 'user_profile_form'){
            if($form['field_national_front']['und'][0]['#default_value']['fid']){
                $form['field_national_front']['und']['#disabled'] = true;
             }
          //ym($form);
        }
}

Ngoài ra, bạn có thể kiểm tra vai trò của người dùng và chỉ vô hiệu hóa (trường chỉ đọc) cho người dùng không phải là quản trị viên.

    function MY_CUSTOM_MODULE_form_alter(&$form, $form_state, $form_id){
       global $user;
       if($form_id == 'user_profile_form'){
           if($form['field_national_front']['und'][0]['#default_value']['fid'] && !in_array('webadmin', $user->roles)){
              $form['field_national_front']['und']['#disabled'] = true;
         }
//ym($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.