it-swarm.com.de

Hinzufügen lokaler Aufgabenregisterkarten zur Knotenanzeige für einen bestimmten Inhaltstyp

Ich erstelle ein benutzerdefiniertes Modul (es heißt cil_meet), das zwei Inhaltstypen hinzufügt (Organisation und Raum). Auf einem Organisationsknoten möchte ich eine lokale Aufgabenregisterkarte (neben "Anzeigen" und "Bearbeiten") mit "Raum hinzufügen" für Administratoren. Auf einem Raumknoten möchte ich zwei Registerkarten "Veröffentlichen" und "Info".

Nach einigen Recherchen habe ich einen Weg gefunden, dies zu erreichen, aber ich möchte wissen, ob es einen besseren Weg gibt, dies zu tun?

cil_meet.routing.yml :

cil_meet.addroom:
  requirements:
    _role: 'administrator'
cil_meet.roompublish: 
#  path: '/meet/{organisation}/{room}/publish'
  requirements:
    _role: 'authenticated'
cil_meet.roominfo: 
#  path: '/meet/{organisation}/{room}/info'
  requirements:
    _role: 'authenticated'

Ich habe den Pfad für Publish & Info vorerst auskommentiert - ich werde später Controller usw. einrichten.

cil_meet.links.task.yml :

cil_meet.addroom: 
  route_name: 'node.add' 
  title: 'Add Room'
  weight: 100
  route_parameters:
    node_type: 'room'
  base_route: entity.node.canonical
cil_meet.roompublish: 
  route_name: 'cil_meet.roompublish' 
  title: 'Publish'
  weight: 100
  base_route: entity.node.canonical
cil_meet.roominfo: 
  route_name: 'cil_meet.roominfo' 
  title: 'Info'
  weight: 101
  base_route: entity.node.canonical

Dadurch werden die Registerkarten allen Knoten hinzugefügt. Um die Registerkarten von anderen Elementen als Organisations- oder Raumknoten zu entfernen, muss ich dem Modul Code hinzufügen.

cil_meet.module :

<?php
/**
 * Implements hook_local_tasks_alter().
 */
function cil_meet_menu_local_tasks_alter(&$local_tasks, $route_name) {
    $route_match = \Drupal::routeMatch();

    if ($route_match->getRouteName() == 'entity.node.canonical') {
        $node = $route_match->getParameter('node');
        if($node->bundle()!='organisation') {
            unset($local_tasks['tabs'][0]['cil_meet.addroom']); 
        }

        if($node->bundle()!='room') {
            unset($local_tasks['tabs'][0]['cil_meet.roompublish']);
            unset($local_tasks['tabs'][0]['cil_meet.roominfo']);
        }
    }
}

Alle Arbeiten funktionieren wie erwartet. Die oben genannten Punkte können anderen helfen, die eine ähnliche Lösung benötigen. Gibt es einen besseren Weg, dies zu tun?

2
Matt B

Die Lösung von Matt B verbirgt nur die Registerkarte auf der Seite mit der Knotenansicht, nicht jedoch mit der Knotenbearbeitung usw. In diesem Fall kann auch auf die direkte URL zugegriffen werden.

Eine bessere Lösung besteht darin, einen benutzerdefinierten Zugriffshandler zu schreiben

Siehe Benutzerdefinierte Validierung von Routenparametern

1
StryKaizer