我正在检查Drupal 8并尝试根据文章的节点ID生成链接。 在Drupal 7中,它类似于:
$options = array('absolute' => TRUE);
$nid = 1; // Node ID
$url = url('node/' . $nid, $options);
这导致与正确的url-alias的绝对链接。
所以url() - 函数似乎已被弃用;什么是Drupal-8方式? 看起来对我来说是一个非常基本的功能,但我找不到任何有用的参考资料。
答案 0 :(得分:30)
您需要使用\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核心之外)。
答案 1 :(得分:5)
创建绝对网址:
$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>
答案 2 :(得分:3)
如果您已完全加载节点对象,只需调用$node->toUrl()
即可获取所需的URL。默认情况下,它返回节点的规范URL(节点/ NID ),但可以构建节点实体定义中列出的其他URL(请参阅 Drupal \ node \ Entity \ Node.php)< / em>的。
其他实体类型也是如此。
$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));
答案 3 :(得分:2)
如果你想要一个字段中的URL(和标题),你必须得到类的对象: 的的Drupal \核心\网址
如果您通过 drupal_entity (Twig Tweaks)获得节点,那么您有:(我将使用&#34; tab&#34;作为该节点)标签[& #39;#node&#39;]。field_link
这可以通过以下方式使用:
标签[&#39; #stode&#39;]。field_link.uri - &gt; URI (URI不是URL)
标签[&#39; #stode&#39;]。field_link.title - &gt;标题
但是,那不是结束。
通过以下方式访问 Drupal \ link \ Plugin \ Field \ FieldType \ LinkItem 会更好:
标签[&#39;#节点&#39]。field_link.get(0)强>
标签[&#39;#节点&#39]。FIELD_LINK [0] 强>
(两者都做同样的)
然后您可以访问最有趣的内容:
标签[&#39; #stode&#39;]。field_tab_link [0] .getUrl() a Drupal \ Core \ Url 对象。
您也可以在该节点模板文件中使用以下一行来访问此对象: content.field_link [0] [&#39;#url&#39;] (这也是Drupal \ Core \ Url对象)
该对象有方法:
你应该这样使用它:
{% 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 %}
答案 4 :(得分:1)
这是我对节点编辑链接的回答。
$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();
答案 5 :(得分:0)
您需要使用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);
答案 6 :(得分:0)
我准备在这里被打败。抱歉,我还没有完全接受。
在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;
}
答案 7 :(得分:0)
我发现使用 $node 对象更容易。然后让我的 IDE 向我展示该对象的所有可用方法。所以最简单的是
$link = $node->toLink();
这会为您提供一个指向整页节点的链接,并将节点标题作为链接文本。
如果你想改变标题/路线,你可以这样做
$link = $node->toLink('Edit this node', 'edit-form');