Làm thế nào để có được danh sách sửa đổi của một nút và xóa tất cả chúng?


7

Sửa đổi và làm thế nào để xóa tất cả. Đối với Drupal 7, có rất nhiều mô-đun thực hiện điều đó hoặc thậm chí giới hạn các phiên bản được giữ hoặc thậm chí xóa mọi thứ cũ hơn x-ngày, nhưng không dành cho Drupal 8.

Dường như không có gì ngoài đó. Tìm kiếm thông qua cơ sở dữ liệu là điều tôi không muốn làm.

Có ý kiến ​​gì không?


bạn đã có một số tiến bộ?
Adrian Cid Almaguer

Câu trả lời:


8

Vâng, như bạn nói có một danh sách các mô-đun có thể làm điều này trong Drupal 7 như:

Xóa nút sửa đổi

Mô-đun Node Revision Delete cho phép bạn theo dõi và cắt xén các bản sửa đổi cũ của các loại nội dung. Xác định số lượng sửa đổi tối đa để giữ cho mỗi loại nội dung. Chạy trên Drush, cron run hoặc vào một khoảng thời gian khác (hàng ngày, hàng tuần, v.v.).

Hạn chế sửa đổi nút

Mô-đun giới hạn sửa đổi nút cho phép bạn hạn chế sửa đổi nút cho từng loại nội dung. Mô-đun này có giao diện quản trị để chỉ định ngưỡng sửa đổi nút cho từng loại nội dung có sẵn. Cài đặt có thể bao gồm loại nút có giới hạn sửa đổi tương ứng, được cung cấp trên biểu mẫu cấu hình Hạn chế sửa đổi nút. Lưu ý rằng mô-đun này không và không thể xóa các phiên bản hiện tại của một nút.

Dọn dẹp sửa đổi nút

Node Revision Cleanup được thiết kế cho các cơ sở dữ liệu thực sự lớn. Và quản trị viên trang web thoải mái với Drush. Khái niệm đằng sau mô-đun này là có thể chạy nhiều yêu cầu cùng một lúc, thông qua Drush để tối đa hóa số lần xóa sửa đổi nút mỗi giây.

Xóa sửa đổi

Mô-đun này cho phép khả năng xóa hàng loạt các sửa đổi nút cũ. Các cài đặt có thể bao gồm loại nút, tuổi sửa đổi nút trước khi bị xóa, cùng với cài đặt tần số Cron. Các sửa đổi có thể bị xóa sau khi xem xét trên một trang quản trị. Mô-đun này KHÔNG BAO GIỜ xóa bản sửa đổi hiện tại của một nút, và cũng không cho phép bạn làm như vậy.

Và đối với Drupal 8 , hiện tại không có mô-đun để làm điều đó, nhưng bạn có thể sử dụng:

Để có được danh sách sửa đổi của một nút:

$vids = \Drupal::entityManager()->getStorage('node')->revisionIds($node);

Xem các nút bây giờ có bộ điều khiển lưu trữ; đã loại bỏ nút numvision_list ().

Để xóa bản sửa đổi sửa đổi, bạn có thể sử dụng hàm node_Vvision_delete () , nhưng cuối cùng, hãy xem mã chức năng:

function node_revision_delete($revision_id) {
  \Drupal::entityTypeManager()->getStorage('node')->deleteRevision($revision_id);
}

Vì vậy, sẽ tốt hơn nếu bạn chỉ sử dụng:

\Drupal::entityTypeManager()->getStorage('node')->deleteRevision($revision_id);


Để có được danh sách sửa đổi, có một sự thay thế cho entityManager? Tôi nghĩ rằng nó không được chấp nhận.
The Dev Dev

1
@KimberlyW Chỉ cần thay đổi entityTypeManager () cho entityManager () và sẽ hoạt động.
Adrian Cid Almaguer

1
Bạn có thể tìm thấy sửa đổi nội dung trong khi tạo một chế độ xem mới. Và bạn có thể có tùy chọn để xóa liên kết sửa đổi ở đó.
Vishal Kumar Sahu

Tương tự cho câu trả lời này: entityTypeManager () -> getStorage () trả về EntityStorageInterface. Nó không có phương thức "revisionIds". Bạn phải tiêm NodeStorageInterface một cách rõ ràng để có phương thức.
ssibal


2

Đoạn trích để xóa tất cả trừ phiên bản mới nhất của một nút cụ thể:

