从Drupal 8中的节点ID创建链接

时间:2016-02-14 19:20:58

标签: drupal drupal-8

我正在检查Drupal 8并尝试根据文章的节点ID生成链接。 在Drupal 7中,它类似于:

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

这导致与正确的url-alias的绝对链接。

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

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的麻烦(获取该URL的Twig版本)

如果你想要一个字段中的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对象)

该对象有方法:

  • isExternal() - &gt;是指向外部的链接(即http://cnn.com
  • isRouted() - &gt;链接到您网站的内部
  • getRouteName() - &gt;路线名称
  • getRouteParameters() - &gt;它为您提供了一系列值,这里(我们获得该节点的ID)您将拥有[&#39; node&#39; =&GT; 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 %}

答案 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');