在 Drupal 8 中从节点 ID 创建 link

Creating a link from node ID in Drupal 8

我正在检查 Drupal 8 并尝试根据文章的节点 ID 生成 link。 在 Drupal 7 中是这样的:

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

这将导致具有正确 url 别名的绝对 link。

因此 url() 函数似乎已被弃用;什么是 Drupal-8 方式? 对我来说看起来像是一个非常基本的功能,但我找不到任何有用的参考资料。

您需要使用\Drupal\Core\Url class, specifically its fromRoute static method. Drupal 8 uses routes which have name different from their actual URL path. In your case, the route to use is the canonical route for a node entity: entity.node.canonical. \Drupal\Core\Url::fromRoute() will not return a string, but an object. To get the URL as a string, you need to call its toString()方法。

$options = ['absolute' => TRUE];
$url = \Drupal\Core\Url::fromRoute('entity.node.canonical', ['node' => 1], $options);
$url = $url->toString();

静态方法不容易测试,$url->toString()需要一个初始化的容器。您可以通过调用 UrlGeneratorInterface::generateFromRoute() on the url_generator 服务来替换静态方法。

$options = ['absolute' => TRUE];
$url = $this->url_generator->generateFromRoute('entity.node.canonical', ['node' => 1], $options);
$url = $url->toString();

不幸的是,这个方法被标记为 @internal 所以你不应该在用户代码中使用它(即在 Drupal 核心之外)。

您需要使用 Drupal\Core\Url; class.

$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);

创建绝对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

创建绝对 link 对象:

$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>

呵呵,这就是从字段中获取 URL 的问题(获取 URL 的 Twig 版本)

如果您想要字段中的 URL(和标题),您必须到达 class 的 object: Drupal\Core\Url

如果您通过 drupal_entity(Twig Tweaks)获得节点,那么您有:(我将使用 "tab" 作为该节点)tab['#node'].field_link

这给你使用:

tab['#node'].field_link.uri -> URI(URI 不是 URL)

tab['#node'].field_link.title -> 标题

但是,这还没有结束。

最好通过以下方式访问 Drupal\link\Plugin\Field\FieldType\LinkItem

tab['#node'].field_link.get(0)

tab['#node'].field_link[0]

(两者都一样)

然后您可以访问最有趣的内容:

tab['#node'].field_tab_link[0].getUrl()一个Drupal\Core\Url object。

您也可以通过使用下面这一行从节点模板文件中访问此 object:content.field_link[0]['#url' ](这也是Drupal\Core\Urlobject)

那个object有方法:

  • isExternal() -> link 到外部(即 http://cnn.com
  • isRouted() -> link 到您的站点内部
  • getRouteName() -> 路线名称
  • getRouteParameters() -> 它给你一个值数组,这里(我们得到那个节点的 ID)你会有 ['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 %}

如果您已完全加载节点对象,您只需调用 $node->toUrl() 即可获得所需的 URL。默认情况下,它 returns 规范 URL 用于节点 (node/NID) 但可以构建节点中列出的其他 URLs实体定义(参见 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));

这是我对节点编辑的回答 link。

$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();

我已经准备好在这里被否决了。抱歉,我还没有完全接受。

在 Drupal 7 中(仅)28 个字符,我仍然记得和打字很好。

l($node->title, $node->nid);

我想这样的事情可能会提高 D8 编码器的生活质量。

      function d8l ($text, $nid, $some_options)  {
         $options = [
           'query' => ['foo' => 'bar'],
           'fragment' => 'anchor-div',
           'attributes' => ['class' => ['my-class'], 'rel' =>'nofollow'],
         ];
         $link = Link::fromTextAndUrl(t($text), 
         Url::fromUri('internal:/node/' . $nid, $options))->toString();
         return $link;
       }   

我发现使用 $node object 更容易。然后让我的 IDE 向我展示 object 的所有可用方法。所以最简单的就是

$link = $node->toLink();

这会让您 link 到 full-page 节点,节点标题作为 link 文本。

如果你想改变title/route,你可以做类似

的事情
$link = $node->toLink('Edit this node', 'edit-form');

具有正确语言前缀的完整绝对路径:

$url_options = [
  'absolute' => TRUE,
  'language' => \Drupal::languageManager()->getCurrentLanguage(),
];
$Path = Url::fromRoute('entity.node.canonical', ['node' => 81], $url_options)->toString();
// prints https://example.com/fr/mon-page

这里有一些很好的答案和很多有用的信息。对于编辑链接,如果你有节点,我可以这样做 $options = [ 'absolute' => TRUE, 'language' => \Drupal::languageManager()->getCurrentLanguage(), ];

editurl = $edit_node->toUrl('edit-form', $options)->toString();

更多信息在drupal/web/core/lib/Drupal/Core/Entity/EntityInterface.php