在 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
我正在检查 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