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

从Drupal 8中的节点ID创建链接,drupal,drupal-8,Drupal,Drupal 8,我正在签出Drupal8,并尝试根据文章的节点ID生成链接。 在Drupal 7中,它类似于: $options = array('absolute' => TRUE); $nid = 1; // Node ID $url = url('node/' . $nid, $options); 这将生成具有正确url别名的绝对链接 因此,url()函数似乎已被弃用;什么是Drupal-8方式? 对我来说,这是一个非常基本的函数,但我找不到任何有用的引用。您需要使用该类,特别是它的静态方法。Dr

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

$options = array('absolute' => TRUE);
$nid = 1; // Node ID
$url = url('node/' . $nid, $options);
这将生成具有正确url别名的绝对链接

因此,url()函数似乎已被弃用;什么是Drupal-8方式? 对我来说,这是一个非常基本的函数,但我找不到任何有用的引用。

您需要使用该类,特别是它的静态方法。Drupal8使用的路由名称与其实际URL路径不同。在您的情况下,要使用的路由是节点实体的规范路由:
entity.node.canonical
\Drupal\Core\Url::fromRoute()
将不返回字符串,而是返回对象。要将URL作为字符串获取,需要调用其方法

静态方法不容易测试,
$url->toString()
需要初始化的容器。您可以使用对服务的调用来替换静态方法


不幸的是,此方法被标记为
@internal
,因此您不应该在用户代码中使用它(即在Drupal core之外)。

您需要使用
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);
创建绝对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>
$options=['absolute'=>TRUE,'attributes'=>['class'=>'this class']];
$node_title=Drupal\Core\Render\Markup::create('.$node_title'.');
$link\u object=Drupal\Core\link::createFromRoute($node\u title,'entity.node.canonical',['node'=>$nid],$options);
//将输出

呵呵,从字段中获取URL(获取该URL的小枝版本)的角度来看,这是个狗屎

如果想要字段中的URL(和标题),则必须访问类的对象: Drupal\Core\Url

如果您通过drupal_实体(细枝调整)获得节点,那么您有:(我将使用“tab”作为该节点)tab['#node']。field_link

这将通过以下方式为您提供:

选项卡['#节点'].field_link.uri->uri(uri不是URL)

选项卡['#节点'].字段_link.title->标题

但是,这还不是结束

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

选项卡['#节点]。字段链接。获取(0)

选项卡['#节点]。字段链接[0]

(两者的作用相同)

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

tab['#node']。字段#tab_链接[0]。getUrl()aDrupal\Core\Url对象

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

该对象具有以下方法:

  • isExternal()->是指向外部的链接(即)
  • isRouted()->是指向站点内部的链接
  • 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。默认情况下,它返回节点(node/NID)的规范URL,但也可以构建节点实体定义中列出的其他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));

下面是我对节点编辑链接的回答

$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对象更容易。然后让我的IDE向我展示对象的所有可用方法。所以最简单的是

$link=$node->toLink();
这将获得指向完整页面节点的链接,节点标题作为链接文本

如果要更改标题/路线,可以执行以下操作

$link=$node->toLink('Edit this node','Edit form');

这是为我做的。谢谢你的片段!如果定义了别名,我会得到别名,如果没有,我会得到带有…/node/id的链接。您能解释一下如何使用它吗?我在哪里更改/添加代码?在主题>预处理中?php还是内核?当我们开始使用Drupal时,很难找到全局答案。@PaulLeclerc您永远不应该仅仅作为一般性的注释来更改核心中的某些内容。您可以在任何需要的地方使用上面的代码示例。它适用于可以使用php的每个文件。我们显然无法为您回答此问题,因为我们不知道您想做什么。OP专门从ids ID请求节点URL,此答案不完整。0此外,OP请求的是绝对URL(根据原始代码),此答案不会生成绝对URL。最后,不推荐使用
\Drupal::l()
,请改用
Link::fromTextAndUrl()
l($node->title, $node->nid);
      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;
       }