Làm cách nào để ghi đè RenderE bổ sung?


7

Có một Drupal 8 RenderE bổ sung được gọi là HtmlTag, điều khiển cách hiển thị HtmlTags. Tôi muốn ghi đè lên điều này để tôi có thể thay đổi hành vi mặc định của nó.

Tôi có thể viết một lớp mở rộng HtmlTag và ghi đè những gì tôi cần, nhưng sau đó làm thế nào để lõi Drupal và hệ thống chủ đề biết sử dụng lớp mới của tôi?

Ngoài ra, có lẽ tôi nên sử dụng hook_theme_registry_alter()để nói với Drupal 8 sử dụng lớp mới của mình?

Tôi không thực sự chắc chắn về cách tốt nhất để đạt được điều này và dường như không có bất kỳ ví dụ nào về việc này được thực hiện.


Tại sao bạn cố gắng ghi đè phần tử HTML_tag?
Eyal

Có thể ghi đè các phần tử void mặc định @Eyal
Clive

Để chuyển đổi tất cả các thẻ script thành các đường dẫn đơn giản để sử dụng trong một mảng JSON. Điều này được sử dụng trong trình tải tập lệnh dựa trên javascript.
Lomax

Câu trả lời:


6

Sử dụng hook_element_info_alter()sẽ là một lựa chọn, không chắc nó là tốt nhất.

Lớp hiện có đặt 2 cuộc gọi lại kết xuất trước, mà bạn có thể ghi đè trong lớp của riêng mình:

function MYMODULE_element_info_alter(array &$types) {
  $types['html_tag']['#pre_render'] = [
    [\Drupal\mymodule\HtmlTag::class, 'preRenderConditionalComments'],
    [\Drupal\mymodule\HtmlTag::class, 'preRenderHtmlTag'],
  ];
}

...

namespace Drupal\mymodule;

use Drupal\Core\Render\Element\HtmlTag as CoreHtmlTag;

class HtmlTag extends CoreHtmlTag {

  public function preRenderHtmlTag($element) {
    // ...
  }

  public function preRenderConditionalComments($element) {
    // ...
  }

}

Hay đấy. Điều này sẽ dẫn đến các vấn đề nếu nhiều mô-đun đóng góp làm điều này?
Kevin

Sẽ có một cuộc đua @Kevin, yep - nhưng không nhiều hơn so với hook trong các phiên bản trước. Điều đó cũng có thể dự đoán được và chúng tôi vẫn có 'ol tốt hook_module_implements_alterđể thực hiện một lệnh đối với việc triển khai hook nếu điều đó xảy ra
Clive

Tôi nên thêm điều này không đúng vì những lý do khác @Kevin - có khả năng vi phạm DRY rõ ràng nếu OP muốn, chẳng hạn, chỉ ghi đè $voidElementsvar tĩnh - vì toàn bộ lớp cha sử dụng selfthay vì statictham chiếu toàn bộ của preRenderHtmlTagsẽ cần phải sao chép dán trên
Clive

@Clive, có thể ghi đè lên nội dung của $voidElementsnó không, vì nó chỉ được bảo vệ không riêng tư và sau đó gọi $element = parent::preRenderHtmlTag($element);?
4k4

Thật không may, không phải @ 4k4 - nếu lớp cha mẹ đang đề cập đến nó với statictừ khóa thì nó sẽ hoạt động, nhưng với nó, self::$voidElementsnó sẽ luôn đề cập đến biến trong HtmlTag của lõi, chứ không phải lớp mở rộng
Clive

0

Nếu hook_element_info_alter () không đủ cho bạn, thì vấn đề cốt lõi là thêm hook_element_plugin_alter () để thay đổi trực tiếp lớp plugin cho một Element (trong đó RenderElements là một tập hợp con): https://www.drupal.org / dự án / drupal / vấn đề / 2987208

Các miếng vá lõi là một bổ sung một dòng $this->alterInfo('element_plugin');trong ElementInfoManager, trong đó nêu rõ móc alter làm mới này.

Sau đó, trong mô-đun tùy chỉnh của bạn:

function hook_element_plugin_alter(array &$definitions) {
 // Use a custom class for the HtmlTag element.
 $definitions['html_tag']['class'] = '\Drupal\mymodule\RenderElement\MyHtmlTagElement';
}
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.