Làm thế nào để tôi có được đường dẫn cơ sở?


16

Tôi muốn sử dụng đường dẫn cơ sở trong tệp mẫu Drupal 8. Tôi đã thử như sau, nhưng tôi không nhận được kết quả chính xác.

{{ app.request.baseUrl  }}

{{base_path}}

Những gì tôi cần là đường dẫn tuyệt đối đến nút {{ app.request.baseUrl }}/{{ url }}.

Một giải pháp tôi tìm thấy là đặt mã này vào một móc tiền xử lý và chuyển nó vào chủ đề.

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

Tôi đang tìm kiếm một giải pháp tốt hơn. Tôi nên sử dụng cái gì thay vì cái tôi đang sử dụng?

Câu trả lời:


28

Bạn có thể sử dụng url()để tạo url cơ sở cho bất kỳ tuyến đường nào trong Drupal. Bạn có thể cung cấp <front>tuyến đường, trong thực tế, sẽ là URL cơ sở của bạn.

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

Nhưng, kết xuất nó trước nếu bạn nối nó:

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

Ví dụ:

{{ 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
và nếu tôi muốn có được đường dẫn tuyệt đối của nút?
Yusef

2
Trong ngữ cảnh nút, path()chức năng có thể được áp dụng để truy xuất tuyến nút:{{ path('entity.node.canonical', {'node': node.id}) }}
Shawn Conn

12

Bạn gần như không bao giờ cần phải xây dựng đường dẫn rõ ràng từ các phần trong Drupal 8. Tôi sẽ đi với một cái gì đó như thế này:

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

pologize tôi để chỉnh sửa câu trả lời của bạn, nhưng url bây giờ là một đối tượng, chúng ta nên chuyển đổi nó thành chuỗi.
Yusef

2
Không, bạn không cần phải làm điều đó, mẫu có thể xử lý đối tượng url. Thật tốt cho các mô-đun khác để giữ đối tượng, để bất kỳ ai cũng có thể thay đổi nó ở bất kỳ giai đoạn nào, trước khi cuối cùng nó được hiển thị trong twig.
4k4

@ 4k4 nhưng tôi đã thử mà không toStringthấy chương trình, sau đó tôi đã thử kint (url) và thấy nó là đối tượng.
Yusef

Tôi đồng ý với @ 4k4 rằng nó không nên được chuyển đổi thành chuỗi và để lại dưới dạng đối tượng để các phương thức / hàm khác tiêu thụ nó không bị ảnh hưởng.
Vishal Kumar Sahu

10

Trong page.html.twigbạn sẽ có một {{ base_path }}biến làm việc . Tại sao nó không có sẵn trong mọi mẫu, tôi không biết. Theo tôi nghĩ nó nên như vậy và mọi thứ khác có vẻ lộn xộn, giải pháp ưa thích của tôi là làm chính xác như Drupal làm trong chức năng trang tiền xử lý cho bất kỳ nơi nào tôi cần.

Để {{ base_path }}sẵn sàng chặn các mẫu trong một chủ đề có tên ví dụ, hãy thêm mã này vào example.themetệp:

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

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

Như đã lưu ý trong câu trả lời được chấp nhận do MPD cung cấp, nếu nhận được URL của một nút hoặc thực thể khác, có các phương pháp để làm tất cả cho bạn.

Tuy nhiên, có những lý do để có được base_path, chẳng hạn như khi hiển thị hình ảnh nằm trong thư mục chủ đề của bạn. {{ directory }}cung cấp đường dẫn đến thư mục chủ đề, nhưng nó rời khỏi đường dẫn cơ sở (thường chỉ là một / nhưng để duy trì chức năng phù hợp của Drupal khỏi thư mục con của miền không được mã hóa cứng). Trên page.html.twighoặc trong bất kỳ mẫu nào có bộ tiền xử lý ở trên, điều này sẽ hoạt động cho mục đích đó:

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

Và tất nhiên, câu trả lời của Shawn Conn hoạt động tốt nếu bạn có thể ngăn chặn mong muốn của mình đối với các mẫu đẹp, nhưng tôi không thể.


3

Và theo Tài liệu trang trên 8.2.x , hai biến toàn cục được thêm vào để trả về trang trước và Url đường dẫn cơ sở:

front_page: URL của trang trước. Sử dụng cái này thay vì base_path khi liên kết đến trang trước. Điều này bao gồm tên miền ngôn ngữ hoặc tiền tố.

base_path: Đường dẫn URL cơ sở của bản cài đặt Drupal. Thường sẽ là "/" trừ khi bạn đã cài đặt Drupal trong thư mục con.

Vì vậy, bạn có thể lấy Url trang phông chữ front_pagevà Url cơ sở vớibase_url

Ghi chú

lấy url trang trước {{ url('<front>') }}có vấn đề khi bạn muốn nối nó với đường dẫn khác, ví dụ như

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

trở về

Array/landing-page?invitecode= 

điều này có nghĩa là mặc định không phải là văn bản và trả về một mảng có thể kết xuất thành twig


2

Trong

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

& trong tập tin mẫu bạn có thể gọi qua

{{ base_path ~ directory }}

2

Cho đến nay chủ đề này không mang lại bất kỳ giải pháp thích hợp. Chúng ta có thể nối nó bằng cách sử dụng render_val ()

Đây là cách tôi đã sử dụng nó, để có được đường dẫn tuyệt đối của hình ảnh thực thể:

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

Đầu tiên, chúng tôi nhận được URL cơ sở của trang web. Sau đó, chúng ta cần loại bỏ thêm /. Sau đó, chúng tôi nối đường dẫn cơ sở của chúng tôi với đường dẫn tương đối hình ảnh của chúng tôi.


2

Tất cả các điều trên đều thất bại đối với tôi, vì tôi đã thiết lập đường dẫn ngôn ngữ, vì vậy URL trang trước của tôi trông như thế https://example.com/en.

Tôi đã kết thúc bằng cách sử dụng mã này để có được URL cơ sở thực tế cho trang web của mình:

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

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

Tôi biết bạn đã đánh dấu điều này là chính xác, nhưng điều này có thể được sử dụng như một yếu tố twig trong tệp mẫu mà không cần thêm bất kỳ công việc nào. Tôi đã tìm thấy điều này trong khối - system-branding-block.html.twig từ chủ đề Classy. Vì vậy, bạn có thể sử dụng nó như thế này:

<a href="{{ path('<front>') }}" title="{{ 'Home'|t }}" rel="home">{{ site_name }}</a>
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.