Wie thematisiere ich einen Link?

8

In Drupal 7 war dies möglich.

$link = array(
  '#type'  => 'link',
  '#title' => t('My Title'),
  '#href'  => 'node/1',
);
drupal_render($link);

Aber ich habe dies mit Drupal 8 versucht und es gibt nichts aus.

$link = array(
  '#type' => 'link',
  '#title' => t('test'),
  '#url' => 'node/1',
);
drupal_render($link);

Gibt es eine Möglichkeit, einen Link zu rendern, ohne das Link-Plugin direkt aufrufen oder meine eigene Themenfunktion erstellen zu müssen?

Ich thematisiere einen Feldgruppenformatierer, der ein Renderarray ausgeben muss.
Die Verwendung von drupal_render()ist veraltet und sollte nicht direkt aufgerufen werden. Ich benutze es hier, um mein Beispiel klarer zu machen.

leon.nk
quelle
Eigentlich sollte das funktionieren. Was bedeutet, gibt nichts aus? Wo druckst du diesen gerenderten HTML-Code? drupal_render () ist veraltet. Rufen Sie den RenderService direkt auf: \ Drupal :: service ('renderer') -> render ($ elements, $ is_recursive_call) Um den Link zu generieren, können Sie auch Folgendes verwenden: Link :: fromTextAndUrl ($ text, Url $ url) Siehe Link Klasse .
Rémy
Was möchtest du thematisieren?
Rémy
Danke für die Antwort, aber wie gesagt möchte ich das Link Plugin nicht direkt aufrufen. Ich habe meine Frage mit etwas mehr Hintergrundinformationen aktualisiert, um mein Szenario zu verstehen.
leon.nk
Habe der Frage Informationen darüber hinzugefügt, was ich thematisiere.
leon.nk

Antworten:

8

Ich denke, das Problem mit Ihrem Drupal 8-Code ist, dass '#url' ein URL-Objekt benötigt.

Externe URL

'#url' => Url::fromUri('https://www.drupal.org'),

Interne URL von einer Route

'#url' => Url::fromRoute('entity.node.canonical', ['node' => 1]),

In Drupal 8 solltest du dich nicht selbst rendern. Entfernen Sie beim Portieren von Code aus Drupal 7 das gesamte Rendering und geben Sie nur Render-Arrays zurück.

4k4
quelle
Vielen Dank, das funktioniert! Ja, ich bin nicht drupal_render()direkt, es war nur für das Beispiel.
leon.nk
1

Hier ist ein Beispiel für das Rendern eines Links in Drupal 8 mit einer benutzerdefinierten Klasse. Es ist etwas seltsam, aber die Optionen werden an die URL übergeben, nicht an die Linkfunktion.

use Drupal\Core\Url;

$options = array('attributes' => array('class' => 'my-custom-class'));
$url = Url::fromUri('http://www.example.com', $options);
$markup = \Drupal::l(t('Link Text Goes Here!'), $url);

Dies ist nützlich in einem Feldformatierer, der die Rückgabe von Markups erwartet. Wenn Sie dies an einer anderen Stelle tun, konvertieren Sie es am besten in ein Link-Rendering-Array-Element.

use Drupal\Core\Url;

$options = array('attributes' => array('class' => 'my-custom-class'));
$build['examples_link'] = [
  '#title' => t('Link Text Goes Here!'),
  '#type' => 'link',
  '#url' => Url::fromUri('http://www.example.com', $options)
];
oknate
quelle