Создание ссылки из идентификатора узла в Drupal 8
Я проверяю Drupal 8 и пытаюсь создать ссылку на основе идентификатора узла статьи. В Drupal 7 это что-то вроде:
$options = array('absolute' => TRUE);
$nid = 1; // Node ID
$url = url('node/' . $nid, $options);
это приводит к абсолютной ссылке с правильным url-псевдонимом.
таким образом, функция url()-кажется устаревшей; каков путь Drupal-8? Выглядит как действительно базовая функция для меня, но я не смог найти никаких полезных ссылок.
5 ответов
вам нужно использовать \Drupal\Core\Url
класс, в частности его fromRoute
статический метод. Drupal 8 использует маршруты, имена которых отличаются от их фактического URL-пути. В вашем случае используемый маршрут является каноническим маршрутом для объекта узла: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).
создать абсолютный 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's Title</span></a>
Если у вас есть полностью загруженный объект узла, вы можете просто вызвать $node->toUrl()
чтобы получить требуемый URL. По умолчанию он возвращает канонический URL для узла (node / NID), но можно создать другие URL-адреса, перечисленные в определении сущности узла (см. 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));
хе-хе, это дерьмо с точки зрения получения URL из поля (версия Twig получения этого URL)
Если вы хотите URL (и заголовок), который находится в поле, вы должны добраться до объекта класса: Drupal\Core\Url
Если вы получили узел по drupal_entity (Twig Tweaks) тогда у вас есть: (я буду использовать "tab" в качестве этого узла) tab['#node'].field_link
Это дает вам использование:
tab['#node'].field_link.Ури - > Ури (URI не является URL)
tab['#node'].field_link.название -> название
но, это еще не конец.
лучше acess Drupal\link\Plugin\Field\FieldType\LinkItem by:
tab['#node'].field_link.get (0)
tab['#node'].field_link[0]
(оба делают то же самое)
затем вы можете получить доступ к тому, что самое интересное:
tab['#node'].field_tab_link[0].getUrl () a Drupal\Core\Url
вам нужно использовать 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);