<?php
  try {
    $nid = 123; // Your node id
    $vids = \Drupal::entityManager()->getStorage('node')->revisionIds(node_load($nid));
    foreach($vids as $vid){        
      \Drupal::entityTypeManager()->getStorage('node')->deleteRevision($vid);
    }
  } catch (Exception $e) {
    // Latest revision will not be deleted but throws an error
    return $e->getMessage();
  }
?>

1
Thomas rực rỡ. Tôi thấy đây là một lựa chọn tốt hơn khi thấy rằng không có mô-đun nào trong câu trả lời của Adrian thực sự hoạt động trong D8. Bạn thực sự hoạt động khi được thêm vào tập tin MYTHEME.theme. Bạn có thể thêm một vòng lặp để bắt đầu để nó chạy qua tất cả các nút không? Điều đó sẽ làm cho siêu phẩm này đã đưa một trang web dev vào sản xuất và vứt bỏ tất cả các phiên bản dev để đứng lên và dọn dẹp.
piet

2

Các đề xuất ở đây là chính xác, mặc dù một vài điều đáng được đề cập.

$vids = \Drupal::entityManager()->getStorage('node')->revisionIds(node_load($nid));

Nhưng vì điều này được đánh dấu là không dùng nữa, nên nó được thay thế bằng:

$vids = \Drupal::entityTypeManager()->getStorage('node')->revisionIds($node);

Mã ví dụ ở đây cũng thử xóa bản sửa đổi mặc định và điều đó sẽ gây ra [error] Default revision can not be deleted. Để tránh điều đó, tôi đề nghị bạn nên loại bỏ việc này trong một cái gì đó như:

  // If revision id is not default, remove it.
  if ($vid !== $node->getLoadedRevisionId()) {
    print 'Removing revision ' . $vid . PHP_EOL;
    \Drupal::entityTypeManager()->getStorage('node')->deleteRevision($vid);
  }

Đây là một câu trả lời hoàn toàn sai. entityTypeManager () -> getStorage () trả về EntityStorageInterface. Nó không có phương thức "revisionIds".
ssibal

@ssibal đúng, nhưng vì chúng tôi đang xử lý lưu trữ nút, nên chúng tôi sẽ nhận được NodeStorageInterface.
akalata

2

Có một mô-đun làm việc cho Drupal 8: Node Revutions Autoclean .

Mô-đun này cho phép quản lý cửa hàng sửa đổi của nút: theo cài đặt của quản trị viên, các phiên bản cũ hơn sẽ tự động bị xóa.

Bạn có thể chọn số lần sửa đổi mà bạn muốn giữ cho mỗi loại nút. Dự thảo mới nhất đến sau khi sửa đổi được công bố không bao giờ bị xóa. Bạn cũng có thể chọn xóa bản sửa đổi theo ngày.

Đối với các trang web lớn hơn có nhiều nút, bạn có thể chọn xóa sửa đổi bằng cron hoặc lệnh drush (chỉ drush 9).

Đừng hy vọng nó chạy trên cron chạy bình thường, chưa. Nhưng nó có thể được thiết lập để chạy trên các nút cập nhật. Đây là vấn đề về cron, mà tôi không hiểu đầy đủ: https://www.drupal.org/project/node_Vvutions_autoclean/issues/2958655


1

Vui lòng tiêm luôn một bộ lưu trữ theo cách thích hợp:

  # my_module.services.yml
  node_storage: 
    class: Drupal\node\NodeStorage
    factory: entity_type.manager:getStorage
    arguments: ['node']
  my_service:
    class: Drupal\my_module\MyService
    arguments: ['@node_storage']

Trong trường hợp này, bạn đã có thể có trong hàm tạo của lớp như sau:

class MyService {

  /**
   * @var \Drupal\node\NodeStorageInterface
   */
  private $storage;

  public function __construct(NodeStorageInterface $storage) {
    $this->storage = $storage;
  }

}

Trong trường hợp này, IDE của bạn cũng sẽ dễ dàng liệt kê tất cả các phương thức khả dụng không giống như giải pháp này:

\Drupal::entityManager()->getStorage('node')->revisionIds(node_load($nid));

Hãy nhớ EntityTypeManager trong hầu hết các trường hợp sức mạnh "quá nhiều": chỉ sử dụng nhiều như bạn cần nhưng không nhiều hơn. Cấu hình dịch vụ có thể giúp bạn với điều đó.


Tôi sẽ kiểm tra câu trả lời của bạn, bạn có thể cung cấp một số tài liệu tham khảo về điều này?
Adrian Cid Almaguer

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.