it-swarm.com.de

Ändern Sie die vorhandene Route mithilfe von RouteSubscriber in eine andere Route für einen bestimmten Inhaltstypknoten

Ich möchte die Knotenbearbeitung eines bestimmten Inhaltstypknotens auf eine andere Route ändern.

Beispiel: Angenommen, ich habe eine Seitenroute für die Knotenbearbeitung als entity.node.edit_form (Kernfunktion). Und jetzt möchte ich diese Route in custom_module.edit_form Ändern, wenn ich den Knoten zum Bearbeiten nehme.

Ich bezog mich auf This , was das Ändern des existing route to a different route erklärt. Es heißt nur, zu einer anderen URL zu routen. In meinem Fall funktioniert dies möglicherweise nicht, da das Knotenbearbeitungsformular node id als Parameter enthält. Es wird jedoch nicht erwähnt, wie Routen in $route->setPath() platziert werden können.

Zum Beispiel: In custom_module/src/Routing/RouteSubscriber.php

/**
   * {@inheritdoc}
   */
  protected function alterRoutes(RouteCollection $collection) {
    // Change path '/user/login' to '/login'.
    if ($route = $collection->get('user.login')) {
      $route->setPath('/login');
    }
    // Always deny access to '/user/logout'.
    // Note that the second parameter of setRequirement() is a string.
    if ($route = $collection->get('user.logout')) {
      $route->setRequirement('_access', 'FALSE');
    }
  }

Wie kann ich das machen ?

3
Crazyrubixfan

Sie müssen den _controller für die Route ändern. Überprüfen Sie diesen Code:

<?php

namespace Drupal\drush_help\Routing;

use Drupal\Core\Routing\RouteSubscriberBase;
use Symfony\Component\Routing\RouteCollection;

/**
 * Listens to the dynamic route events.
 */
class RouteSubscriber extends RouteSubscriberBase {

  /**
   * {@inheritdoc}
   */
  protected function alterRoutes(RouteCollection $collection) {
    // Change the controller for the help page.
    if ($route = $collection->get('help.page')) {
      $route->setDefault('_controller', '\Drupal\drush_help\Controller\HelpController::helpPage');
    }
  }

}

In diesem Fall wird die Route geändert, um die Hilfeseite Drupal für einen benutzerdefinierten Controller) zu ersetzen.

Wenn Sie dies in Aktion sehen möchten, überprüfen Sie den Code des Moduls Drush Help .

Offenlegung: Ich bin der Betreuer des Moduls Drush Help .

1

Hallo, ich habe das wie folgt gemacht: in RouteSubscriber.php:

<?php

namespace Drupal\module_name\Routing;

use Drupal\Core\Routing\RouteSubscriberBase;
use Symfony\Component\Routing\RouteCollection;

/**
 * Listens to the dynamic route events.
 */
class RouteSubscriber extends RouteSubscriberBase {

  /**
   * {@inheritdoc}
   */
  protected function alterRoutes(RouteCollection $collection) {
    // Change path '/node/edit' to custom controller action.
    if ($route = $collection->get('entity.node.edit_form')) {
        $route->setDefault('_controller', '\Drupal\module_name\Controller\MyController::alter_edit_route');
    }
  }
}    

und in MyController.php:

/**
 * Function to redirect the edit route to custom route
 */
public function alter_edit_route(){
    $node_id = \Drupal::routeMatch()->getRawParameter('node');
    //get the content type using node id 
    $entityObj  = entity_load('node',$node_id);
    $bundle = $entityObj->bundle();
    if($bundle=="custom_service_name"){
        //redirect to custom service list page
        $response = new RedirectResponse('/module_name/custom_service/'.$node_id);
        $response->send();
       return;
    }
    else return $this->redirect('entity.node.edit_form', ['node' => $node_id]);
}

NB: - Ein Problem hier ist, dass es redirecting to the custom url for the specific content type. Aber wenn Sie other content type nodes its hanging with the too many redirections.

Begrüßen Sie Ihre Erkenntnisse dazu. Vielen Dank .

UPDATE

Okay, hier ist, wie ich das Problem gelöst habe. Für den Knoten des benutzerdefinierten Inhaltstyps wird die redirectResponse verwendet, um zur benutzerdefinierten Seite umzuleiten. Für andere Inhaltstypknoten wird das spezifische Inhaltstypformular erstellt und die Werte für die spezifische Knoten-ID werden geladen. Also in MyController.php

  /**
     * Function to redirect the edit route to custom route
     */
    public function alter_edit_route(){
        $node_id = \Drupal::routeMatch()->getRawParameter('node');
        //get the content type using node id 
        $entityObj  = entity_load('node',$node_id);
        $bundle = $entityObj->bundle();
        if($bundle=="custom_service_name"){
            //redirect to custom service list page
            $response = new RedirectResponse('/module_name/custom_service/'.$node_id);
            $response->send();
        }
        else {
            //programmatically load the node edit page with value
            $node = \Drupal::entityTypeManager()->getStorage('node')->load($node_id);
            $form = \Drupal::entityTypeManager()
              ->getFormObject('node', 'default')
              ->setEntity($node);
            return \Drupal::formBuilder()->getForm($form);
        }           
    }
1
Crazyrubixfan