¿Cómo obtengo el camino base?


16

Quiero usar la ruta base en un archivo de plantilla Drupal 8. Intenté lo siguiente, pero no obtengo el resultado correcto.

{{ app.request.baseUrl  }}

{{base_path}}

Lo que necesito es la ruta absoluta al nodo {{ app.request.baseUrl }}/{{ url }}.

Una solución que encontré es poner este código en un enlace de preproceso y pasarlo al tema.

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

Estoy buscando una mejor solución. ¿Qué debería usar en lugar del que estoy usando?

Respuestas:


28

Puede usarlo url()para generar una URL base para cualquier ruta en Drupal. Puede proporcionar la <front>ruta que, en efecto, será su URL base.

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

Pero, renderízalo primero si lo estás concatenando:

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

Por ejemplo:

{{ 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
y si quiero obtener la ruta absoluta del nodo?
Yusef

2
En un contexto de nodo, la path()función se puede aplicar para recuperar la ruta del nodo:{{ path('entity.node.canonical', {'node': node.id}) }}
Shawn Conn

12

Casi nunca necesita construir explícitamente rutas a partir de partes en Drupal 8. Yo iría con algo como esto:

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

discúlpeme para editar su respuesta, pero url ahora es un objeto, deberíamos convertirlo en cadena.
Yusef

2
No, no necesita hacer eso, la plantilla puede manejar el objeto url. Es bueno para otros módulos mantener el objeto, para que cualquiera pueda cambiarlo en cualquier etapa, antes de que finalmente se procese en rama.
4k4

@ 4k4 pero lo intenté sin tener en toStringcuenta show, luego probé kint (url) y vi que era un objeto.
Yusef

Estoy de acuerdo con @ 4k4 en que no debe convertirse en cadena y dejarse como objeto para que otros métodos / funciones que lo consuman no se vean afectados.
Vishal Kumar Sahu

10

En page.html.twigusted tendrá una {{ base_path }}variable de trabajo . Por qué no está disponible en todas las plantillas, no tengo idea. Como creo que debería ser y todo lo demás parece desordenado, mi solución preferida es hacer exactamente lo mismo que Drupal en la función de página de preproceso para cualquier lugar donde lo necesite.

Para poner a {{ base_path }}disposición plantillas de bloqueo en un tema llamado ejemplo, agregue este código al example.themearchivo:

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

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

Como se señala en la respuesta aceptada proporcionada por MPD, si obtiene la URL de un nodo u otra entidad, hay métodos para hacerlo todo por usted.

Sin embargo, hay razones para obtener la ruta_base, como cuando se muestran imágenes que viven en su carpeta de temas. {{ directory }}proporciona la ruta a la carpeta del tema, pero deja fuera la ruta base (generalmente solo un / pero para preservar el correcto funcionamiento de Drupal desde un subdirectorio de un dominio que no debería estar codificado). En page.html.twigcualquier plantilla que tenga el preprocesador anterior, esto funcionará para ese propósito:

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

Y, por supuesto, la respuesta de Shawn Conn funciona bien si puedes suprimir tu deseo de plantillas bonitas, pero no pude.


3

Y de acuerdo con la documentación de la página en 8.2.x , se agregaron dos variables globales para volver a la página principal y a las URL de ruta base:

front_page: la URL de la página principal. Use esto en lugar de base_path cuando se vincule a la página principal. Esto incluye el dominio o prefijo de idioma.

ruta_base: la ruta URL base de la instalación de Drupal. Por lo general, será "/" a menos que haya instalado Drupal en un subdirectorio.

Para que pueda obtener la fuente de la URL de la página front_pagey la base de la URL conbase_url

Nota

obtener la URL de la página principal {{ url('<front>') }}tiene un problema cuando desea concat con otra ruta, como ejemplo

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

regreso

Array/landing-page?invitecode= 

Esto significa que, por defecto, no es texto y devuelve una matriz capaz de renderizar a Twig


2

En

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

y en el archivo de plantilla puede llamar a través de

{{ base_path ~ directory }}

2

Hasta ahora este hilo no trae ninguna solución adecuada. Podemos concatenarlo usando render_val ()

Aquí está la forma en que lo usé, para obtener la ruta absoluta de una imagen de entidad:

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

Primero, obtenemos la URL base del sitio. Entonces necesitamos eliminar un extra /. Luego concatenamos nuestra ruta base con nuestra ruta relativa de imagen.


2

Todo lo anterior me falló porque tengo configuradas las rutas de idioma, por lo que la URL de mi página principal se ve así https://example.com/en .

Terminé usando este código para obtener la URL base real de mi sitio:

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

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

Sé que ya has marcado esto como correcto, pero esto se puede usar como un elemento de ramita en un archivo de plantilla sin ningún trabajo adicional. Encontré esto en el bloque - system-branding-block.html.twig del tema Classy. Entonces puedes usarlo así:

<a href="{{ path('<front>') }}" title="{{ 'Home'|t }}" rel="home">{{ site_name }}</a>
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.