Uzyskaj alias ścieżki z NID (lub obiektu węzła)


22

Mam obiekt węzła i próbuję go użyć, aby uzyskać daną ścieżkę w Drupal 8.

Był drupal_lookup_path()w Drupal 7, ale nie widzę żadnych odpowiedników ani dokumentacji dla Drupal 8.

Jaki jest nowy sposób „Drupala”, aby uzyskać ścieżkę z obiektu węzła?

Czy byłoby to coś prostego $node->get('path')?

To wydaje się proste pytanie, ale absolutnie nie znajduję na nim żadnej dokumentacji.

Zauważ, że nie chcę aliasu ścieżki dla bieżącej ścieżki; Chcę alias ścieżki dla dowolnego węzła, biorąc pod uwagę obiekt węzła lub identyfikator węzła.



Myślę, że może to być duplikat, sprawdź połączone pytanie, na które jest wiele odpowiedzi.
Kevin

Drugie pytanie zawiera odpowiedzi na pytanie, jak uzyskać alias ścieżki dla bieżącej ścieżki, a nie dla węzła, dla którego OP zna identyfikator węzła.
kiamlaluno

To nie jest duplikat - nie chcę bieżącej ścieżki. Chcę, aby ścieżka otrzymała dowolny obiekt węzła lub identyfikator NID.
Jack Ryan,

Tak, to nie jest duplikat, patrz moja odpowiedź.
4k4

Odpowiedzi:


43

Aby uzyskać ścieżkę dla identyfikatora węzła, użyj AliasManager :: getAliasByPath :

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

3
Tak, to wygląda dobrze i jest prostsze niż moje rozwiązanie. Dziękuję Ci!
Jack Ryan,

19

Co z używaniem adresu URL :

use Drupal\Core\Url;    

...

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

5
IIRC, podstawowa różnica między tym a korzystaniem z AliasManager, polega na tym, że zapewni to również działanie procesorów ścieżki wychodzącej, podczas gdy AliasManager po prostu wyszukuje alias. Możesz także pobrać Urlobiekt bezpośrednio jako $node->toUrl().
mpdonadio

1
Znacznie lepsze rozwiązanie.
Patrick

16

Jeśli masz tylko nid, rozwiązanie 4k4

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

Działa świetnie. Ale jeśli masz już obiekt węzła, możesz pominąć krok lub dwa. Węzły faktycznie mają wbudowane metody uzyskiwania adresów URL.

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

Zwróci aliasowany adres URL węzła.

toUrl () zwraca obiekt url. Zobacz tutaj https://api.drupal.org/api/drupal/core%21lib%21Drupal%21Core%21Url.php/class/Url/8.2.x

a toString () to metoda obiektu url, która zwraca ciąg znaków reprezentujący adres url.


9
Zwróć uwagę, że $node->toUrl()->setAbsolute()->toString()zwróci bezwzględny adres URL, przydatny do udostępniania itp.
Tim

2

Możesz także użyć metody load from, path.alias_storageaby zwrócić tablicę szczegółów aliasu lub wartość logiczną false, jeśli nie znaleziono ścieżki dla tego węzła.

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


2

Najlepszy sposób na uzyskanie adresu URL węzła z obiektu węzła

  • Ścieżka bezwzględna : $ node-> toUrl () -> setAbsolute () -> toString ();
  • Ścieżka względna : $ node-> toUrl () -> toString ();

Będzie także obsługiwał język węzłów.


0

Jeśli chcesz uzyskać adres URL aliasu węzła według języków, nie zapomnij użyć takiego języka.

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

Jeśli używasz go w klasie, nie zapomnij poprawnie użyć wstrzykiwania zależności.


-5

Miałem nadzieję na bardziej „drupaleskie” rozwiązanie, ale oto, co postanowiłem zrobić.

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

    $data = $db
        ->select('url_alias', 'u')
        ->fields('u', ['alias'])
        ->condition('source', '/node/' . $nid)
        ->execute()
        ->fetchField();
    return $data;
  }
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.