it-swarm.com.de

Link aus Node-ID in Drupal 8 erstellen

Ich überprüfe Drupal 8 und versuche, einen Link basierend auf der Node-ID eines Artikels zu generieren. In Drupal 7 ist es ungefähr so:

$options = array('absolute' => TRUE);
$nid = 1; // Node ID
$url = url('node/' . $nid, $options);

Dies führt zu einer absoluten Verknüpfung mit dem korrekten URL-Alias.

Die url () - Funktion scheint also veraltet zu sein. Was ist der Drupal-8-Weg? Sieht aus wie eine wirklich grundlegende Funktion für mich, aber ich konnte keine nützlichen Referenzen finden.

16
Nicensin

Sie müssen die Klasse \Drupal\Core\Url verwenden, insbesondere ihre fromRoute static-Methode. Drupal 8 verwendet Routen, deren Namen sich vom tatsächlichen URL-Pfad unterscheiden. In Ihrem Fall ist die zu verwendende Route die kanonische Route für eine Knotenentität: entity.node.canonical. \Drupal\Core\Url::fromRoute() gibt keinen String zurück, sondern ein Objekt. Um die URL als Zeichenfolge abzurufen, müssen Sie ihre toString() -Methode aufrufen.

$options = ['absolute' => TRUE];
$url = \Drupal\Core\Url::fromRoute('entity.node.canonical', ['node' => 1], $options);
$url = $url->toString();

Die statische Methode ist nicht leicht zu testen, $url->toString() erfordert einen initialisierten Container. Sie können die statische Methode durch einen Aufruf an UrlGeneratorInterface::generateFromRoute() am url_generator Dienst ersetzen.

$options = ['absolute' => TRUE];
$url = $this->url_generator->generateFromRoute('entity.node.canonical', ['node' => 1], $options);
$url = $url->toString();

Leider ist diese Methode als @internal markiert, so dass Sie sie nicht im Benutzercode (dh außerhalb des Drupal-Kerns) verwenden sollen.

29
Pierre Buyle

Absolute URL erstellen:

$options = ['absolute' => TRUE];
$url_object = Drupal\Core\Url::fromRoute('entity.node.canonical', ['node' => $nid], $options);
// will output http://example.com/path-to-my-node

Absolutes Linkobjekt erstellen:

$options = ['absolute' => TRUE, 'attributes' => ['class' => 'this-class']];
$node_title = Drupal\Core\Render\Markup::create('<span>' . $node_title . '</span>');
$link_object = Drupal\Core\Link::createFromRoute($node_title, 'entity.node.canonical', ['node' => $nid], $options);
// will output <a href="http://example.com/path-to-my-node" class="this-class"><span>My Node's Title</span></a>
4
leymannx

Wenn Sie das Knotenobjekt vollständig geladen haben, können Sie einfach $node->toUrl() aufrufen, um die erforderliche URL zu erhalten. Standardmäßig wird kanonische URL für einen Knoten ( node/NID ) zurückgegeben. Es ist jedoch möglich, andere URLs zu erstellen, die in der Knotenentitätsdefinition aufgeführt sind (siehe Drupal\node\Entity\Node.php) .Same gilt für andere Entitätstypen.

$options = ['absolute' => TRUE];
$view_link = Link::fromTextAndUrl(t('View'), $node->toUrl('canonical', $options));
$edit_link = Link::fromTextAndUrl(t('Edit'), $node->toUrl('edit-form', $options));
$delete_link = Link::fromTextAndUrl(t('Delete'), $node->toUrl('delete-form', $options));
3
ya.teck

hehe, das ist der Scheiß in Bezug auf das Abrufen der URL aus dem Feld (Twig-Version zum Abrufen dieser URL)

Wenn Sie die URL (und den Titel) in einem Feld haben möchten, müssen Sie zum Objekt der Klasse gelangen: Drupal\Core\Url

Wenn Sie den Knoten durch drupal_entity (Twig Tweaks) erhalten haben, haben Sie: (Ich verwende "tab" als Knoten) tab ['# node']. Field_link 

Dies gibt Ihnen durch die Verwendung von:

tab ['# node']. field_link.uri -> der URI (URI ist keine URL)

tab ['# node']. field_link.title -> der Titel

aber das ist nicht das Ende.

es ist besser, auf Drupal\link\Plugin\Field\FieldType\LinkItem zuzugreifen:

tab ['# node']. field_link.get (0)

tab ['# node']. field_link [0]

(beide machen dasselbe)

dann kannst du auf das zugreifen, was am interessantesten ist:

tab ['# node']. field_tab_link [0] .getUrl () ein Drupal\Core\Url - Objekt. 

Sie können auf dieses Objekt auch zugreifen, indem Sie die folgende Zeile aus der Knoten-Vorlagendatei verwenden: content.field_link [0] ['# url'] (dies ist auch das Drupal\Core\Url-Objekt)

Dieses Objekt hat Methoden:

  • isExternal () -> ist ein Link zu außerhalb (dh. http://cnn.com )
  • isRouted () -> ist ein Link zu Ihrer Site
  • getRouteName () -> Name der Route
  • getRouteParameters () -> gibt Ihnen ein Array von Werten. Hier (wir erhalten die ID dieses Knotens) hätten Sie ['node' => ID]

Sie sollten es so verwenden:

{% set tabURL = tab['#node'].field_link[0].getUrl() %}

{% if tabURL.isExternal() %}
    {% set link_path = tab['#node'].field_tab_link.uri %}

{% elseif tabURL.isRouted() %}
    {% set link_path = path(tabURL.getRouteName(), tabURL.getRouteParameters()) %} {# /node/12 #}

{% endif %}
2
red777

Hier ist meine Antwort für den Knotenbearbeitungslink.

$nodeInfo = $entity->get('nid')->getValue();
$nodeId = $nodeInfo[0]['value'];
$options = ['absolute' => TRUE];
$url = \Drupal\Core\Url::fromRoute('entity.node.edit_form', ['node' => $nodeId], $options);
$url = $url->toString();
1
Sawant Akshay

Sie müssen Drupal\Core\Url; Klasse.

$url= Url::fromRoute('root', $route_parameters=array());

$link = \Drupal::l(t('label'), $url);  

Beispiel:

Wenn Sie Argumente übergeben

$url = Url::fromRoute('test.page', $route_parameters = array('test' => 1));

Andernfalls

$url = Url::fromRoute('test.page');
$link = \Drupal::l(t('Label'), $url);
0