2016-02-14 4 views
12

Я проверяю Drupal 8 и пытаюсь создать ссылку на основе идентификатора узла статьи. В Drupal 7 это что-то вроде:Создание ссылки с идентификатора узла в Drupal 8

$options = array('absolute' => TRUE); 
$nid = 1; // Node ID 
$url = url('node/' . $nid, $options); 

Это приводит к абсолютной связи с правильным URL-псевдоним.

Таким образом, функция url() кажется устаревшей; что такое Drupal-8? Похож на действительно базовую функцию для меня, но я не нашел полезных ссылок.

ответ

23

Вам необходимо использовать класс \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).

+0

это сделало это для меня. спасибо за фрагмент! если псевдоним определен, я получаю псевдоним, если не получаю ссылку с .../node/id. – Nicensin

+0

Не могли бы вы объяснить, как его использовать? Где я изменил/добавил код? В теме> препроцесс? Url.php или Core? Трудно найти глобальный ответ, когда мы запустим Drupal .. –

+1

@PaulLeclerc Вы никогда не должны менять что-то в ядре так же, как общее примечание. Вы можете использовать приведенные выше примеры кода там, где вам это нужно. Он работает в каждом файле, где вы можете использовать php. Мы, очевидно, не можем ответить на это за вас, потому что мы не знаем, что вы хотите делать. – Nicensin

-1

Вам необходимо использовать класс 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); 
+1

ОП запрашивает конкретный URL-адрес узла из ID идентификатора, этот ответ является неполным0. Кроме того, ОП запрашивает абсолютный URL-адрес (для исходного кода), этот ответ не дает абсолютного URL-адреса. Наконец, '\ Drupal :: l()' устарел, вместо этого используйте 'Link :: fromTextAndUrl()'. –

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's Title</span></a> 
0

хехе, это дерьмо с точки зрения получения URL из поля (Twig версия получить этот URL)

Если вы хотите URL (и название), который в поле вы должны получить на объект класса: Drupal \ ядро ​​\ Url

Если у вас есть узел, drupal_entity (Twig Tweaks), то у вас есть: (я буду использовать «закладку», как этот узел) . Вкладка [ '# узел'] field_link

Это дает вам с помощью:

вкладку [ '# узла'] field_link..URI -> Ури (URI не URL)

Вкладка [ '# узел'] field_link.title. -> название

, но это не конец.

это лучше Асесс Drupal \ ссылки \ Plugin \ Поле \ FieldType \ LinkItem по:.

вкладки [ '# узла'] field_link.get (0)

Вкладка [ '#node'] field_link [0]

(оба делают то же самое)

, то вы можете получить доступ к что самое интересное:.

Вкладка [ '# узел']. Field_tab_link [0] .getUrl() с Drupal \ Core, \ Url объект.

Вы можете получить доступ к этому объекту также с помощью этой линии снизу, в том, что это шаблон узла файла: content.field_link [0] [ «# URL»] (это также Drupal \ Ядро \ Url объект)

Этот объект имеет методы:

  • isExternal() -> ссылка на внешней стороне (т.е. http://cnn.com.)
  • isRouted() -> ссылка на внутренней части вашего сайта
  • getRouteName() -> Название маршрута
  • getRouteParameters() -> который дает массив значений, здесь (мы получаем идентификатор этого узла) вы бы [ «узел» => 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 %} 
2

в случае, если вы полностью загруженный объект узла, вы можете просто позвонить $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)); 
Смежные вопросы