Điểm:0

Tiện ích ẩn trường tham chiếu thực thể hoặc chỉnh sửa bị vô hiệu hóa trên biểu mẫu tùy chỉnh

lá cờ in

Tôi có một biểu mẫu tạo nút tùy chỉnh mà tôi đang hiển thị trong móc tiền xử lý chế độ xem. Ở dạng đó, tôi có hai trường tham chiếu thực thể. Tôi đang đặt [#value] và [#default_value] của các trường tham chiếu đó theo chương trình.

Trên biểu mẫu, gửi các giá trị tôi đã đặt được tạo, nhưng chỉ khi người dùng "có thể chỉnh sửa" các trường. Tôi muốn làm cho các trường "bị vô hiệu hóa" và/hoặc "ẩn" khỏi người dùng. Không chỉ bị ẩn bằng CSS mà toàn bộ tiện ích tự động hoàn thành không thể truy cập được. Trường cần được nhập "ẩn".

Làm cách nào tôi có thể tắt tham chiếu thực thể tự động hoàn thành và/hoặc không thể truy cập được đối với người dùng tạo nội dung?

Hay nói cách khác, làm cách nào tôi có thể thêm các giá trị tham chiếu thực thể theo chương trình khi gửi biểu mẫu mà người dùng không thể tương tác với các trường?

Dưới đây là một số điều tôi đã thử nhưng không hoạt động:

  1. $form['field_entity_reference']['#access'] = false; // Đặt #access thành false có vẻ như nó sẽ hoạt động vì các trường biểu mẫu vẫn tồn tại khi gỡ lỗi biểu mẫu $, nhưng nó không hoạt động vì nó ngăn giá trị được gửi.
  2. Thêm ['#attributes']['readonly'], thay đổi ['#type'] thành ẩn hoặc loại tiện ích con khác, thêm ['#attributed']['disabled']. Không có công việc
  3. Thực thể chuẩn bị trước - Điều này không hoạt động trong trường hợp cụ thể này vì một số giá trị không thể được cung cấp bởi mã thông báo

Mã để tham khảo

function <theme>_pre process_views_view_field(&$variables) {
  $view = $variables['view'];
  
  if ($view->id() == '<view>') {
    $field = $variables['field'];

    switch($field->options['id']) {
      trường hợp '<view_field>':
        $node = \Drupal::entityTypeManager()
          ->getStorage('nút')
          ->tạo(['loại' => '<loại_nút>']);
        $form = \Drupal::service('entity.form_builder')->getForm($node, 'secondary');

        // Đặt default_value và giá trị
        $form['field_entity_reference']['widget']['#default_value'] = (int)$cid; // Lưu ý rằng điều này đang sử dụng tiện ích "danh sách chọn" cho trường tham chiếu thực thể
        $form['field_entity_reference']['widget']['#value'] = (int)$cid; // Giống như trên

        // Những thứ không hoạt động. Các giá trị không được gửi trừ khi người dùng có thể chỉnh sửa trường hoặc trường không bị ẩn/tắt
        $form['field_entity_reference']['#access'] = false; // Giá trị không gửi
        $form['field_entity_reference']['widget'][0]['#attributes']['readonly'] = 'chỉ đọc'; // Không làm cho trường chỉ đọc
        $form['field_entity_reference']['widget'][0]['value']['#type'] = 'hidden'; // Có vẻ như tiện ích tự động hoàn thành và tiện ích được chọn không có loại "ẩn"
        $form['field_entity_reference']['widget'][0]['target_id']['#type'] = 'trường văn bản'; // Có vẻ như người ta không thể thay đổi loại thành trường văn bản

        // Thay đổi đầu ra của trường xem thành biểu mẫu
        $variables['output'] = $form;
      nghỉ;
    }
  }
}
Jaypan avatar
lá cờ de
Bạn có ý nghĩa gì với "biểu mẫu tạo nút tùy chỉnh"?
lá cờ cn
Bạn có thể đặt giá trị thực thể theo chương trình trong `hook_entity_presave()` thay vì đặt `#value` trong chính biểu mẫu đó. Bạn có thể sử dụng `hook_entity_presave()` ngay cả khi các trường bị ẩn hoặc người dùng không có quyền truy cập để chỉnh sửa các trường.
Jaypan avatar
lá cờ de
Đặt `#access` thành `FALSE` trên thành phần biểu mẫu và nó sẽ không được gửi tới trình duyệt để kết xuất. Tuy nhiên, giá trị sẽ được xử lý khi biểu mẫu được gửi, do đó, miễn là giá trị được đặt trước trên phần tử trong định nghĩa biểu mẫu hoặc hook form_alter, giá trị có thể được chuyển qua.
Điểm:0
lá cờ in

Kudos to @Patrick Kenny đã đặt tôi trên một con đường khả thi với hook_entity_presave(). Tôi đang đăng bài này dưới dạng "câu trả lời" vì nó cung cấp phương tiện để hoàn thành những gì tôi cần, nhưng tôi vẫn nghĩ rằng trường tham chiếu thực thể D8 đang thiếu loại tiện ích con "ẩn". Có lẽ một cảng của thực thểreference_hidden. Nếu có ai biết cách thực hiện điều đó theo chương trình, vui lòng chia sẻ.

Đây là cách tôi hoàn thành những gì tôi cần.

  1. Tạo trường số nguyên dự phòng trên loại nội dung để giữ giá trị sẽ được áp dụng cho trường tham chiếu thực thể một lần hook_entity_presave() chạy.
  2. Đặt trường số nguyên dư thừa có sẵn trên biểu mẫu, thay đổi loại trường thành ẩn. Bạn có thể dùng trường_ẩn mô-đun cho việc này.
  3. Bên trong chủ đề hook_pre process_views_view_field() hook đặt giá trị của trường dự phòng thành id nút đích (xem mã trong câu hỏi ban đầu để hiểu ý tôi muốn nói ở đây). Lưu ý rằng đây chỉ là ví dụ của tôi vì tôi đang thêm biểu mẫu vào trường cụ thể của hàng dạng xem, nhưng có thể được áp dụng trong các hook khác.
  4. Trong một mô-đun tùy chỉnh, bên trong hook_entity_presave() lấy giá trị trường dự phòng và áp dụng nó vào trường tham chiếu thực thể trước khi lưu (xem mã bên dưới)
function <module>_entity_presave($entity) {
  if ($entity->getEntityType()->id() == 'nút') {
    if ($entity->bundle() == â<content_type>â) {
      // ----- Lấy id thực thể
      $eid = $entity->redundant_field_name->value;
      
      // ----- Đặt trường thực thể target_value
      $entity->normal_entity_reference_field>target_id = $eid;
    }
  }
}

Một lưu ý phụ về móc trong <theme>.theme tập tin

Các hook_form_alter() móc khi ở trong <theme>.theme tập tin không phải lúc nào cũng áp dụng theo cách/thứ tự mà người ta có thể hy vọng.

Ví dụ áp dụng [#ajax] đối với một hành động biểu mẫu không làm cho biểu mẫu đó có khả năng ajax trừ khi hook nằm trong một mô-đun (hook tệp chủ đề sẽ không hoạt động). Có vẻ như điều này là do việc áp dụng cấu hình biểu mẫu cần thiết xảy ra trước khi các móc chủ đề được chạy.

Đă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.