it-swarm.com.de

Wie erhalte ich den Basispfad?

Ich möchte den Basispfad in einer Vorlagendatei Drupal 8) verwenden. Ich habe Folgendes versucht, erhalte jedoch 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 einzufügen 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?

17
Yusef

Und gemäß Seitendokumentation zu 8.2.x wurden zwei globale Variablen hinzugefügt, um die Urls für die Startseite und den Basispfad 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).

Also können Sie die Schriftseiten-URL mit front_page Und die Basis-URL mit base_url Abrufen.

Hinweis

das Abrufen der URL der Startseite mit {{ url('<front>') }} 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 standardmäßig nicht Text und gibt ein renderfähiges Array an twig zurück

3
Yusef

Mit url() können Sie eine Basis-URL für eine beliebige Route in Drupal generieren. Sie können die <front> Route, die praktisch Ihre Basis-URL ist.

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

Aber render es zuerst, wenn Sie es verketten:

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

Zum Beispiel:

{{ 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"
28
Shawn Conn

Sie müssen fast nie explizit Pfade aus Teilen in Drupal 8.) erstellen. Ich würde mit so etwas gehen:

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

Im page.html.twig du wirst haben ein funktionierendes {{ base_path }} Variable. Warum es nicht in jeder Vorlage verfügbar ist, weiß ich nicht. Wie ich denke, sollte es sein und alles andere sieht chaotisch aus. Meine bevorzugte Lösung besteht darin, genau das zu tun, was Drupal in der Vorverarbeitungsseitenfunktion für jeden Ort tut, an dem ich es brauche.

{{ base_path }} verfügbar, um Vorlagen in einem Thema mit dem Namen example zu blockieren. Fügen Sie diesen Code zum example.theme Datei:

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

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

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

Es gibt jedoch Gründe, den base_path abzurufen, z. B. beim Anzeigen von Bildern, die sich in Ihrem Themenordner befinden. {{ directory }} stellt den Pfad zum Themenordner bereit, lässt jedoch den Basispfad weg (normalerweise nur ein /, um die ordnungsgemäße Funktion von Drupal aus einem Unterverzeichnis einer Domäne zu erhalten, das nicht fest codiert werden sollte). Auf page.html.twig oder in einer Vorlage mit dem oben genannten Präprozessor funktioniert dies zu diesem 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.

10
mlncn

Im

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

& in der Vorlagendatei können Sie über anrufen

{{ base_path ~ directory }}
2
Julia

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

Hier ist die Art und Weise, wie ich es verwendet habe, um den absoluten Pfad eines Entitätsbildes zu erhalten:

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

Zuerst erhalten wir die Basis-URL der Site. Dann müssen wir ein zusätzliches/entfernen. Dann verketten wir unseren Basispfad mit unserem bildrelativen Pfad.

2

Alle oben genannten Punkte sind für mich fehlgeschlagen, da ich Sprachpfade eingerichtet habe, sodass meine URL auf der Startseite wie folgt aussieht: https://example.com/en.

Am Ende habe ich diesen Code verwendet, um die tatsächliche Basis-URL für meine Site zu erhalten:

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

Ich weiß, dass Sie dies bereits als korrekt markiert haben, aber dies kann ohne zusätzliche Arbeit als twig -Element in einer Vorlagendatei verwendet werden. Ich habe dies im Block gefunden - System-Branding- block.html.twig aus dem Classy-Theme. Sie können es also folgendermaßen verwenden:

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