Làm thế nào để tôi lập trình đặt một khối?


10

Từ UI bạn có thể thêm một khối trong một khu vực theo cách đó:

  1. Chuyển đến Quản trị viên -> Cấu trúc -> Bố cục khối (/ admin / cấu trúc / khối).
  2. Nhấp vào nút "Đặt khối" bên cạnh tên khu vực.

Tôi muốn làm điều tương tự nhưng lập trình. Làm cách nào để thêm một khối hiện có vào một khu vực và lưu nó? Khối này sau đó sẽ được hiển thị trong khu vực đó và có sẵn trong trang Bố cục khối .


Sau khi tạo khối, bạn có thể sắp xếp lại vị trí của khối từ: site_name / admin / architecture / block
Crazyrubixfan

Tôi giả sử bạn đã nhầm "gán một khối cho một khu vực".
cilefen

@IcecreamJelly những gì tôi đang cố gắng làm điều đó để làm điều này theo chương trình. cilefen, vâng đó là ý tôi% -)
jmzea

@ShawnConn cảm ơn, điều đó tương tự, nhưng không hoàn toàn giống nhau. Tôi đã tìm thấy câu trả lời ở một nơi khác.
jmzea

Câu trả lời:


9

Để cung cấp một khối plugin, bạn có thể xây dựng một loạt các cài đặt và chuyển nó đi \Drupal\block\Entity\Block::create()để tạo đối tượng Chặn và lưu thể hiện.

Ví dụ: nếu bạn muốn thêm một khối PHP Thực thi Devel vào chủ đề Bảy:

$values = array(
  // A unique ID for the block instance.
  'id' => 'devel_execute_php_1',
  // The plugin block id as defined in the class.
  'plugin' => 'devel_execute_php',
  // The machine name of the theme region.
  'region' => 'content',
  'settings' => array(
    'label' => 'Execute PHP',
  ),
  // The machine name of the theme.  
  'theme' => 'seven',
  'visibility' => array(),
  'weight' => 100,
);
$block = \Drupal\block\Entity\Block::create($values);
$block->save();

Xin chào, tôi cần giúp đỡ. Tôi đã tạo một khối tùy chỉnh bằng UI và muốn đặt ở khu vực chân trang theo chương trình cho mục đích thử nghiệm. Tôi không biết cách tải plugin từ các khối tùy chỉnh được tạo bởi UI .. cảm ơn
Mudassar Ali

Hỏi điều này như một câu hỏi khác. Bình luận không phải để đặt câu hỏi.
Shawn Conn


Whats id ở đây? nó có giống như tên khối không?
Crazyrubixfan

@RubberDuckIsKing Tôi tin rằng bạn có thể đặt tên cho idbất cứ điều gì bạn muốn miễn là nó là duy nhất. Ví dụ: bạn có thể muốn bắt đầu với tên của mô-đun.
Parag

7

Bạn ca sử dụng mô-đun Twig :

Mô-đun Twig Tweak cung cấp tiện ích mở rộng Twig với một số chức năng và bộ lọc hữu ích có thể cải thiện trải nghiệm của nhà phát triển.

Và sau đó trên khu vực mẫu twig của bạn:

{{ drupal_block('block_id') }}

Vấn đề với giải pháp này là các chỉnh sửa twig vẫn yêu cầu bạn đặt khối và sau đó 'vô hiệu hóa' nó.
điển

6

Mỗi phiên bản của một khối ("loại khối", cấu hình và vị trí) là một thực thể cấu hình : \Drupal\block\Entity\Block. Vì vậy, tất cả những gì bạn phải làm là tạo một phiên bản mới của thực thể này với các chi tiết chính xác và bạn đã hoàn thành.

Điều này có thể được thực hiện nhưng rất phức tạp, bạn sẽ cần hiểu hệ thống plugin, chặn hệ thống plugin và nhiều hơn nữa.

Bạn có thể xem \Drupal\block\BlockForm::submitFormđể cảm nhận về điều này hoặc \Drupal\simpletest\BlockCreationTrait::placeBlock. Bạn có thể muốn nghĩ xem đây có phải là thứ bạn thực sự cần hay không, tầm nhìn của khối khá phức tạp.


4
Ngoài điều kiện tầm nhìn, tôi không nghĩ nó phức tạp đến thế. \ Drupal \ Simpletest \ BlockCreationTrait :: placeBlock () có lẽ là một ví dụ tốt hơn để xem xét, bạn cũng có thể chỉ cần nhập một số tệp cấu hình đã xuất.
Berdir

