Wie erhalte ich den Basispfad?

16

Ich möchte den Basispfad in einer Drupal 8-Vorlagendatei verwenden. Ich habe Folgendes versucht, aber ich erhalte nicht das richtige Ergebnis.

{{ app.request.baseUrl  }}

{{base_path}}

Was ich brauche, ist der absolute Pfad zum Knoten {{ app.request.baseUrl }}/{{ url }}.

Eine Lösung, die ich gefunden habe, besteht darin, diesen Code in einen Vorverarbeitungs-Hook zu setzen und ihn an das Thema zu übergeben.

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

Ich suche nach einer besseren Lösung. Was könnte ich anstelle des von mir verwendeten verwenden?

Yusef
quelle

Antworten:

28

Sie können url()eine Basis-URL für jede Route in Drupal erstellen. Sie können die <front>Route angeben, die Ihre Basis-URL sein wird.

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

Aber rendern Sie es zuerst, wenn Sie es verketten:

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

Beispielsweise:

{{ 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"
Shawn Conn
quelle
1
und wenn ich Knoten absoluten Pfad bekommen will?
Yusef
2
In einem Knotenkontext kann die path()Funktion zum Abrufen der {{ path('entity.node.canonical', {'node': node.id}) }}
Shawn Conn,
12

Sie müssen in Drupal 8 so gut wie nie explizit Pfade aus Teilen erstellen. Ich würde folgendermaßen vorgehen:

function FOO_preprocess_node(&$variables) {
  /** @var \Drupal\node\NodeInterface $node */
  $node = $variables['node'];
  $variables['url'] = $node->toUrl('canonical', [
    'absolute' => TRUE,
    'language' => $node->language(),
  ])->toString();
}
mpdonadio
quelle
Bitte entschuldigen Sie, dass ich Ihre Antwort bearbeite, aber die URL ist jetzt ein Objekt. Wir sollten sie in eine Zeichenfolge konvertieren.
Yusef
2
Nein, das brauchen Sie nicht zu tun, die Vorlage kann das URL-Objekt verarbeiten. Es ist nett, wenn andere Module das Objekt behalten, damit jeder es jederzeit ändern kann, bevor es endgültig im Zweig gerendert wird.
4. April,
@ 4k4 hab ich aber ohne toStringaber noting show ausprobiert, dann habe ich kint (url) ausprobiert und gesehen das es objekt ist.
Yusef
Ich stimme @ 4k4 zu, dass es nicht in einen String konvertiert und als Objekt belassen werden sollte, damit andere Methoden / Funktionen, die es verbrauchen, nicht betroffen sind.
Vishal Kumar Sahu
10

In page.html.twigIhnen wird eine Arbeits haben {{ base_path }}variabel. Warum es nicht in jeder Vorlage verfügbar ist, weiß ich nicht. Wie ich denke, sollte es sein und alles andere sieht chaotisch aus, ist meine bevorzugte Lösung, genau wie Drupal in der Vorverarbeitungsseitenfunktion für jeden Ort zu tun, den ich brauche.

{{ base_path }}Fügen Sie der example.themeDatei den folgenden Code hinzu, um das Blockieren von Vorlagen in einem Thema mit dem Namen example verfügbar zu machen :

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

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

Wie in der akzeptierten Antwort von MPD angegeben, gibt es Methoden, um alles für Sie zu erledigen, wenn Sie die URL eines Knotens oder einer anderen Entität abrufen.

Es gibt jedoch Gründe für das Abrufen des base_path, z. B. beim Anzeigen von Bildern, die sich in Ihrem Themenordner befinden. {{ directory }}Liefert den Pfad zum Theme-Ordner, lässt jedoch den Basispfad unberücksichtigt (normalerweise nur ein /, um die ordnungsgemäße Funktion von Drupal in einem Unterverzeichnis einer Domain zu erhalten, das nicht fest codiert werden sollte). Auf page.html.twigoder in einer Vorlage, die den obigen Vorprozessor hat, funktioniert dies für diesen Zweck:

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

Und natürlich funktioniert Shawn Conns Antwort gut, wenn Sie Ihren Wunsch nach hübschen Vorlagen unterdrücken können, aber ich konnte nicht.

mlncn
quelle
3

Und laut Page Documentation auf 8.2.x wurden zwei globale Variablen hinzugefügt, um die URLs der Startseite und des Basispfads zurückzugeben:

front_page: Die URL der Startseite. Verwenden Sie dies anstelle von base_path, wenn Sie auf die Startseite verlinken. Dies schließt die Sprachdomäne oder das Präfix ein.

base_path: Der Basis-URL-Pfad der Drupal-Installation. Wird normalerweise "/" sein, es sei denn, Sie haben Drupal in einem Unterverzeichnis installiert.

So können Sie Schriftart Seite URL mit bekommen front_pageund Basis - URL mitbase_url

Hinweis

Das {{ url('<front>') }}Abrufen der URL der ersten Seite mit hat ein Problem, wenn Sie sie beispielsweise mit einem anderen Pfad verknüpfen möchten

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

Rückkehr

Array/landing-page?invitecode= 

Dies bedeutet, dass es sich standardmäßig nicht um Text handelt, und gibt ein renderbares Array an twig zurück

Yusef
quelle
2

Im

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

& In der Vorlagendatei können Sie über aufrufen

{{ base_path ~ directory }}
Julia
quelle
2

Bisher bringt dieser Thread keine richtige Lösung. Wir können es mit render_val () verketten

So habe ich es benutzt, um den absoluten Pfad eines Entity-Images zu ermitteln:

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

Zunächst erhalten wir die Basis-URL der Site. Dann müssen wir ein extra / entfernen. Dann verketten wir unseren Basispfad mit unserem relativen Bildpfad.

Denis Kolmerschlag
quelle
2

Alle oben genannten Fehler sind für mich aufgetreten, da ich Sprachpfade eingerichtet habe, sodass die URL meiner Startseite so aussieht https://example.com/en.

Schließlich habe ich diesen Code verwendet, um die tatsächliche Basis-URL für meine Website abzurufen:

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

Ich weiß, dass Sie dies bereits als korrekt markiert haben, aber dies kann ohne zusätzliche Arbeit als Zweigelement in einer Vorlagendatei verwendet werden. Ich fand dies im Block - system-branding-block.html.twig aus dem Thema Classy. Du kannst es also so benutzen:

<a href="{{ path('<front>') }}" title="{{ 'Home'|t }}" rel="home">{{ site_name }}</a>
owenpm3
quelle