Điểm:0

Cách mở rộng lớp khối lõi SystemBrandingBlock

lá cờ ph

Vui lòng tư vấn cách chúng tôi có thể mở rộng lớp khối lõi Drupal\system\Plugin\Block\SystemBrandingBlock để thêm phương thức tùy chỉnh.

Trong trường hợp của tôi, tôi muốn bao gồm hàm buildToArray() để lấy dữ liệu khối ở định dạng mảng thay vì mảng được hiển thị.

Phương thức build() hiện có:

xây dựng chức năng công cộng () {
    $xây dựng = [];
    $site_config = $this->configFactory->get('system.site');

    $build['site_logo'] = [
      '#theme' => 'hình ảnh',
      '#uri' => theme_get_setting('logo.url'),
      '#alt' => $this->t('Trang chủ'),
      '#access' => $this->configuration['use_site_logo'],
    ];

    $build['site_name'] = [
      '#markup' => $site_config->get('tên'),
      '#access' => $this->configuration['use_site_name'],
    ];

    $build['site_slogan'] = [
      '#markup' => $site_config->get('khẩu hiệu'),
      '#access' => $this->configuration['use_site_slogan'],
    ];

    trả lại bản dựng $;
}

Phương pháp bắt buộc để thêm:

chức năng công cộng buildToArray() {
    $site_config = $this->configFactory->get('system.site');

    trở lại [
      'site_logo' => theme_get_setting('logo.url'),
      'site_name' => $site_config->get('name'),
      'site_slogan' => $this->configuration['use_site_slogan'],
    ];
}
lá cờ in
Xin chào và chào mừng bạn đến với Câu trả lời của Drupal! Bạn có thể vui lòng mô tả những gì bạn đã thử, những gì không hoạt động và đăng bất kỳ mã nào có liên quan không?
lá cờ ph
@Beau Cảm ơn bạn đã bình luận. Tôi đã cập nhật câu hỏi để cụ thể hơn.
Điểm:0
lá cờ in

Mở rộng một khối

Để mở rộng khối, bạn sẽ xác định một khối mới, như được mô tả trong hướng dẫn sau, ngoại trừ việc bạn sẽ mở rộng lớp Drupal\system\Plugin\Block\SystemBrandingBlock, thay vì lớp Drupal\Core\Block\BlockBase. Sau đó, bạn có thể thêm phương thức tùy chỉnh của mình vào khối mới được xác định.

https://www.valuebound.com/resources/blog/drupal-8-how-to-create-a-custom-block-programatally

xem xét thay thế

Nếu những gì bạn cần từ Hệ Thống Xây Dựng Thương HiệuKhối chỉ là dữ liệuvà không nhất thiết là một khối thực tế, thay vào đó tôi khuyên bạn nên xác định một dịch vụ cung cấp dữ liệu từ bạn buildToArray() phương pháp.

phản hồi bình luận

Đúng là điều này sẽ tạo ra một loại khối mới, ngoài Hệ Thống Xây Dựng Thương HiệuKhối. Các khối được quản lý, sắp xếp và truy xuất bởi Chặn trình quản lý plugin. Bạn có thể viết một trình trang trí cho dịch vụ này và ghi đè lên getDefinition() phương pháp để ngăn chặn các bản gốc Hệ Thống Xây Dựng Thương HiệuKhối không có sẵn dưới dạng định nghĩa plugin, đạt được hiệu quả thay thế bản gốc Hệ Thống Xây Dựng Thương HiệuKhối với khối mới của bạn.

Đối với tôi, nó vẫn giống như một dịch vụ là những gì bạn cần. Bằng cách kiểm tra mã trong bản gốc Hệ Thống Xây Dựng Thương HiệuKhối định nghĩa lớp, chúng ta thấy rằng Hệ Thống Xây Dựng Thương HiệuKhối chỉ dựa vào một dịch vụ, config.factory. Vì vậy, dịch vụ của bạn chỉ cần tiêm config.factory dịch vụ để lấy thông tin mà bạn cần cho buildToArray() phương pháp (có thể được đổi tên tốt hơn thành một cái gì đó như getBrandingInfo()). Xác định một dịch vụ theo cách này có nghĩa là bạn sẽ không cần phải lo lắng về việc triển khai hoặc triển khai một khối (dù sao thì đây dường như không phải là thứ bạn cần) hoặc cần phải viết một trình trang trí dịch vụ.

Cũng xin lưu ý rằng SystemBrandingBlock không phải là nguồn gốc của dữ liệu, mà là một plugin để hiển thị những dữ liệu đó ở định dạng được hiển thị. Khối hoàn toàn không liên quan nếu tất cả những gì bạn muốn là dữ liệu.

