Wie erstelle ich einen Link?

26

Angenommen, ich erweitere die blockBaseKlasse, um einen benutzerdefinierten Block zu erstellen, und implementiere die blockBuildMethode, um ein Markup für meinen Block zu erstellen. Etwas wie das:

 class YourModuleBlock extends BlockBase {

   /**
     * Implements \Drupal\block\BlockBase::blockBuild().
     */
     public function build() {
      return array(
        '#markup' => 'This is a block!',
      );
     }
   }

Wenn ich in diesem Markup einen Link bereitstellen wollte, hätte ich in D7 die lFunktion verwendet, aber diese ist nicht mehr verfügbar ( siehe hier ). Daher muss ich die neue D8-Methode zum Generieren von Links bereitstellen. Ich könnte einfach ein <a>Tag verwenden, aber dies war in D7 nie die beste Vorgehensweise.

Was ist die richtige Methode zum Erstellen von Links und wie stelle ich sie meiner Funktion zur Verfügung?

24ma13wg
quelle
Überprüfen Sie bitte folgenden Link , die alle Arten von Beispiel haben Link in Drupal 8 zu erzeugen gist.github.com/r-daneelolivaw/b420b3dc0c40a6cacf76
Swapnil Bijwe

Antworten:

56

\ Drupal :: l ist veraltet. Vielleicht ist dieser Fall für jemanden nützlich

  use Drupal\Core\Url;
  use Drupal\Core\Link;
  $url = Url::fromRoute('entity.node.edit_form', array('node' => NID));
  $project_link = Link::fromTextAndUrl(t('Open Project'), $url);
  $project_link = $project_link->toRenderable();
  // If you need some attributes.
  $project_link['#attributes'] = array('class' => array('button', 'button-action', 'button--primary', 'button--small'));
  print render($project_link);
Eugene
quelle
2
Dieser toRenderable()Trick ist sehr nützlich, danke!
Nic
Funktioniert immer noch auf Drupal 8.4 Core
Podarok
Brah, Sie haben mir damit das Leben gerettet. Ich bin neu bei Drupal und konnte herausfinden, wie die Spalte mit den Modulnamen für Gruppen geändert werden kann, um auf die Knoten zu verweisen.
Mike Q
24

Erstens ist dies nicht 100% vollständig, siehe diese Ausgabe . Lassen Sie mich vor diesem Hintergrund einen Code aus der Änderungsmitteilung zitieren :

Drupal 7:

// Internal path.
$internal_link = l(t('Book admin'), 'admin/structure/book');

// External Uri.
$external_link = l(t('External link'), 'http://www.example.com/', array('external' => TRUE));

Drupal 8:

// Internal path (defined by a route in Drupal 8).
use Drupal\Core\Url;
$url = Url::fromRoute('book.admin');
$internal_link = \Drupal::l(t('Book admin'), $url);

// External Uri.
use Drupal\Core\Url;
$url = Url::fromUri('http://www.example.com/');
$external_link = \Drupal::l(t('External link'), $url);

Bearbeiten: Routennamen befinden sich in den moduledirectory/modulename.routing.ymlDateien und (standardmäßig) in der {router}Tabelle.


quelle
2
Ich habe $ router_name in der Tabelle {router} gefunden.
22.01.15
1
Wie kann ich einen Link für die Startseite erstellen? In Drupal 7 kann es l sein ('home', '<front>'). aber was ist mit Drupal 8?
Guru
fromRoute('<front>')
7
\ Drupal :: l ist veraltet. Verwenden Sie stattdessen \ Drupal \ Core \ Link :: fromTextAndUrl ($ text, $ url)
Eyal
Drupal :: l deprecation notice api.drupal.org/api/drupal/core!lib!Drupal.php/function/…
leymannx
21

Eine andere Möglichkeit besteht darin, einen Link in einem Render-Array zu erstellen

$url = Url::fromRoute('entity.node.edit_form', array('node' => NID));
$link = [
  '#type' => 'link',
  '#url' => $url,
  '#title' => t('This link was rendered')
];

Drupal stellt uns einige Hilfsmethoden zum Erstellen von URLs und Links zu Entitäten zur Verfügung.

$url = Node::load(NID)->toUrl('edit-form');

Und

