J'utilise Layout Builder (Drupal 8.7.1)
J'ai un bloc dans plusieurs mises en page. Comment puis-je supprimer par programme toutes les instances de ce bloc et mettre à jour toutes les présentations sans le message "Ce bloc est cassé ou manquant. Il se peut que vous manquiez du contenu ou que vous deviez activer le module d'origine." ?
le voici, essayé avec un bloc de contenu personnalisé et un bloc de vues
j'ai exécuté le code dans php/devel depuis le module devel_php
$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();
}
}
}
}
pour un nœud particulier:
// 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();
}
}
}
J'espère que cela t'aides :)
En supposant que vous utilisez Layout Builder sur un nœud et que vous utilisez des "remplacements" pour permettre à chaque contenu d'avoir sa propre disposition unique, les données que vous recherchez se trouvent dans le node__layout_builder__layout
table. Vous pouvez y regarder et voir qu'il stocke une référence à l '"ID" de l'entité et à l'UUID du contenu. Ainsi, dans le cas d'un bloc, car vous avez peut-être supprimé l'instance, il ne trouvera pas l'UUID de ce contenu de bloc et n'affichera pas le message d'avertissement.
J'ai pensé que cela ferait un bon projet de contribution, j'ai donc créé "Layout Builder Block Sanitizer" et j'ai publié une version de développement qui vous permet d'accéder à un formulaire, de taper un ID de nœud et il analysera chaque section à ce sujet. noeud automatiquement pour "block_content" qui n'existe plus et supprimez-le. Faites-moi savoir si cela aide. Comme je l'ai noté sur la page du projet, cela pourrait certainement évoluer et s'améliorer un peu par rapport à l'état actuel, mais devrait peut-être vous aider dans cette situation.
Découvrez le projet ici: https://www.drupal.org/project/layout_builder_block_sanitizer