Obtenir l'alias de chemin à partir du NID (ou de l'objet nœud)


22

J'ai un objet nœud, et j'essaie de l'utiliser pour obtenir un chemin donné dans Drupal 8.

Il y en avait drupal_lookup_path()dans Drupal 7 mais je ne vois aucun équivalent ou documentation pour Drupal 8.

Quelle est la nouvelle façon "Drupal" d'obtenir un chemin à partir d'un objet nœud?

Serait-ce quelque chose de simple comme $node->get('path')?

Cela semble être une question simple, mais je ne trouve absolument aucune documentation à ce sujet.

Remarquez que je ne veux pas l'alias de chemin pour le chemin actuel; Je veux l'alias de chemin pour un nœud arbitraire, étant donné un objet de nœud ou un ID de nœud.



Je pense que cela pourrait être un doublon, vérifiez la question liée, il y a beaucoup de réponses.
Kevin

L'autre question a des réponses disant comment obtenir l'alias de chemin pour le chemin actuel, pas pour un nœud pour lequel l'OP connaît l'ID du nœud.
kiamlaluno

Ce n'est pas un doublon - je ne veux pas le chemin actuel. Je veux le chemin donné un objet de nœud arbitraire ou NID.
Jack Ryan

Oui, ce n'est pas un doublon, voir ma réponse.
4k4

Réponses:


43

Pour obtenir le chemin d'accès d'un identifiant de nœud, utilisez AliasManager :: getAliasByPath :

$alias = \Drupal::service('path.alias_manager')->getAliasByPath('/node/'.$nid);

3
Oui, cela semble correct et est plus simple que ma solution. Merci!
Jack Ryan

19

Qu'en est-il de l'utilisation de l' URL :

use Drupal\Core\Url;    

...

$url = Url::fromRoute('entity.node.canonical', ['node' => $nid])->toString();

5
IIRC, la principale différence entre cela et l'utilisation d'AliasManager, est que cela garantira également que les processeurs de chemin sortant s'exécutent, tandis qu'AliasManager ne fait que la recherche d'alias. Vous pouvez également obtenir l' Urlobjet directement sous $node->toUrl().
mpdonadio

1
Une bien meilleure solution.
Patrick

16

Si vous n'avez que le nid, la solution de 4k4 de

$alias = \Drupal::service('path.alias_manager')->getAliasByPath('/node/'.$nid);

Fonctionne très bien. Mais si vous avez déjà un objet nœud, vous pouvez ignorer une étape ou deux. Les nœuds ont en fait des méthodes intégrées pour obtenir des URL.

$node->toUrl()->toString();

Renverrait l'URL aliasée du nœud.

toUrl () renvoie un objet url. Voir ici https://api.drupal.org/api/drupal/core%21lib%21Drupal%21Core%21Url.php/class/Url/8.2.x

et toString () est une méthode de l'objet url qui renvoie la représentation sous forme de chaîne de l'url.


9
Notez que $node->toUrl()->setAbsolute()->toString()cela renverra l'URL absolue, utile pour le partage, etc.
Tim

2

Vous pouvez également utiliser la méthode de chargement de path.alias_storagepour renvoyer un tableau des détails d'alias ou booléen false si aucun chemin n'a été trouvé pour ce nœud.

$aliasArray = \Drupal::service('path.alias_storage')->load(['source' => '/node/' . $nid]);


2

Meilleure façon d'obtenir l'URL du nœud à partir de l'objet nœud-

  • Chemin absolu : $ node-> toUrl () -> setAbsolute () -> toString ();
  • Chemin relatif : $ node-> toUrl () -> toString ();

Il gérera également le langage du nœud.


0

Si vous voulez obtenir l'url d'alias de noeud par langues, n'oubliez pas d'utiliser la langue comme celle-ci.

$alias_url = \Drupal::service('path.alias_manager')->getAliasByPath('/node/'. $nid, $langcode);

Si vous l'utilisez dans une classe n'oubliez pas d'utiliser correctement l'injection de dépendances.


-5

J'espérais une solution plus "Drupalesque", mais voici ce que je me suis fait pour faire le boulot:

  function getPathFromNID($nid) {
    $db = \Drupal::database();

    $data = $db
        ->select('url_alias', 'u')
        ->fields('u', ['alias'])
        ->condition('source', '/node/' . $nid)
        ->execute()
        ->fetchField();
    return $data;
  }
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.