$link = Node::load(NID)->toLink(t('link text'), 'edit-form');
$link_render_array = $link->toRenderable();
Eyal
quelle
Mir gefällt diese Antwort am besten. Zusätzlich #attributeskönnen hinzugefügt werden , da dies eine ist RenderElement .
Mradcliffe
Der Link sollte api.drupal.org/api/drupal/…
mradcliffe
Ich konnte es nicht bearbeiten, weil ich zu lange gewartet habe.
Mradcliffe
19

Hier einige Beispiele zum Erstellen von Links in Drupal 8. Beachten Sie, dass $ this-> t ('some text') in Blöcken verfügbar ist, die BlockBase erweitern. Wenn Sie diese in eine andere Klasse kopieren, die sie nicht besitzt, oder diese in einer .module-Datei verwenden, müssen Sie sie möglicherweise in t () 1 ändern .

Grundlegender Link zu einem Knoten:

$node = Node::load($nid);
$build['node_link'] = $node->toLink()->toRenderable();

Dies erzeugt ein Render-Array wie folgt:

$link = [
  '#type' => 'link',
  '#url' => $url_object,
  '#title' => 'Title of Node',
];

Sie können das Render-Array folgendermaßen erstellen, ohne den Knoten zu laden:

$url_object = Url::fromRoute('entity.node.canonical', ['node' => $nid]);
$link = [
  '#type' => 'link',
  '#url' => $url_object,
  '#title' => $this->t('Read More'),
];

Oder mit der Core-Link-Klasse:

$url = Url::fromRoute('entity.node.canonical', ['node' => $nid]);
$link = Link::fromTextAndUrl($this->t('Read more'), $url);
$build['read_more'] = $link->toRenderable();

Wenn Sie Markup im Text Ihres Links verwenden möchten, können Sie nicht einfach einen String einfügen. Sie müssen ein Render-Array-Element verwenden:

$url = Url::fromRoute('entity.node.canonical', ['node' => $nid]);
$link_text =  [
  '#type' => 'html_tag',
  '#tag' => 'span',
  '#value' => $this->t('Load More'),
];
$link = Link::fromTextAndUrl($link_text, $url);

Um einen absoluten Link zu erstellen, fügen Sie diese Option der URL hinzu, nicht dem Link:

$url = Url::fromRoute('entity.node.canonical', ['node' => $nid], ['absolute' => TRUE]);
$link = Link::fromTextAndUrl($this->t('Read more'), $url);
$build['read_more'] = $link->toRenderable();

Um eine Klasse zu Ihrem Link hinzuzufügen, müssen Sie diese auch zur URL hinzufügen, nicht zum Link:

$options = [
  'attributes' => [
    'class' => [
      'read-more-link',
    ],
  ],
];
$url = Url::fromRoute('entity.node.canonical', ['node' => $nid], $options);
$link = Link::fromTextAndUrl($this->t('Read more'), $url);
$build['read_more'] = $link->toRenderable();

Um eine Abfragezeichenfolge zu Ihrem Link hinzuzufügen, müssen Sie diese auch zur URL und nicht zum Link hinzufügen:

$options = [
  'query' => [
    'car' => 'BMW',
    'model' => 'mini-cooper',
  ],
  'attributes' => [
    'class' => [
      'read-more-link',
    ],
  ],
];
$url = Url::fromRoute('entity.node.canonical', ['node' => $nid], $options);
$link = Link::fromTextAndUrl($this->t('Read more'), $url);
$build['read_more'] = $link->toRenderable();

So legen Sie fest, dass der Link in einem neuen Fenster mit target = _blank geöffnet wird:

$options = [
  'attributes' => [
    'target' => '_blank'
  ],
];
$url = Url::fromRoute('entity.media.edit_form', ['media' => $entity->id()], $options);
$link = Link::fromTextAndUrl(t('Edit'), $url);
$form['entity']['edit_link'] = $link->toRenderable();

Hier ist ein Link zu einer Taxonomiebegriffsseite:

$url = Url::fromRoute('entity.taxonomy_term.canonical', ['taxonomy_term' => $tid]);
$link = Link::fromTextAndUrl($this->t('Read more'), $url);
$build['read_more'] = $link->toRenderable();

Hier ist ein Link zur Knotenbearbeitungsseite:

