Создание ссылки из node ID в Drupal 8
Я проверяю Drupal 8 и пытаюсь создать ссылку на основе идентификатора node статьи.
В Drupal 7 это что-то вроде:
$options = array('absolute' => TRUE);
$nid = 1; // Node ID
$url = url('node/' . $nid, $options);
Это приводит к абсолютной ссылке с правильным URL-адресом.
Таким образом, функция url() кажется устаревшей; что такое Drupal-8?
Похож на действительно базовую функцию для меня, но я не нашел полезных ссылок.
Ответы
Ответ 1
Вам нужно использовать класс \Drupal\Core\Url
, в частности его статический метод fromRoute
. Drupal 8 использует маршруты, имена которых отличаются от их фактического URL-адреса. В вашем случае используемым маршрутом является канонический маршрут для объекта node: entity.node.canonical
. \Drupal\Core\Url::fromRoute()
не вернет строку, а объект. Чтобы получить URL-адрес в виде строки, вам необходимо вызвать метод toString()
.
$options = ['absolute' => TRUE];
$url = \Drupal\Core\Url::fromRoute('entity.node.canonical', ['node' => 1], $options);
$url = $url->toString();
Статический метод нелегко проверить, $url->toString()
требуется инициализированный контейнер. Вы можете заменить статический метод на вызов UrlGeneratorInterface::generateFromRoute()
в службе url_generator
.
$options = ['absolute' => TRUE];
$url = $this->url_generator->generateFromRoute('entity.node.canonical', ['node' => 1], $options);
$url = $url->toString();
К сожалению, этот метод помечен как @internal
, поэтому вы не должны использовать его в коде пользователя (т.е. вне ядра Drupal).
Ответ 2
Создать абсолютный URL:
$options = ['absolute' => TRUE];
$url_object = Drupal\Core\Url::fromRoute('entity.node.canonical', ['node' => $nid], $options);
// will output http://example.com/path-to-my-node
Создать абсолютный объект ссылки:
$options = ['absolute' => TRUE, 'attributes' => ['class' => 'this-class']];
$node_title = Drupal\Core\Render\Markup::create('<span>' . $node_title . '</span>');
$link_object = Drupal\Core\Link::createFromRoute($node_title, 'entity.node.canonical', ['node' => $nid], $options);
// will output <a href="http://example.com/path-to-my-node" class="this-class"><span>My Node Title</span></a>
Ответ 3
Если вы полностью загрузили объект node, вы можете просто вызвать $node->toUrl()
, чтобы получить требуемый URL. По умолчанию он возвращает канонический URL-адрес для node (node/NID), но можно создать другие URL-адреса, перечисленные в определении сущности node (см. Drupal\node\Entity\Node.php).
То же самое верно для других типов сущностей.
$options = ['absolute' => TRUE];
$view_link = Link::fromTextAndUrl(t('View'), $node->toUrl('canonical', $options));
$edit_link = Link::fromTextAndUrl(t('Edit'), $node->toUrl('edit-form', $options));
$delete_link = Link::fromTextAndUrl(t('Delete'), $node->toUrl('delete-form', $options));
Ответ 4
Хе-хе, это дерьмо с точки зрения получения URL-адреса из поля (версия Twig для получения этого URL-адреса)
Если вы хотите, чтобы URL (и заголовок) находился в поле, которое нужно получить объекту класса:
Drupal\Ядро\Url
Если вы получили node от drupal_entity (Twig Tweaks), то у вас есть: (я буду использовать вкладку node) tab ['# node ']. field_link
Это дает вам:
tab ['# node']. field_link.uri → URI (URI не URL)
tab ['# node']. field_link.title → заголовок
но это не конец.
лучше не использовать Drupal\link\Plugin\Field\FieldType\LinkItem:
вкладка [ '# node']. Field_link.get(0)
вкладка [ '# node']. Field_link [0]
(оба делают то же самое)
то вы можете получить доступ к наиболее интересным:
tab ['# node']. field_tab_link [0].getUrl() a Drupal\Core\Url.
Вы также можете получить доступ к этому объекту, используя эту строку ниже, из этого шаблона node: content.field_link [0] ['# url'] (это также Drupal\Core\Url)
У этого объекта есть методы:
- isExternal() → является ссылкой на внешний (т.е. http://cnn.com)
- isRouted() → - ссылка на внутреннюю часть вашего сайта.
- getRouteName() → название маршрута
- getRouteParameters() → , который дает вам массив значений, здесь (мы получаем идентификатор этого node), у вас будет ['node' = > ID]
Вы должны использовать его так:
{% set tabURL = tab['#node'].field_link[0].getUrl() %}
{% if tabURL.isExternal() %}
{% set link_path = tab['#node'].field_tab_link.uri %}
{% elseif tabURL.isRouted() %}
{% set link_path = path(tabURL.getRouteName(), tabURL.getRouteParameters()) %} {# /node/12 #}
{% endif %}
Ответ 5
Вот мой ответ на ссылку редактирования узла.
$nodeInfo = $entity->get('nid')->getValue();
$nodeId = $nodeInfo[0]['value'];
$options = ['absolute' => TRUE];
$url = \Drupal\Core\Url::fromRoute('entity.node.edit_form', ['node' => $nodeId], $options);
$url = $url->toString();
Ответ 6
Вам нужно использовать класс Drupal\Core\Url;
.
$url= Url::fromRoute('root', $route_parameters=array());
$link = \Drupal::l(t('label'), $url);
Пример:
Если вы передадите аргумент
$url = Url::fromRoute('test.page', $route_parameters = array('test' => 1));
В противном случае
$url = Url::fromRoute('test.page');
$link = \Drupal::l(t('Label'), $url);