it-swarm.com.de

Löschen Sie einen Block aller Layouts

Ich verwende Layout Builder (Drupal 8.7.1)

Ich habe einen Block in mehreren Layouts. Wie kann ich programmgesteuert alle Instanzen dieses Blocks entfernen und alle Layouts aktualisieren, ohne die Meldung "Dieser Block ist defekt oder fehlt. Möglicherweise fehlt der Inhalt oder Sie müssen möglicherweise das ursprüngliche Modul aktivieren." ?

5
rpayanm

hier ist es, versucht es mit einem benutzerdefinierten Inhaltsblock und einem Ansichtsblock

ich habe den Code in PHP/Devel aus dem Modul devel_php ausgeführt

$storage = \Drupal::entityTypeManager()->getStorage('entity_view_display');
foreach ($storage->loadMultiple() as $display) {
  foreach ($display->getSections() as $section) {
    foreach ($section->getComponents() as $component) {
      // Custom views block
      // $to_delete_plugin_id = 'views_block:my_news-block_1';
      // Custom block
      $to_delete_plugin_id = 'block_content:fb4ad848-0f3c-4296-a6ba-1a9da886335b';
      if ($component->getPluginId() == $to_delete_plugin_id) {
        $section->removeComponent($component->getUuid());
        $display->save();
      }
    }
  }
}

für einen bestimmten Knoten:

// This can be adapted to be used for a set of nodes
$node = node_load(42);
$display = $node->layout_builder__layout;

foreach ($display->getSections() as $section) {
  foreach ($section->getComponents() as $component) {
    // Custom views block
    // $to_delete_plugin_id = 'views_block:my_news-block_1';
    // Custom block
    $to_delete_plugin_id = 'block_content:fb4ad848-0f3c-4296-a6ba-1a9da886335b';
    if ($component->getPluginId() == $to_delete_plugin_id) {
      $section->removeComponent($component->getUuid());
      $node->save();
    }
  }
} 

Hoffe das hilft :)

5
izus

Angenommen, Sie verwenden den Layout Builder auf einem Knoten und verwenden "Überschreibungen", damit jeder Inhalt ein eigenes Layout hat. Die gesuchten Daten befinden sich im node__layout_builder__layout Tabelle. Sie können dort nachsehen, dass ein Verweis auf die "ID" der Entität und die UUID des Inhalts gespeichert ist. Im Fall eines Blocks kann die Instanz dieses Blockinhalts nicht gefunden und die Warnmeldung angezeigt werden, da Sie die Instanz möglicherweise gelöscht haben.

Ich dachte, dies wäre ein gutes Beitragsprojekt, also habe ich "Layout Builder Block Sanitizer" erstellt und eine Entwicklungsversion veröffentlicht, mit der Sie zu einem Formular wechseln, eine Knoten-ID eingeben und jeden Abschnitt darauf scannen können Knoten automatisch für "block_content", der nicht mehr existiert, und entfernen Sie ihn. Lassen Sie mich wissen, ob dies hilft. Wie ich auf der Projektseite bemerkt habe, könnte dies definitiv etwas größer werden und sich gegenüber dem aktuellen Status erheblich verbessern, sollte Ihnen aber möglicherweise in dieser Situation helfen.

Schauen Sie sich das Projekt hier an: https://www.drupal.org/project/layout_builder_block_sanitizer

5
Tyler Fahey