it-swarm.com.de

So öffnen Sie alle externen Links in einem neuen Tab

Ich möchte ein kleines Modul erstellen, um alle externen Links im Menü in einer neuen Registerkarte zu öffnen. Wie kann ich das tun?

Ich denke, ich sollte hook_link_alter verwenden, um es zu tun, aber ich weiß nicht, wie es geht, damit ich nur alle externen Links auswählen kann?

4
usethe23

Links können auf verschiedene Arten generiert werden, was es schwierig macht, sie konsistent zu ändern. Für eine einzelne Implementierung, die Sie zum größten Teil erreichen möchten, sollten Sie den Dienst link_generator Gegen Ihre eigene Unterklasse austauschen. Dies sollte im Allgemeinen alle Menüelemente und Links erfassen, jedoch nicht das benutzerdefinierte Markup von wysiwyg berühren. Hier müssten Sie einen benutzerdefinierten Filter erstellen.

Die Methode ::generate($text, Url $url) wird verwendet, um den HTML-Code tatsächlich zu erstellen. Was Sie tun möchten, ist das Hinzufügen des Zielattributs _blank, Wenn die URL extern ist.

Der Code für die Linkgenerator-Unterklasse könnte folgendermaßen aussehen:

class MyLinkGenerator extends LinkGenerator {
  public function generate($text, Url $url) {
    if ($url->isExternal()) {
      $attributes = $url->getOption('attributes');
      $attributes['target'] = '_blank';
      $url->setOption('attributes', $attributes);
    }
    return parent::generate($text, $url);
  }
}

Ich werde nicht darauf eingehen, wie man die Klasse eines Dienstes ändert, dafür gibt es hier und anderswo viele Beispiele.

11
googletorp

Wenn Sie hook_link_alter verwenden möchten, können Sie auch einfach den folgenden Code in ein Modul implementieren:

/**
 * Implements hook_link_alter().
 */
function mymodule_link_alter(&$vars) {
  if ($vars['options']['external'] == TRUE) {
    $vars['options']['attributes']['target'] = '_blank';
  }
}
1
pbonnefoi