Bagaimana cara mendapatkan jalur basis?

16

Saya ingin menggunakan path dasar dalam file template Drupal 8. Saya mencoba yang berikut, tetapi saya tidak mendapatkan hasil yang benar.

{{ app.request.baseUrl  }}

{{base_path}}

Yang saya butuhkan adalah jalur absolut ke node {{ app.request.baseUrl }}/{{ url }}.

Salah satu solusi yang saya temukan adalah meletakkan kode ini di kait preproses, dan meneruskannya ke tema.

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

Saya mencari solusi yang lebih baik. Apa yang bisa saya gunakan daripada yang saya gunakan?

Yusef
sumber

Jawaban:

28

Anda dapat menggunakan url()untuk menghasilkan url dasar ke rute apa pun di Drupal. Anda dapat menyediakan <front>rute yang, pada dasarnya, akan menjadi URL dasar Anda.

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

Tetapi, render terlebih dahulu jika Anda menggabungkannya:

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

Sebagai contoh:

{{ 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
sumber
1
dan jika saya ingin mendapatkan jalur absolut simpul?
Yusef
2
Dalam konteks simpul, path()fungsi tersebut dapat diterapkan untuk mengambil rute simpul:{{ path('entity.node.canonical', {'node': node.id}) }}
Shawn Conn
12

Anda hampir tidak perlu secara eksplisit membangun jalur dari bagian-bagian di Drupal 8. Saya akan menggunakan sesuatu seperti ini:

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
sumber
maafkan saya untuk mengedit jawaban Anda, tetapi url sekarang adalah objek, kita harus mengubahnya menjadi string.
Yusef
2
Tidak, Anda tidak perlu melakukan itu, templat dapat menangani objek url. Ini bagus untuk modul lain untuk menyimpan objek, sehingga siapa pun dapat mengubahnya di setiap tahap, sebelum akhirnya di render.
4k4
@ 4k4 tapi saya mencoba tanpa toStringtetapi memperhatikan acara, lalu saya mencoba kint (url) dan melihatnya objek.
Yusef
Saya setuju dengan @ 4k4 bahwa itu tidak boleh dikonversi menjadi string dan dibiarkan sebagai objek sehingga metode / fungsi lain yang dikonsumsi tidak terpengaruh.
Vishal Kumar Sahu
10

Di dalamnya page.html.twigAnda akan memiliki {{ base_path }}variabel yang berfungsi . Mengapa tidak tersedia di setiap templat, saya tidak tahu. Seperti yang saya pikir seharusnya dan segala sesuatu tampak berantakan, solusi pilihan saya adalah melakukan persis seperti yang dilakukan Drupal di fungsi halaman preproses untuk tempat yang saya butuhkan.

Agar {{ base_path }}tersedia untuk memblokir template dalam tema bernama contoh, tambahkan kode ini ke example.themefile:

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

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

Seperti disebutkan dalam jawaban yang diterima yang disediakan oleh MPD, jika mendapatkan simpul atau URL entitas lain ada metode untuk melakukan semuanya untuk Anda.

Namun, ada alasan untuk mendapatkan base_path, seperti saat menampilkan gambar yang hidup di folder tema Anda. {{ directory }}menyediakan path ke folder tema, tetapi meninggalkan path dasar (biasanya hanya a / tetapi untuk mempertahankan fungsi Drupal yang tepat dari subdirektori domain yang tidak boleh di-hardcode). Pada page.html.twigatau dalam templat apa pun yang memiliki preprosesor di atas, ini akan berfungsi untuk tujuan itu:

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

Dan tentu saja jawaban Shawn Conn bekerja dengan baik jika Anda dapat menekan keinginan Anda untuk template cantik, tetapi saya tidak bisa.

mlncn
sumber
3

Dan Menurut Dokumentasi Halaman pada 8.2.x , dua variabel global ditambahkan untuk mengembalikan halaman depan dan Url Path Basis:

front_page: URL dari halaman depan. Gunakan ini alih-alih base_path saat menautkan ke halaman depan. Ini termasuk domain bahasa atau awalan.

base_path: Jalur URL dasar dari instalasi Drupal. Biasanya akan "/" kecuali Anda telah menginstal Drupal di sub-direktori.

Jadi Anda bisa mendapatkan Url halaman font dengan front_pagedan mendasarkan Urlbase_url

Catatan

mendapatkan url halaman depan {{ url('<front>') }}memiliki masalah ketika Anda ingin menyambungkannya dengan jalur lain, misalnya

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

kembali

Array/landing-page?invitecode= 

ini berarti secara default bukan teks dan mengembalikan array mampu render untuk ranting

Yusef
sumber
2

Di

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

& dalam file templat yang dapat Anda hubungi melalui

{{ base_path ~ directory }}
Julia
sumber
2

Sejauh ini utas ini tidak membawa solusi yang tepat. Kami dapat menggabungkannya dengan menggunakan render_val ()

Inilah cara saya menggunakannya, untuk mendapatkan jalur absolut dari gambar entitas:

{% 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 kita mendapatkan URL dasar situs. Maka kita perlu menghapus ekstra /. Lalu kami menggabungkan path dasar kami dengan path relatif gambar kami.

Denis Kolmerschlag
sumber
2

Semua hal di atas gagal untuk saya, karena saya memiliki pengaturan jalur bahasa, sehingga URL halaman depan saya terlihat seperti https://example.com/en.

Saya akhirnya menggunakan kode ini untuk mendapatkan URL basis aktual untuk situs saya:

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

Saya tahu Anda sudah menandai ini sebagai benar, tetapi ini dapat digunakan sebagai elemen ranting dalam file template tanpa kerja ekstra. Saya menemukan ini di blok - system-branding-block.html.twig dari tema Classy. Jadi Anda bisa menggunakannya seperti ini:

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