@Berdir Cảm ơn liên kết đến đặc điểm kiểm tra, đã thêm nó. Vì Drupal 8 vẫn còn quá trẻ, rất nhiều người không biết nhiều về hệ thống plugin và tài liệu có thể sử dụng nhiều trường hợp sử dụng hơn, điều này có thể khiến nhiều nhà phát triển khó khăn khi làm việc với nó.
googletorp

Felix Eve có câu trả lời tốt nhất. Nó không phải là phức tạp điên rồ.
kratos

@kratos Câu trả lời mà Felix đưa ra không thực sự giải quyết được câu hỏi làm thế nào để đặt một khối "lập trình", mà thay vào đó sử dụng các tệp cấu hình. Cấu hình chỉ có thể được nhập thông qua drush, giao diện đồng bộ hóa cấu hình hoặc cài đặt mô-đun. Nếu nó cần phải xảy ra, trong thời gian chạy, fx lưu một loại nút frontpage phần, v.v., sẽ không có ích khi sử dụng chiến lược này :)
googletorp

4

Tôi mới học D8 nhưng dường như tôi đã tìm thấy một cách dễ dàng hơn để đặt một khối theo lập trình (Có vẻ khá đáng sợ sau khi đọc câu trả lời của googletorp!)

Khi tôi kích hoạt mô-đun tùy chỉnh xác định khối, tôi muốn khối tự động được đặt trong vùng chính xác. Các bước tôi đã sử dụng để đạt được điều này là:

  1. Kích hoạt mô-đun và đặt khối bằng UI tại /admin/structure/block
  2. Chuyển đến trang xuất cấu hình một mặt hàng tại admin/config/development/configuration/single/export
  3. Chọn Khối loại cấu hình và đối với tên Cấu hình, chọn khối mà bạn vừa đặt bằng UI và sau đó sao chép mã được tạo.
  4. Trong mô-đun của bạn tạo thư mục /config/install/
  5. Trong textarea mã được tạo, nó cho bạn biết tên tệp bạn cần sử dụng. Tạo tập tin này trong /config/installthư mục và sao chép mã trong đó.
  6. Bây giờ khi bạn gỡ cài đặt mô-đun của mình và sau đó kích hoạt lại, khối sẽ tự động được đặt.

bạn sẽ không phải xóa UUID để nó hoạt động cho các nhà phát triển hoặc môi trường khác chứ?
powpow12

Đúng - loại bỏ UUID sẽ là một ý tưởng tốt.
Đêm giao thừa

Bạn cũng có thể sử dụng bảng điều khiển Drupal, đảm nhiệm việc tự động hóa một số tác vụ sau: hechoendrupal.gitbooks.io/drupal-console/content/en/commands/iêu
Beau


2

Ví dụ trên là đủ gần nhưng vẫn không đúng. Ý tưởng là bạn phải đưa ra id của chính đối tượng khối (trong trường hợp của tôi là devel_execute_php_1112 (có thể vì tôi đã cố gắng làm cho nó hoạt động 1112 lần, nó sẽ vẫn là bí mật) và sau đó là id khối thực sự được khai báo cho các khối tùy chỉnh trong chú thích) và chủ đề. Sau đó, chỉ cần thiết lập khu vực và bạn là tốt để đi. Tạo một thể hiện của một khối dưới vùng mong muốn.

$blockEntityManager = \Drupal::service('entity.manager')->getStorage('block');
$block = $blockEntityManager->create(
  array(
      'id'=> 'devel_execute_php_1112',
      'plugin' => 'devel_execute_php',
      'theme' => 'seven'
  )
);
$block->setRegion('content');
$block->save();

edit1: Tôi thực sự đã kiểm tra sau bình luận ở trên - và nó đúng. Nó chỉ không rõ ràng rằng id là một cái gì đó mà bạn phải đưa ra. Để chuộc lại nhận xét khập khiễng của tôi, tôi sẽ đăng một giải pháp về cách tạo phiên bản khối của thực thể khối tùy chỉnh:

$blockEntityManager = \Drupal::service('entity.manager')->getStorage('block');
$block = $blockEntityManager->create(
  array(
      'id'=> 'ggggggggsssssss',
      'plugin' => 'block_content:79d53b4e-9e60-4f97-befc-101da919bb7a',
      'theme' => 'visitb_he_theme'
  )
);
$block->setRegion('content');

về cơ bản là giống nhau nhưng đối với một plugin bạn viết block_content: uuid_of_custom_block_entity_instance

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.