it-swarm.com.de

Menüpunkt programmgesteuert deaktivieren

Ich habe versucht, einen Menüpunkt "standard.front_page" mit dem folgenden Code zu deaktivieren:

db_query("UPDATE {menu_tree} SET enabled = 0 WHERE id LIKE 'standard.front_page';");
db_query("DELETE FROM {cache_menu};");

Es funktioniert einwandfrei, bis ich eine Cache-Neuerstellung mit drush cr Durchführe. Sobald ich einen Cache neu erstellt habe, kommt der Menüpunkt wieder zurück.

Kann jemand bitte einen guten Weg vorschlagen, um das oben genannte zu tun?

4
GeekTantra

Sie können die Dienste Drupal Menü-Link & Cache abrufen, um den Status des Menü-Links programmgesteuert zu ändern. So etwas wie diese Beispielfunktion:

function menu_state_toggle($menu_id, $enabled = TRUE) {
  $menu_link_manager = \Drupal::service('plugin.manager.menu.link');
  $front_page_link = $menu_link_manager->getDefinition($menu_id);
  $front_page_link['enabled'] = $enabled ? 1 : 0; 
  $menu_link_manager->updateDefinition($menu_id, $front_page_link);
  $cache = \Drupal::cache('menu');
  $cache->deleteAll();
}

menu_state_toggle('standard.front_page', FALSE);
6
Shawn Conn

Als Bereinigungsschritt nach der Migration musste ich einige nominierte Elemente aus unserem Hauptmenü entfernen. Andere Einstellungen (Ansichten, die über die Konfigurationsverwaltung importiert wurden) sollten die Rolle übernehmen, die früher statische Seiten waren. So lief es:

/**
 * Startup changes for upgrading from the migrated base site to D8 version.
 */
function drupalorgnz_upgrade_install() {
  // From the base upgrade, remove the static pages that were in the main menu
  // as they were replaced with proper views pages.
  // The 'pages' still exist, and are used as intro text blocks in the
  // news views blocks,
  // but relinquish their menu items and paths.
  // Zap the legacy /companies and /showcases nodes.
  $old_nids = [517,518];
  foreach ($old_nids as $nid) {
    $node = \Drupal\node\Entity\Node::load($nid);
    // Zap out the path_alias and the menu item to anonymize this node.
    $node->path->delete();

    // That was easy.
    // Next hugely trickier.
    // This is BS. Eventually found the method in menu_ui_node_predelete()
    /** @var \Drupal\Core\Menu\MenuLinkManagerInterface $menu_link_manager */
    $menu_link_manager = \Drupal::service('plugin.manager.menu.link');
    $result = $menu_link_manager->loadLinksByRoute('entity.node.canonical', ['node' => $node->id()]);
    if (!empty($result)) {
      foreach ($result as $id => $instance) {
        if ($instance->isDeletable() && strpos($id, 'menu_link_content:') === 0) {
          $instance->deleteLink();
        }
      }
    }
    $node->save();
  }
}
2
dman

Drupal 8: Wenn Sie einen Link einfach deaktivieren möchten, ihn aber dennoch im Menü anzeigen lassen möchten, verwenden Sie im Linkpfad des Menüelements Folgendes.

    route:<nolink>
0
Dupls