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.