Подтвердить что ты не робот

Создание ссылки из 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? Похож на действительно базовую функцию для меня, но я не нашел полезных ссылок.

4b9b3361

Ответ 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);