it-swarm.com.de

Wie führe ich eine Umleitung in node.html.twig durch?

Ich versuche eine Weiterleitung auf meinem node.html.twig Vorlage basierend auf dem Inhaltstyp, da ich Ansichten für meinen Inhalt verwende.

Ich habe es versucht:

{% do redirect('/example') %}

oder dieses:

{% redirect '/example' %}

aber nichts funktioniert. Irgendeine Idee?

1
Mauricio

Tun Sie es nicht in der Datei Twig. Hier gehört diese Logik nicht hin. Sie sollte sich in einem Ereignis befinden.

Siehe diese ähnliche Frage: EventSubscriber, der für einen bestimmten Knotentyp oder Pfad aufgerufen wurde

Sie müssen nur noch den Knotentyp überprüfen und ein RedirectResponse senden.

Gabe Sullice hat einen Kern, der dem sehr nahe kommt, was Sie erreichen möchten: https://Gist.github.com/gabesullice/96bdae1518d11bb4565e72c33ffcae4c

Ihr Code würde also Folgendes ausfüllen:

  /**
   * Determines whether we should send a RedirectResponse for this node.
   */
  protected function redirectApplies(NodeInterface $node) : bool {
    $redirect_types = ['type_1', 'type_2', 'type_3'];
    return in_array($node->getType(), $redirect_types);
  }

Wenn Sie jedoch für verschiedene Typen zu unterschiedlichen URLs wechseln, müssen Sie diese etwas weiter anpassen.

4
Kevin

Wo haben Sie die Umleitungsfunktion gesehen? Ich glaube nicht, dass es Teil des Standards ist twig oder irgendetwas drupal bietet: https://www.drupal.org/docs/8/theming)/twig/functions-in-twig-templates

Vielleicht ist es besser, die Umleitung in einer Prozessfunktion durchzuführen. Dies könnte hilfreich sein Leiten Sie die Basisseite beim Besuch der Seite auf eine externe URL um

0
Leigh

Wie von @Kevin vorgeschlagen, habe ich ein benutzerdefiniertes Modul basierend auf Gabe Sullice-Code erstellt: https://Gist.github.com/gabesullice/96bdae1518d11bb4565e72c33ffcae4c

Meine endgültige Codeumleitung zur benutzerdefinierten URL nach Inhaltstyp:

    namespace Drupal\redirect_node_module\EventSubscriber;
use Symfony\Component\EventDispatcher\EventSubscriberInterface;
use Symfony\Component\EventDispatcher\Event;
use Drupal\Core\Routing\CurrentRouteMatch;
use Drupal\node\NodeInterface;
use Drupal\Core\Cache\CacheableRedirectResponse;
use Symfony\Component\HttpFoundation\RedirectResponse;
/**
 * Class ResponseSubscriber.
 *
 * @package Drupal\redirect_node_module
 */
class ResponseSubscriber implements EventSubscriberInterface {
  /**
   * Drupal\Core\Routing\CurrentRouteMatch definition.
   *
   * @var Drupal\Core\Routing\CurrentRouteMatch
   */
  protected $routeMatch;
  /**
   * Constructor.
   */
  public function __construct(CurrentRouteMatch $current_route_match) {
    $this->routeMatch = $current_route_match;
  }
  /**
   * {@inheritdoc}
   */
  static function getSubscribedEvents() {
    $events['kernel.response'] = ['handle'];
    return $events;
  }
  /**
   * This method is called whenever the kernel.response event is
   * dispatched.
   *
   * @param GetResponseEvent $event
   */
  public function handle(Event $event) {
    $route_name = $this->routeMatch->getRouteName();
    switch ($route_name) {
      case 'entity.node.canonical':
        $node = $this->routeMatch->getParameter('node');
        if ($this->redirectApplies($node)) {
          $event->setResponse(new RedirectResponse($this->getRedirect($node)));
        }
    }
  }
  /**
   * Determines whether we should send a RedirectResponse for this node.
   */
   protected function redirectApplies(NodeInterface $node) {
    // One should have logic here returning TRUE or FALSE for whether we should redirect this response.
    $redirect_on = ['programas', 'servicios', 'aliados', 'testimonios', 'nosotros', 'nuestro_equipo', 'datos_de_contacto', 'banner', 'seccion'];
    return (in_array($node->getType(), $redirect_on));

  }
  protected function getRedirect(NodeInterface $node) {
    // We can cache this response when this is fixed: https://www.drupal.org/node/2573807
    // $response = CacheableRedirectResponse::create($url);
    // $response->addCacheableDependency($node);
    // return $response;

    switch ($node->getType()) {
      case 'nuestro_equipo':
        $url = "/profesionales";
        break;

      case 'datos_de_contacto':
        $url = "/contacto";
        break;

      case 'nosotros':
        $url = "/nosotros";
        break; 

      case 'banner':
        $url = "/";
        break;  

      case 'testimonios':
        $url = "/testimonios";
        break;

      case 'aliados':
        $url = "/aliados";
        break;

      default:
        $search_chars = array('á','é','í','ó','ú','ñ','Á','É','Í','Ó','Ú','Ñ',' ');
        $replace_chars= array('a','e','i','o','u','n','a','e','i','o','u','n','-');
        $node_title = str_replace($search_chars, $replace_chars, strtolower( $node->getTitle() ));
        $url = "/".$node->getType()."/".$node_title;
        break;
    }
    return $url;
  }
}
0
Mauricio