Làm thế nào để xóa một loại nội dung, lập trình?


12

Tôi lập trình tạo một loại nội dung trong khi cài đặt mô-đun (sử dụng cấu hình lưu trữ trường).

Tôi muốn xóa loại nội dung đó trong khi gỡ cài đặt mô-đun.

Có cách nào để làm điều này với Drupal 8 không?

Câu trả lời:


14

Chỉ cần đảm bảo rằng loại nút phụ thuộc vào mô-đun của bạn, sau đó Drupal sẽ tự động xóa nó cho bạn.

Xem node.type.book.yml trong mô-đun sách để biết ví dụ, đây là phần có liên quan:

dependencies:
  enforced:
    module:
      - book

Lưu ý rằng người dùng sẽ phải xóa tất cả nội dung của loại đó trước khi họ có thể gỡ cài đặt mô-đun.


9

Điều này dường như để làm điều đó cho tôi.

$content_type = \Drupal::entityManager()->getStorage('node_type')->load('MACHINE_NAME_OF_TYPE');
$content_type->delete();

Một CLI một lớp lót này sử dụng Bảng điều khiển Drupal với drupal snippet --code='$content_type = \Drupal::entityManager()->getStorage("node_type")->load("MACHINE_NAME_OF_TYPE"); $content_type->delete();'
lối

5

Không có đủ tín dụng để bình luận, tôi sẽ đặt nó ở đây:

@Berdir, đối với tôi, việc thực thi mô-đun trong tệp node.type.custom.yml là không đủ để thực thi việc xóa các nút khi gỡ cài đặt

Lưu ý rằng người dùng sẽ phải xóa tất cả nội dung của loại đó trước khi họ có thể gỡ cài đặt mô-đun sau đó

Trong trường hợp của tôi, loại nội dung bị xóa khi gỡ cài đặt mô-đun. Nhưng việc xóa nội dung tùy chỉnh (các nút) không được thực thi. Để đạt được điều này, mô-đun tùy chỉnh nên thực hiện ModuleUninstallValidatorInterface.

Khi thực hiện mô-đun tùy chỉnh không thể được gỡ cài đặt trước khi các nút tùy chỉnh bị xóa. Hộp chọn sẽ được hủy kích hoạt.

Thay vì thực hiện Giao diện tôi đang làm bẩn nó bằng cách xóa các nút trong hook_uninstall():

function MYMODULE_uninstall() {

  // Delete custom_type nodes when uninstalling.
  $query = \Drupal::entityQuery('node')
    ->condition('type', 'custom_type');
  $nids = $query->execute();
  // debug($nids);
  foreach ($nids as $nid) {
    \Drupal\node\Entity\Node::load($nid)->delete();
  }
}

3

Để kích hoạt một số hành động khi gỡ cài đặt mô-đun, bạn phải thực hiện hook_uninstalltrong *.installtệp của mô-đun . Trước khi xóa loại nội dung, bạn có thể muốn đảm bảo tất cả các nút của loại nội dung đó cũng bị xóa. Cuối cùng, sau khi gỡ cài đặt mô-đun và xóa loại nội dung, đừng quên xuất cấu hình đã cập nhật.

/**
 * Place a short description here. 
 */
function MYMODULE_uninstall() {

  // Delete all nodes of given content type.
  $storage_handler = \Drupal::entityTypeManager()
    ->getStorage('node');
  $nodes = $storage_handler->loadByProperties(['type' => 'MACHINE_NAME_OF_TYPE']);
  $storage_handler->delete($nodes);

  // Delete content type.
  $content_type = \Drupal::entityTypeManager()
    ->getStorage('node_type')
    ->load('MACHINE_NAME_OF_TYPE');
  $content_type->delete();
}

Điều này sẽ xóa bất kỳ bundlecủa MACHINE_NAME_OF_TYPE, giống như truy vấn node-id câu trả lời dựa trên không, hay không? Ý tôi là, điều đó có vẻ hơi tốn kém (nếu có nhiều NID) và tôi muốn sử dụng giải pháp này khi có thể.
Top-Master

1
@ Top-Master - Tôi đã cập nhật câu trả lời của mình. Nó cần thêm một bước để xóa tất cả các nút đầu tiên.
leymannx
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.