Cuối cùng, nói một cách rộng hơn, Drupal được tổ chức chủ yếu xoay quanh các plugin, dịch vụ và nội xạ phụ thuộc và việc làm quen với các khái niệm này sẽ cung cấp cho bạn các công cụ để giải quyết nhiều vấn đề trong Drupal một cách có hệ thống.

lá cờ ph
Cám ơn bạn đã đóng góp ý kiến.
lá cờ ph
Tôi muốn mở rộng tất cả các khối có sẵn. Cách tiếp cận đầu tiên "Mở rộng khối" dẫn đến sao chép khối. Cách tiếp cận thứ hai "Từ dịch vụ" Tôi không thể truy cập các thuộc tính được bảo vệ của khối nên tôi phải triển khai logic khối đó trong dịch vụ.
lá cờ ph
bạn trả lời đã cho tôi một quan điểm khác. Cảm ơn
lá cờ ph
Theo như tôi hiểu, chúng ta có thể ghi đè các khối bằng hook_block_alter và trình trang trí plugin. Tôi rõ ràng về cái móc. Bạn có thể vui lòng đưa ra một ví dụ về trình trang trí plugin cho khối không. Nó sẽ giúp ích cho nhiều người vì không có tài liệu thích hợp về trình trang trí plugin.
lá cờ in
Trong Drupal, tất cả các loại plugin được quản lý bởi trình quản lý plugin, đây là một dịch vụ. Trình trang trí plugin thực sự là trình trang trí dịch vụ cho trình quản lý plugin. Đây là một hướng dẫn tuyệt vời về trình trang trí dịch vụ Drupal 8: https://www.phase2technology.com/blog/using-symfony-service-decorators-drupal-8. Trong trường hợp của bạn, bạn sẽ muốn trang trí dịch vụ có ID là `plugin.manager.block`. Nhưng tôi vẫn cảm thấy rằng một dịch vụ tùy chỉnh của riêng bạn là những gì bạn thực sự cần và sẽ yêu cầu ít công việc hơn.
lá cờ ph
Cảm ơn bạn @Beau
Điểm:0
lá cờ gb

Nếu bạn đang sử dụng Drupal 9 và không muốn tạo bản sao khối thì đây là cách đơn giản nhất để ghi đè lớp khối: Để ghi đè lớp Khối, bạn có thể sử dụng hook_block_alter như thế này.

/**
 * Triển khai hook_block_alter().
 */
function [MODULE]_block_alter(&$definitions) {
  foreach ($định nghĩa là $id => $definition) {
    // Kiểm tra Id plugin của bạn tại đây.
    if ($id === 'system_branding_block') {
      // Đặt lớp mới của bạn ở đây.
      $definitions[$id]['class'] = 'Drupal\MODULE\Plugin\Block\SystemBrandingBlockAlter';
    }
  }
}

Và sau đó tạo lớp mới của bạn Xây dựng thương hiệu hệ thốngKhốiAlter Trong MÔ-ĐUN/src/Plugin/Khối như thế này:

<?php

không gian tên Drupal\MODULE\Plugin\Block;

sử dụng Drupal\system\Plugin\Block\SystemBrandingBlock;

lớp SystemBrandingBlockAlter extends SystemBrandingBlock {
  
  xây dựng chức năng công cộng () {
    $site_config = $this->configFactory->get('system.site');
    trở lại [
      'site_logo' => theme_get_setting('logo.url'),
      'site_name' => $site_config->get('name'),
      'site_slogan' => $this->configuration['use_site_slogan'],
    ];
  }
  
}

Bây giờ lớp chịu trách nhiệm cho khối của bạn là Drupal\MODULE\Plugin\Block\SystemBrandingBlockAlter và không Drupal\system\Plugin\Block\SystemBrandingBlock

lá cờ ph
Cảm ơn bạn rất nhiều. Đây chính xác là những gì tôi đang tìm kiếm.
lá cờ ph
Trong mảng định nghĩa, chúng ta có thể thấy 'nhà cung cấp' => 'hệ thống' nhưng chúng ta sẽ ghi đè lớp khối từ mô-đun tùy chỉnh của mình. Nó sẽ làm cho bất kỳ tác động?
berramou avatar
lá cờ gb
nếu bạn kiểm tra `'provider' == 'system'` bạn sẽ ghi đè lên tất cả các loại khối được tạo bởi mô-đun hệ thống chứ không chỉ SystemBrandingBlock

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