Получить псевдоним пути из NID (или объекта узла)
У меня есть объект узла, и я пытаюсь использовать его для получения заданного пути в Drupal 8.
В Drupal 7 был drupal_lookup_path()
, но я не вижу никакого эквивалента или документации для Drupal 8.
Каков новый способ "Drupal" получить путь от объекта узла?
Будет ли это что-то простое, например $node->get('path')
?
Это кажется простым вопросом, но я просто абсолютно не нахожу никакой документации по нему.
Обратите внимание, что мне не нужен псевдоним пути для текущий путь; Мне нужен псевдоним пути для произвольного узла, заданный объектом узла или идентификатором узла.
8 answers
Чтобы получить путь для идентификатора узла, используйте aliasmanager::getaliasbypath:
Друпал 8
$alias = \Drupal::service('path.alias_manager')->getAliasByPath('/node/'.$nid);
В соответствии с новой записью об изменении в Drupal 8.8.0 и выше path.alias_manager
устарел и введен path_alias.manager
.
Новый синтаксис выглядит следующим образом:
$url_alias = \Drupal::service('path_alias.manager')->getAliasByPath('/node/'. $nid, $langcode);
Если у вас есть только nid, решение 4k4
$alias = \Drupal::service('path.alias_manager')->getAliasByPath('/node/'.$nid);
Отлично работает. Но если у вас уже есть объект узла, вы можете пропустить один или два шага. Узлы на самом деле имеют встроенные методы получения URL-адресов.
$node->toUrl()->toString();
Вернет псевдоним URL-адреса узла.
Функция toURL() возвращает объект url. Смотрите здесь https://api.drupal.org/api/drupal/core%21lib%21Drupal%21Core%21Url.php/class/Url/8.2.x
И toString() - это метод объекта url, который возвращает строку представление URL-адреса.
Лучший способ получить URL-адрес узла из объекта узла -
- Абсолютный путь: $узел->Турл()->setabsolute()->toString();
- Относительный путь: $узел->Турл()->Строка();
Он также будет обрабатывать язык узлов.
Вы также можете использовать метод загрузки из path.alias_storage
, чтобы вернуть массив сведений об псевдониме или логическое значение false, если для этого узла не был найден путь.
$aliasArray = \Drupal::service('path.alias_storage')->load(['source' => '/node/' . $nid]);
Если вы хотите получить URL-адрес псевдонима узла с помощью языков, не забудьте использовать такой язык.
$alias_url = \Drupal::service('path.alias_manager')->getAliasByPath('/node/'. $nid, $langcode);
Если вы используете его в классе, не забудьте правильно использовать инъекцию зависимостей.
В соответствии с новой записью об изменении в Drupal 8.8.0 path.alias_manager
устарело и введено path_alias.manager
.
Новый синтаксис выглядит следующим образом:
$url_alias = \Drupal::service('path_alias.manager')->getAliasByPath('/node/'. $nid, $langcode);
Я надеялся на более "друпалеское" решение, но вот что я сделал сам, чтобы выполнить эту работу:
function getPathFromNID($nid) {
$db = \Drupal::database();
$data = $db
->select('url_alias', 'u')
->fields('u', ['alias'])
->condition('source', '/node/' . $nid)
->execute()
->fetchField();
return $data;
}