我如何获得基本路径?


16

我想在Drupal 8模板文件中使用基本路径。我尝试了以下操作,但没有得到正确的结果。

{{ app.request.baseUrl  }}

{{base_path}}

我需要的是该节点的绝对路径{{ app.request.baseUrl }}/{{ url }}

我发现的一个解决方案是将这段代码放在预处理钩中,并将其传递给主题。

 $host = \Drupal::request()->getHost(); 
$response = \Drupal::httpClient()

我正在寻找更好的解决方案。我应该用什么代替我正在使用的那个?

Answers:


28

您可以url()用来生成Drupal中任何路由的基础URL。您可以提供<front>实际上是您的基本URL 的路由。

{{ url('<front>') }}

但是,如果要串联它,请首先渲染它:

{{ url('<front>')|render ~ file_url('public://image.jpg') }}

例如:

{{ url('<front>') ~ file_url('public://image.jpg') }}
# Outputs: "Array/sites/all/default/files/image.jpg"

{{ url('<front>')|render ~ file_url('public://image.jpg') }}
# Outputs: "http://example.com/sites/all/default/files/image.jpg"

1
如果我想获取节点的绝对路径?
优素福

2
在节点上下文中,该path()函数可用于检索节点路由:{{ path('entity.node.canonical', {'node': node.id}) }}
Shawn Conn

12

您几乎几乎不需要从Drupal 8的各个部分显式地构建路径。

function FOO_preprocess_node(&$variables) {
  /** @var \Drupal\node\NodeInterface $node */
  $node = $variables['node'];
  $variables['url'] = $node->toUrl('canonical', [
    'absolute' => TRUE,
    'language' => $node->language(),
  ])->toString();
}

向我道歉以编辑您的答案,但是url现在是一个对象,我们应该将其转换为字符串。
优素福

2
不,您不需要这样做,模板可以处理url对象,这对其他模块来说很好,可以保留该对象,以便任何人都可以在任何阶段对其进行更改,直到它最终在树枝中呈现为止。
2016年

@ 4k4,但我尝试toString但没有注意显示,然后尝试了kint(url)并看到它是对象。
优素福

我同意@ 4k4的观点,不应将其转换为字符串并留作对象,这样使用它的其他方法/函数就不会受到影响。
维沙尔·库马尔·萨胡

10

page.html.twig有一个工作{{ base_path }}变量。为什么它不是在每个模板中都没有,我不知道。正如我认为应该的那样,其他一切看起来都很混乱,我的首选解决方案是完全按照Drupal在预处理页面功能中的位置进行操作。

{{ base_path }}在名为example的主题中可用以阻止模板,请将以下代码添加到example.theme文件中:

/**
 * Implements hook_preprocess_block().
 */
function example_preprocess_block(&$variables) {

  $variables['base_path'] = base_path();
}

正如MPD提供的已接受答案中指出的那样,如果获取节点或其他实体的URL,则有一些方法可以为您完成这一切。

但是,有一些获取base_path的原因,例如在显示主题文件夹中的图像时。 {{ directory }}提供了到主题文件夹的路径,但是它保留了基本路径(通常只是一个/,但是为了保留不应被硬编码的域的子目录中的Drupal的正常功能)。在page.html.twig具有上述预处理程序的任何模板上或其中,此模板可用于该目的:

<img src="{{ base_path ~ directory }}/images/nsf1.svg"
     alt="National Science Foundation logo" height="80" width="80" />

当然,如果您可以抑制对漂亮模板的需求,Shawn Conn的答案就可以很好地工作,但是我做不到。


3

并且根据8.2.x上的页面文档,添加了两个全局变量以返回首页和基本路径Urls:

front_page:首页的URL。链接到首页时,使用它代替base_path。这包括语言域或前缀。

base_path:Drupal安装的基本URL路径。除非您在子目录中安装了Drupal,否则通常为“ /”。

因此,您可以获得带有的字体页面网址和带有的front_page基本网址base_url

注意

{{ url('<front>') }}当您想将其与其他路径合并时,获取首页URL 会出现问题

{%  set base_url = url('<front>')  %}
{% set url = [ base_url,'/landing-page?invitecode=' ,invite_code] | join  %}
{{ url }}

返回

Array/landing-page?invitecode= 

这意味着默认情况下不是文本,而是将可渲染的数组返回到树枝


2

function hook_preprocess(&$variables) {
  $variables['base_path'] = base_path();
}

&在模板文件中,您可以通过调用

{{ base_path ~ directory }}

2

到目前为止,该线程尚未带来任何适当的解决方案。我们可以使用render_val()连接它

这是我使用它的方法,用于获取实体图像的绝对路径:

{% set base_url = render_var(url('<front>'))  %}
{% set url = base_url|trim('/', 'right')~file_url(content.field_media[0]['#media'].get('field_image').entity.uri.value)  %}

首先,我们获得网站的基本URL。然后,我们需要删除一个多余的/。然后,我们将基本路径与图像相对路径连接起来。


2

上面的所有步骤对我来说都是失败的,因为我已经设置了语言路径,所以首页URL看起来像https://example.com/en

我最终使用以下代码来获取网站的实际基本URL:

{% set base_url = url('<front>')|render|split('/', -1)|join('/') %}

1
{{ path('<front>') }}

我知道您已经将此标记为正确,但是可以将其用作模板文件中的细枝元素,而无需进行任何额外的工作。我在Classy主题的block--system-branding-block.html.twig中找到了它。因此,您可以像这样使用它:

<a href="{{ path('<front>') }}" title="{{ 'Home'|t }}" rel="home">{{ site_name }}</a>
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.