$url = Url::fromRoute('entity.node.edit_form', ['node' => $nid]);
$link = Link::fromTextAndUrl($this->t('Edit'), $url);
$build['read_more'] = $link->toRenderable();

So erstellen Sie einen externen Link:

$url = Url::fromUri('http://www.example.com/');
$link = Link::fromTextAndUrl($this->t('Vist this example site'), $url);
$build['external_link'] = $link->toRenderable();

Link zur Homepage:

$url = Url::fromRoute('<front>');
$link = Link::fromTextAndUrl($this->t('Home'), $url);
$build['homepage_link'] = $link->toRenderable();

Beachten Sie, dass Sie für jedes dieser URL-Objekte die URL als Zeichenfolge abrufen können, indem Sie Folgendes aufrufen:

$url->toString();

Beispielsweise:

$url_string = Url::fromRoute('<front>')->toString();
oknate
quelle
Die linkMethode ist veraltet.
Eyal
Ich habe meine Antwort überarbeitet, um toLink () aus dem Knotenobjekt zu verwenden, dh $ node-> toLink () -> toRenderable ();
OKNATE
Das ist ein guter Abstieg.
Brady
15

Die Möglichkeit, Attribute festzulegen, scheint in den vorherigen Beispielen verloren zu gehen oder zu verwickeln, da die Funktionalität einfach nicht offensichtlich ist. Es gibt zwei Möglichkeiten, um Links zu erstellen, je nachdem, ob es eine Route gibt oder nicht, und jedes verhält sich ein bisschen anders. Hier sind die Beispiele.

  1. Mit einer Route. Dies ist am sinnvollsten, Sie können es einfach in den Optionen angeben.

    Link::createFromRoute('My link', 
      'entity.node.canonical',
      ['node' => 123],
      ['attributes' => ['class' => 'special']]));
  2. Mit einer externen URL. Dieser ist ein bisschen komisch. Es gibt kein Optionsargument, daher scheint es unmöglich, aber eigentlich ist es in Ordnung. Der Grund ist, dass Links aus unerklärlichen Gründen niemals nur die URL enthalten, die sie beschreiben. Dies bedeutet, dass Sie die Klasse beim Erstellen an die URL übergeben und sie funktioniert dann einfach.

    Link::fromTextAndUrl('My link', 
      Url::FromUrl('https://example.com/about',
        ['attributes' => ['class' => 'special']]));

    Eine Folge all dessen ist, dass Sie dies auch tun können.

    $link = Link::fromTextAndUrl('Example',  Url::fromUri('https://example.com/about'));
    $link->getUrl()->setOption('attributes', ['class' => 'superspecial']);
NecLimDul
quelle
2

Ein vollständiges Beispiel mit Attributen und HTML-Markup im Linktext:

  $url = Url::fromRoute(
   'your.route.name', 
   [], 
   ['attributes' => ['id' => 'add-link', 'class' => ['btn', 'btn-sm', 'btn-primary']]]
  );
  $link = Link::fromTextAndUrl(
    Markup::create('<span class=\'glyphicon glyphicon-plus\'></span> ' . t('Add new item')), 
    $url
  );
Cristian Romanescu
quelle
0

Ich musste der Tabelle einen Link als #suffix hinzufügen, aber ich musste ihn als html ausgeben, um das zu erreichen, was ich getan habe

\Drupal\Core\Link::fromTextAndUrl("Add New page", Url::fromRoute('mymodule.add_new_page'))->toString();

Wobei mymodule.add_new_page die Route von meiner Modul-YML-Datei ist.

Eugene
quelle
0

Die Antworten hier gaben mir einige gute Hinweise. Ich wollte lediglich einen Link zu dem Knoten in meinen Protokollen bereitstellen

  use Drupal\Core\Url;
  use Drupal\Core\Link;
  /* ...
  .. */  
  $url = Url::fromRoute('entity.node.canonical', array('node' => $object->id()));
$strings = array(
  '!node' => Link::fromTextAndUrl($object->getTitle(), $url)->toString(),
  '%nid' => $nid,
);
\Drupal::logger('mymodule_actions')->notice('Updating !node (%nid)', $strings);
dman
quelle
-3
\Drupal\Core\Link::createFromRoute(t('TEXT'), 'ROUTE')->toString()
Rami Neifar
quelle