web-dev-qa-db-fra.com

Création d'un lien à partir d'un ID de nœud dans Drupal 8

Je vérifie Drupal 8 et essaie de générer un lien basé sur l'ID de nœud d'un article. Dans Drupal 7, cela ressemble à:

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

Cela aboutit à un lien absolu avec l'URL-alias correct.

Donc, la fonction url () - semble être déconseillée; Quelle est la méthode Drupal-8?.

16
Nicensin

Vous devez utiliser la classe \Drupal\Core\Url , en particulier sa méthode fromRoute static. Drupal 8 utilise des routes dont le nom est différent de leur chemin d’URL actuel. Dans votre cas, la route à utiliser est la route canonique pour une entité de noeud: entity.node.canonical. \Drupal\Core\Url::fromRoute() ne retournera pas une chaîne, mais un objet. Pour obtenir l'URL sous forme de chaîne, vous devez appeler sa méthode toString() .

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

La méthode statique n’est pas facilement testable, $url->toString() requiert un conteneur initialisé. Vous pouvez remplacer la méthode statique par un appel à UrlGeneratorInterface::generateFromRoute() sur le service url_generator .

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

Malheureusement, cette méthode est marquée comme @internal et vous n'êtes donc pas censé l'utiliser dans le code utilisateur (c'est-à-dire en dehors du noyau Drupal).

29
Pierre Buyle

Créer une URL absolue:

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

Créer un objet de lien absolu:

$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

Si vous avez un objet de nœud complètement chargé, vous pouvez simplement appeler $node->toUrl() pour obtenir l'URL requise. Par défaut, il renvoie une URL canonique pour un nœud ( nœud/NID ), mais il est possible de créer d'autres URL répertoriées dans la définition de l'entité Nœud (voir Drupal\node\Entity\Node.php) .Same est vrai pour les autres types d'entité.

$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, c'est la merde en termes d'obtenir l'URL du champ (version Twig d'obtention de cette URL)

Si vous voulez l'URL (et le titre) qui est dans un champ, vous devez vous rendre à l'objet de la classe: Drupal\Core\Url

Si vous avez le noeud par drupal_entity (Twig Tweaks), alors vous avez: (je vais utiliser "tab" comme ce noeud) tab ['# noeud']. Field_link 

Cela vous donne en utilisant:

tab ['# noeud']. field_link.uri -> l'URI (l'URI n'est pas une URL)

tab ['# noeud']. field_link.title -> le titre

mais ce n'est pas la fin.

il vaut mieux accéder à Drupal\link\Plugin\Field\FieldType\LinkItem en:

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

tab ['# noeud']. champ_lien [0]

(les deux font la même chose)

alors vous pouvez accéder à ce qui est le plus intéressant:

tab ['# noeud']. field_tab_link [0] .getUrl () un objet Drupal\Core\Url

Vous pouvez également accéder à cet objet en utilisant la ligne ci-dessous, à partir de son fichier de modèle de noeud: content.field_link [0] ['# url'] (il s'agit également de l'objet Drupal\Core\Url)

Cet objet a des méthodes:

  • isExternal () -> est un lien vers l'extérieur (c'est-à-dire http://cnn.com )
  • isRouted () -> est un lien vers l'intérieur de votre site
  • getRouteName () -> nom de la route
  • getRouteParameters () -> qui vous donne un tableau de valeurs, ici (nous obtenons l'ID de ce noeud) vous auriez ['node' => ID]

Vous devriez l'utiliser comme ça:

{% 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

Voici ma réponse pour le lien d'édition de noeud.

$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