Điểm:5

Cách tạo hộp kiểm chỉ đọc/tắt khỏi danh sách tham chiếu thực thể người dùng

lá cờ cn

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();
...
sonfd avatar
lá cờ in
Đây có thể là cơ hội tốt để tạo tiện ích trường tùy chỉnh mở rộng tiện ích hộp kiểm của lõi thay vì sử dụng móc thay đổi biểu mẫu.
lá cờ cn
@sonfd Cảm ơn câu trả lời. Tôi đã cập nhật câu hỏi của mình khi thêm cách giải quyết bằng JavaScript. Nhưng tôi Nhưng tôi không biết liệu hiệu suất/độ ổn định/tiêu chuẩn hóa có so với giải pháp/câu trả lời của bạn hay không. bạn nghĩ sao?
sonfd avatar
lá cờ in
Khi tôi gặp tình huống tương tự (vô hiệu hóa một số hộp kiểm trong phần tử của trường), tôi đã tạo Tiện ích trường mở rộng lõi và sử dụng mô-đun Thuộc tính tùy chọn biểu mẫu để vô hiệu hóa các hộp kiểm. Theo tôi, đó là giải pháp tốt nhất. Với cách tiếp cận javascript của bạn, mặc dù không chắc lắm, ai đó có thể chọn một hộp trước khi hộp đó bị vô hiệu hóa.
Điểm:4
lá cờ in

Theo như tôi biết, lõi Drupal không cung cấp chức năng này ngay lập tức - không có cách nào để thêm các thuộc tính vào các tùy chọn riêng lẻ của một phần tử.

Tuy nhiên, một cách tôi đã thực hiện điều này là với sự giúp đỡ của Thuộc tính tùy chọn biểu mẫu mô-đun.

Mô-đun [Thuộc tính tùy chọn biểu mẫu] thêm khả năng chỉ định các thuộc tính cho các tùy chọn riêng lẻ trên các thành phần API biểu mẫu Drupal của các loại: chọn, hộp kiểm và radio.

Nó khá dễ sử dụng. Từ trang dự án:

Để thêm thuộc tính vào các tùy chọn của thành phần biểu mẫu, hãy thêm khóa #options_attributes vào định nghĩa thành phần biểu mẫu. Giá trị #options_attributes phải là một mảng có các khóa khớp với các khóa trong mảng giá trị #options. Các giá trị trong mảng #options_attributes phải được định dạng giống như mảng #attributes chính.

Ví dụ:

$form['my_field'] = [
  '#options' => [
    '1' => 'Người dùng 1',
    '123' => 'Người dùng 123',
    '456' => 'Người dùng 456',
  ]
  '#options_attributes' => [
    // Tắt tùy chọn này.
    '1' => [
      'bị vô hiệu hóa' => 'bị vô hiệu hóa',
    ],
    // Cho phép tùy chọn này.
    '123' => [],
    // Tắt tùy chọn này.
    '456' => [
      'bị vô hiệu hóa' => 'bị vô hiệu hóa',
    ],
  ],
];

Hoặc xem mô-đun của ĐỌC cho các ví dụ đầy đủ hơn.

Điểm:2
lá cờ cn

Làm cái này:

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'][$key]['#disabled'] = true;
            }
        }
    }
}

Điều quan trọng là khi bạn chỉ định thuộc tính của các tùy chọn, bạn làm việc với phần tử con của 'widget', không phải của '#options'.

lá cờ us
Cảm ơn. Điều này đã thực hiện thủ thuật để vô hiệu hóa hoặc ẩn Vai trò nhóm cho các Thành viên của Nhóm. $form['group_roles']['widget']['role-name']['#disabled'] = true; hoặc $form['group_roles']['widget']['role-name']['#access'] = false;

Đăng câu trả lời

Hầu hết mọi người không hiểu rằng việc đặt nhiều câu hỏi sẽ mở ra cơ hội học hỏi và cải thiện mối quan hệ giữa các cá nhân. Ví dụ, trong các nghiên cứu của Alison, mặc dù mọi người có thể nhớ chính xác có bao nhiêu câu hỏi đã được đặt ra trong các cuộc trò chuyện của họ, nhưng họ không trực giác nhận ra mối liên hệ giữa câu hỏi và sự yêu thích. Qua bốn nghiên cứu, trong đó những người tham gia tự tham gia vào các cuộc trò chuyện hoặc đọc bản ghi lại các cuộc trò chuyện của người khác, mọi người có xu hướng không nhận ra rằng việc đặt câu hỏi sẽ ảnh hưởng—hoặc đã ảnh hưởng—mức độ thân thiện giữa những người đối thoại.