Como obtenho o caminho base?


16

Eu quero usar o caminho base em um arquivo de modelo Drupal 8. Tentei o seguinte, mas não obtenho o resultado correto.

{{ app.request.baseUrl  }}

{{base_path}}

O que eu preciso é o caminho absoluto para o nó {{ app.request.baseUrl }}/{{ url }}.

Uma solução que encontrei foi colocar esse código em um gancho de pré-processo e passá-lo para o tema.

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

Estou procurando uma solução melhor. O que devo usar em vez do que estou usando?

Respostas:


28

Você pode usar url()para gerar um URL base para qualquer rota no Drupal. Você pode fornecer a <front>rota que, com efeito, será seu URL base.

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

Mas, renderize -o primeiro se você estiver concatenando:

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

Por exemplo:

{{ 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
e se eu quiser obter o caminho absoluto do nó?
Yusef 26/06

2
Em um contexto de nó, a path()função pode ser aplicada para recuperar rota nó:{{ path('entity.node.canonical', {'node': node.id}) }}
Shawn Conn

12

Você quase nunca precisa criar caminhos explicitamente a partir de partes no Drupal 8. Eu usaria algo assim:

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

desculpe-me por editar sua resposta, mas o URL agora é um objeto, devemos convertê-lo em string.
Yusef 27/06

2
Não, você não precisa fazer isso, o modelo pode manipular o objeto url. É bom para outros módulos manter o objeto, para que qualquer pessoa possa alterá-lo a qualquer momento, antes que ele seja renderizado finalmente em galho.
4k4 27/06

@ 4k4 mas eu tentei sem, toStringmas notando show, então eu tentei o kint (url) e vi que é objeto.
Yusef 27/06

Concordo com o @ 4k4 que não deve ser convertido em string e deixado como objeto, para que outros métodos / funções que o consomem não sejam afetados.
Vishal Kumar Sahu

10

Em page.html.twigvocê terá uma {{ base_path }}variável de trabalho . Por que ele não está disponível em todos os modelos, não faço ideia. Como eu acho que deveria ser e todo o resto parece confuso, minha solução preferida é fazer exatamente como o Drupal faz na função de página de pré-processo para qualquer lugar que eu precisar.

Para {{ base_path }}disponibilizar para bloquear modelos em um tema chamado exemplo, adicione este código ao example.themearquivo:

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

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

Conforme observado na resposta aceita fornecida pelo MPD, ao obter o URL de um nó ou de outra entidade, existem métodos para fazer tudo isso por você.

No entanto, existem razões para obter o caminho_ base, como ao exibir imagens que vivem na sua pasta de temas. {{ directory }}fornece o caminho para a pasta do tema, mas deixa de fora o caminho base (geralmente apenas um / mas para preservar o funcionamento adequado do Drupal de um subdiretório de um domínio que não deve ser codificado). Em page.html.twigou em qualquer modelo que tenha o pré-processador acima, isso funcionará para esse fim:

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

E, claro, a resposta de Shawn Conn funciona bem se você pode suprimir seu desejo por modelos bonitos, mas eu não consegui.


3

E de acordo com a documentação da página na 8.2.x , duas variáveis ​​globais adicionadas para retornar a página inicial e os URLs do caminho base:

front_page: o URL da primeira página. Use isso em vez de base_path ao vincular à primeira página. Isso inclui o domínio ou o prefixo do idioma.

base_path: o caminho da URL base da instalação do Drupal. Normalmente será "/", a menos que você tenha instalado o Drupal em um subdiretório.

Assim, você pode obter o URL da página de fonte front_pagee o URL base combase_url

Nota

obter o URL da primeira página {{ url('<front>') }}tem um problema quando você deseja concatená-lo com outro caminho, como exemplo

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

Retorna

Array/landing-page?invitecode= 

esse meio, por padrão, não é texto e retorna uma matriz capaz de renderizar


2

Dentro

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

& no arquivo de modelo você pode chamar via

{{ base_path ~ directory }}

2

Até agora, este tópico não traz nenhuma solução adequada. Podemos concatená-lo usando render_val ()

Aqui está a maneira como eu a usei, para obter o caminho absoluto de uma imagem de entidade:

{% 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)  %}

Primeiro, obtemos o URL base do site. Então precisamos remover um extra /. Em seguida, concatenamos nosso caminho base com o caminho relativo da imagem.


2

Todas as opções acima falharam para mim, porque eu tenho os caminhos de idioma configurados, portanto, o URL da minha primeira página se parece https://example.com/en.

Acabei usando esse código para obter o URL base real do meu site:

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

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

Eu sei que você já marcou isso como correto, mas isso pode ser usado como um elemento ramificado em um arquivo de modelo sem nenhum trabalho extra. Encontrei isso no bloco - system-branding-block.html.twig do tema Classy. Então você pode usá-lo assim:

<a href="{{ path('<front>') }}" title="{{ 'Home'|t }}" rel="home">{{ site_name }}</a>
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.