Trong loại Nội dung của tôi, tôi thêm một trường Tham khảo: Người dùng với các giá trị không giới hạn, Phương thức tham chiếu từ chế độ xem của người quản lý người dùng và các hộp kiểm tiện ích.
Về cơ bản, khi người quản lý người dùng chỉnh sửa nút, anh ta chỉ có thể chọn hộp có tên riêng của mình. Các hộp kiểm khác được đặt thành vô hiệu hóa. Nút sẽ được xuất bản nếu tất cả người quản lý chọn hộp.
Tôi đã thử tạo hàm form_alter như bên dưới
function mymodule_form_alter(&$form, FormStateInterface $form_state, $form_id) {
if ($form_id === 'node_request_order_edit_form') {
$field_approved_by = $form['field_approved_by']['widget']['#options'];
foreach($field_approved_by as $key=>$val) {
if($key != \Drupal::currentUser()->id()) {
$form['field_approved_by']['widget']['#options'][$key]['#disabled'] = true;
}
}
}
}
Nhưng tôi đã nhận lỗi
Lỗi: Không thể sử dụng đối tượng kiểu Drupal\Core\Field\FieldFilteredMarkup làm mảng...
Nếu tôi xóa các hộp kiểm bằng cách không đặt,
...
if($key != \Drupal::currentUser()->id()) {
unset($form['field_approved_by']['widget']['#options'][$key]);
}
...
Giá trị bị ghi đè khi người quản lý khác chọn hộp và lưu nút.
Cảm ơn vì bất kì sự giúp đỡ.
CẬP NHẬT 1:
Vì vậy, tôi giải quyết nó bằng cách sử dụng JavaScript để tắt các hộp kiểm này. Dưới đây là các hướng dẫn tham khảo:
Nhưng tôi không biết liệu hiệu suất/độ ổn định tốt hơn hay kém hơn giải pháp được cung cấp từ các câu trả lời.
Về cơ bản, tôi tạo một tệp thư viện JS: spo_core.libraries.yml
request_order_edit:
js:
js/request_order_edit.js: {}
phụ thuộc:
- lõi/jquery
- lõi/jquery.once
- lõi/drupal
- lõi/drupalSettings
Sau đó, trong thư mục JS, tạo tệp: request_order_edit.js
(hàm ($) {
'Sử dụng nghiêm ngặt';
Drupal.behaviors.addLayer = {
đính kèm: chức năng (bối cảnh, cài đặt) {
console.log(drupalSettings.spo_core.current_uid);
$('#edit-field-approved-by input:checkbox').each(function(){
if(this.value != drupalSettings.spo_core.current_uid){
this.disabled = true;
}
});
/*bật hộp kiểm trước khi gửi để hộp kiểm bị tắt có thể đăng giá trị*/
$("form#node-request-order-edit-form").submit(function() {
$('#edit-field-approved-by.form-checkboxes input:checkbox').removeAttr("đã tắt");
});
}
}
})(jQuery);
Sau đó đính kèm nó ở dạng thay đổi như thế này
...
$form['#attached']['library'][] = 'spo_core/request_order_edit';
$form['#attached']['drupalSettings']['spo_core']['current_uid'] = \Drupal::currentUser()->id();
...