Điểm:1

Cách ngăn thay đổi chủ đề do $rendererService->renderPlain() gây ra

lá cờ ru

Tôi đang cố gắng sử dụng lại đầu ra từ một trình định dạng trường được tùy chỉnh nhiều như <select><option> văn bản trong một Webform. Tôi đã quản lý để sử dụng lại hiển thị trường, nhưng nó có tác dụng phụ là chuyển đổi chủ đề được sử dụng để hiển thị.

Dưới đây là một mã đơn giản hóa, các dòng $dateRenderArray = ...$dateHtml = ... là bản gốc và gây ra vấn đề:

function mymodule_webform_options_alter(mảng &$options, mảng &$element, $options_id = NULL) {
  foreach ($options as $value => $text) {
    $entity = getEntityByOption($value);

    // sử dụng lại đầu ra của trình định dạng trường tùy chỉnh
    $dateRenderArray = $entity->get('field_daterange')->view('teaser');

    // dòng sau gây ra sự thay đổi chủ đề
    $dateHtml = \Drupal::service('renderer')->renderPlain($dateRenderArray);

    $datePlaintext = str_replace(["\n", " "], ["", " "], trim(strip_tags($dateHtml)));
    $muchBetterOptionText = $someOtherPlaintextFromEntity . ' ' . $datePlaintext;
    $options[$value] = $muchBetterOptionText;
  }
}

Điều này hoạt động xuất sắc trong biểu mẫu giao diện người dùng, cho các email gửi và cả trong danh sách gửi biểu mẫu web của quản trị viên.

Nhưng trong một chế độ xem chi tiết gửi biểu mẫu web, những dòng đó gây ra thay đổi chủ đề không mong muốn từ chủ đề quản trị viên sang chủ đề giao diện người dùng.

Câu hỏi:
Làm cách nào tôi có thể ngăn thay đổi chủ đề từ kết xuấtPlain() và giữ chủ đề quản trị viên khi xem một lần gửi biểu mẫu web?

Câu hỏi tiền thưởng tùy chọn:
Tại sao hook của tôi hoạt động chính xác trong danh sách gửi biểu mẫu web chứ không phải trong chế độ xem chi tiết gửi biểu mẫu web? Danh sách gửi sử dụng chính xác cùng một chức năng, nó hiển thị cùng một văn bản tùy chọn được xử lý trong cột tương ứng, nhưng tôi thực sự ở bên trong chủ đề quản trị khi xem danh sách. Nhưng chỉ trong chế độ xem chi tiết mới chuyển sang chủ đề giao diện người dùng.

4uk4 avatar
lá cờ cn
Thông thường không có chuyển đổi chủ đề trong một yêu cầu. Chủ đề được đàm phán trên toàn cầu cho toàn bộ yêu cầu. Tôi đoán sẽ có hai yêu cầu, một yêu cầu hiển thị nội dung và một yêu cầu gọi hook. Bạn có thể kiểm tra tên tuyến đường cho cả hai không? Nếu bạn có hai tuyến đường khác nhau thì hãy kiểm tra từng yêu cầu để thương lượng chủ đề quản trị viên. Nếu cần thiết, hãy triển khai trình giải mã của riêng bạn cho yêu cầu thứ hai. Xem https://drupal.stackexchange.com/questions/281447/themenegotiator-not-working-for-admin-pages
Điểm:1
lá cờ ru

Phát hiện ra rằng có một số logic rất cụ thể liên quan đến Biểu mẫu web (@see Thực thể WebformSubmission sử dụng một chủ đề tùy chỉnh và kết xuất logic).

Kết xuất tùy chỉnh của tôi làm logic của biểu mẫu web khó hiểu. Tôi đã chuyển sang trình kết xuất riêng của Webform và thực thi chủ đề quản trị viên sau khi kết xuất tùy chỉnh của mình.

function mymodule_webform_options_alter(mảng &$options, mảng &$element, $options_id = NULL) {
  // dịch vụ kết xuất riêng của webform
  $webformRenderer = \Drupal::service('webform.theme_manager');

  foreach ($options as $value => $text) {
    $entity = getEntityByOption($value);

    // sử dụng lại đầu ra của trình định dạng trường tùy chỉnh
    $dateRenderArray = $entity->get('field_daterange')->view('teaser');

    // dòng sau gây ra thay đổi chủ đề trên tuyến đường entity.webform_submission.canonical
    $dateHtml = $webformRenderer->renderPlain($dateRenderArray);

    $datePlaintext = str_replace(["\n", " "], ["", " "], trim(strip_tags($dateHtml)));
    $muchBetterOptionText = $someOtherPlaintextFromEntity . ' ' . $datePlaintext;
    $options[$value] = $muchBetterOptionText;
  }

  //tên tuyến đường là null, phải sử dụng yêu cầu thay thế
  if (strpos(\Drupal::request()->getRequestUri(), '/admin/struct/webform/manage/MY_WEBFORM_ID/submission/') === 0) {
    //chỉ quản trị viên mới có thể xem các lần gửi biểu mẫu web
    $webformRenderer->setCurrentTheme(\Drupal::config('system.theme')->get('admin'));
  }
}

Trông hơi hacky, nhưng nó thực hiện được mẹo.

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