Ottieni alias percorso da NID (o oggetto nodo)


22

Ho un oggetto nodo e sto provando a usarlo per ottenere un determinato percorso in Drupal 8.

C'era drupal_lookup_path()in Drupal 7 ma non vedo alcun equivalente o documentazione per Drupal 8.

Qual è il nuovo modo "Drupal" per ottenere un percorso da un oggetto nodo?

Sarebbe qualcosa di semplice $node->get('path')?

Sembra una domanda semplice, ma non trovo assolutamente alcuna documentazione al riguardo.

Si noti che non voglio l'alias del percorso per il percorso corrente; Voglio l'alias del percorso per un nodo arbitrario, dato un oggetto nodo o un ID nodo.



Penso che questo potrebbe essere un duplicato, controlla la domanda collegata ci sono molte risposte.
Kevin,

L'altra domanda ha risposte che dicono come ottenere l'alias del percorso per il percorso corrente, non per un nodo per il quale l'OP conosce l'ID nodo.
kiamlaluno

Non è un duplicato, non voglio il percorso attuale. Voglio il percorso dato un oggetto nodo NID o NID.
Jack Ryan,

Sì, questo non è un duplicato, vedi la mia risposta.
4k4

Risposte:


43

Per ottenere il percorso per un ID nodo utilizzare AliasManager :: getAliasByPath :

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

3
Sì, sembra giusto ed è più semplice della mia soluzione. Grazie!
Jack Ryan,

19

Che ne dici di usare Url :

use Drupal\Core\Url;    

...

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

5
IIRC, la principale differenza tra questo e l'utilizzo di AliasManager, è che ciò garantirà anche l'esecuzione dei processori di percorsi in uscita, mentre AliasManager esegue solo la ricerca di alias. Puoi anche ottenere l' Urloggetto direttamente come $node->toUrl().
mpdonadio

1
Soluzione molto migliore.
Patrick,

16

Se hai solo il nid, la soluzione di 4k4 di

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

Funziona alla grande. Ma se hai già un oggetto nodo puoi saltare un passo o due. I nodi hanno effettivamente metodi integrati per ottenere gli URL.

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

Restituirebbe l'URL con alias del nodo.

toUrl () restituisce un oggetto url. Vedi qui https://api.drupal.org/api/drupal/core%21lib%21Drupal%21Core%21Url.php/class/Url/8.2.x

e toString () è un metodo dell'oggetto url che restituisce la rappresentazione in formato stringa dell'url.


9
Nota che $node->toUrl()->setAbsolute()->toString()restituirà l'URL assoluto, utile per la condivisione, ecc.
Tim

2

È inoltre possibile utilizzare il metodo load da path.alias_storageper restituire un array di dettagli alias o false booleani se non è stato trovato un percorso per quel nodo.

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


2

Il modo migliore per ottenere l'URL del nodo dall'oggetto nodo-

  • Percorso assoluto : $ node-> toUrl () -> setAbsolute () -> toString ();
  • Percorso relativo : $ node-> toUrl () -> toString ();

Gestirà anche il linguaggio dei nodi.


0

Se vuoi ottenere l'URL dell'alias del nodo in base alle lingue, non dimenticare di usare la lingua in questo modo.

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

Se lo stai usando in una classe, non dimenticare di usare correttamente l'iniezione delle dipendenze.


-5

Speravo in una soluzione più "drupalesca", ma ecco cosa mi sono fatto fare il lavoro:

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

    $data = $db
        ->select('url_alias', 'u')
        ->fields('u', ['alias'])
        ->condition('source', '/node/' . $nid)
        ->execute()
        ->fetchField();
    return $data;
  }
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.