Come posso ottenere il percorso di base?


16

Voglio usare il percorso di base in un file modello Drupal 8. Ho provato quanto segue, ma non ottengo il risultato corretto.

{{ app.request.baseUrl  }}

{{base_path}}

Quello di cui ho bisogno è il percorso assoluto verso il nodo {{ app.request.baseUrl }}/{{ url }}.

Una soluzione che ho trovato è mettere questo codice in un hook di preelaborazione e passarlo al tema.

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

Sto cercando una soluzione migliore. Cosa potrei usare al posto di quello che sto usando?

Risposte:


28

Puoi usare url()per generare un URL di base per qualsiasi percorso in Drupal. Puoi fornire il <front>percorso che, in effetti, sarà il tuo URL di base.

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

Ma renderlo per primo se lo stai concatenando:

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

Per esempio:

{{ 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 voglio ottenere il percorso assoluto del nodo?
Yusef,

2
In un contesto di nodo, la path()funzione può essere applicata per recuperare la rotta del nodo:{{ path('entity.node.canonical', {'node': node.id}) }}
Shawn Conn,

12

Non hai quasi mai bisogno di costruire esplicitamente percorsi da parti in Drupal 8. Vorrei andare con qualcosa del genere:

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

scusami per modificare la tua risposta, ma ora l'URL è un oggetto, dovremmo convertirlo in stringa.
Yusef,

2
No, non è necessario, il modello può gestire l'oggetto url. È bello che altri moduli mantengano l'oggetto, in modo che chiunque possa cambiarlo in qualsiasi momento, prima che venga reso finalmente in ramoscello.
4k4,

@ 4k4 ma ho provato senza toStringnotare lo spettacolo, quindi ho provato kint (url) e ho visto che è oggetto.
Yusef,

Sono d'accordo con @ 4k4 che non dovrebbe essere convertito in stringa e lasciato come oggetto in modo che altri metodi / funzioni che lo consumano non siano interessati.
Vishal Kumar Sahu,

10

In page.html.twigsi avrà un lavoro {{ base_path }}variabile. Perché non è disponibile in tutti i modelli, non ne ho idea. Come penso che dovrebbe essere e tutto il resto sembra disordinato, la mia soluzione preferita è fare esattamente come Drupal fa nella funzione di pagina di pre-elaborazione per qualsiasi luogo in cui ne ho bisogno.

Per rendere {{ base_path }}disponibile il blocco dei modelli in un tema chiamato esempio, aggiungi questo codice al example.themefile:

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

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

Come indicato nella risposta accettata fornita da MPD, se si ottiene l'URL di un nodo o di un'altra entità ci sono metodi per fare tutto per te.

Tuttavia, ci sono motivi per ottenere base_path, ad esempio quando si visualizzano immagini che vivono nella cartella del tema. {{ directory }}fornisce il percorso alla cartella del tema, ma lascia il percorso di base (di solito solo un / ma per preservare il corretto funzionamento di Drupal da una sottodirectory di un dominio che non dovrebbe essere codificato). Su page.html.twigo in qualsiasi modello che ha il preprocessore sopra, funzionerà a tale scopo:

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

E ovviamente la risposta di Shawn Conn funziona bene se riesci a sopprimere il tuo desiderio di modelli graziosi, ma non potrei.


3

E in base alla documentazione della pagina su 8.2.x , due variabili globali aggiunte per restituire gli URL della pagina iniziale e del percorso di base:

front_page: l'URL della prima pagina. Utilizzare questo invece di base_path quando si collega alla prima pagina. Ciò include il dominio o il prefisso della lingua.

base_path: il percorso URL di base dell'installazione di Drupal. Di solito sarà "/" a meno che non sia stato installato Drupal in una sottodirectory.

Quindi puoi ottenere l'URL della pagina dei caratteri con front_pagee l'URL di base conbase_url

Nota

ottenere l'URL della prima pagina {{ url('<front>') }}ha un problema quando si desidera concatenerlo con un altro percorso, ad esempio

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

ritorno

Array/landing-page?invitecode= 

questo significa per impostazione predefinita non è il testo e restituisce un array capace di renderizzare a ramoscello


2

Nel

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

e nel file modello puoi chiamare tramite

{{ base_path ~ directory }}

2

Finora questo thread non ha portato alcuna soluzione adeguata. Possiamo concatenarlo usando render_val ()

Ecco come l'ho usato, per ottenere il percorso assoluto di un'immagine di entità:

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

1 ° otteniamo l'URL di base del sito. Quindi dobbiamo rimuovere un extra /. Quindi concateniamo il nostro percorso di base con il percorso relativo dell'immagine.


2

Tutto quanto sopra non è riuscito per me, perché ho impostato i percorsi delle lingue, quindi il mio URL della prima pagina sembra https://example.com/en .

Ho finito per usare questo codice per ottenere l'URL di base effettivo per il mio sito:

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

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

So che hai già contrassegnato questo come corretto, ma può essere utilizzato come elemento ramoscello in un file modello senza alcun lavoro aggiuntivo. Ho trovato questo nel blocco - system-branding-block.html.twig dal tema Classy. Quindi puoi usarlo in questo modo:

<a href="{{ path('<front>') }}" title="{{ 'Home'|t }}" rel="home">{{ site_name }}</a>
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.