기본 경로는 어떻게 얻습니까?


16

Drupal 8 템플릿 파일에서 기본 경로를 사용하고 싶습니다. 다음을 시도했지만 올바른 결과를 얻지 못했습니다.

{{ app.request.baseUrl  }}

{{base_path}}

내가 필요한 것은 노드의 절대 경로 {{ app.request.baseUrl }}/{{ url }}입니다.

내가 찾은 해결책 중 하나는이 코드를 전처리 후크에 넣고 테마에 전달하는 것입니다.

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

더 나은 솔루션을 찾고 있습니다. 사용중인 제품 대신 무엇을 사용해야합니까?

답변:


28

url()Drupal의 모든 경로에 기본 URL을 생성하는 데 사용할 수 있습니다 . <front>사실상 기본 URL이 될 경로를 제공 할 수 있습니다 .

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

그러나 연결하는 경우 먼저 렌더링 하십시오.

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

예를 들면 다음과 같습니다.

{{ 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
노드 절대 경로를 얻으려면?
Yusef

2
노드 컨텍스트에서이 path()기능을 사용하여 노드 경로를 검색 할 수 있습니다.{{ path('entity.node.canonical', {'node': node.id}) }}
Shawn Conn

12

Drupal 8의 파트에서 경로를 명시 적으로 만들 필요는 거의 없습니다.

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

답변을 수정 해 주셔서 감사하지만 url은 이제 객체이므로 문자열로 변환해야합니다.
Yusef

2
아니요, 템플릿을 사용하여 url 객체를 처리 할 수 ​​있으므로 다른 모듈에서 객체를 유지하는 것이 좋습니다. 따라서 모든 단계에서 객체를 변경하여 최종적으로 나뭇 가지로 렌더링 할 수 있습니다.
4k4

@ 4k4이지만 toStringshow 없이 주목했지만 kint (url)을 시도했는데 그것이 객체라는 것을 알았습니다.
Yusef

@ 4k4에 동의하면 문자열로 변환하고 객체로 남겨두면 객체를 소비하는 다른 메소드 / 함수에 영향을 미치지 않아야합니다.
Vishal Kumar Sahu

10

page.html.twig 당신 것입니다 작동이 {{ base_path }}변수를. 모든 템플릿에서 사용할 수없는 이유는 모르겠습니다. 내가해야한다고 생각하고 다른 모든 것이 지저분 해 보이는 것처럼, 내가 선호하는 솔루션은 Drupal이 필요한 모든 장소에 대한 전처리 페이지 기능에서와 똑같이하는 것입니다.

{{ base_path }}example이라는 테마에서 템플릿을 차단할 수 있게 하려면 이 코드를example.theme 파일에 하십시오.

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

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

MPD에서 제공하는 승인 된 답변에서 언급했듯이 노드 또는 다른 엔티티의 URL을 얻는 경우 모든 방법을 사용할 수 있습니다.

그러나 테마 폴더에있는 이미지를 표시 할 때와 같이 base_path를 가져 오는 이유가 있습니다. {{ directory }}테마 폴더의 경로를 제공하지만 기본 경로는 제외합니다 (일반적으로 /이지만 하드 코딩해서는 안되는 도메인의 하위 디렉토리에서 Drupal의 올바른 기능을 유지하기 위해). 에 page.html.twig또는 위의 preprocesser이있는 템플릿이는 그 목적을 위해 작동합니다 :

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

물론 Shawn Conn의 대답은 예쁜 템플릿에 대한 욕구를 억제 할 수 있지만 제대로 할 수 없다면 잘 작동합니다.


3

8.2.x의 페이지 설명서에 따르면 첫 페이지와 기본 경로 URL을 반환하기 위해 두 개의 전역 변수가 추가되었습니다.

front_page : 첫 페이지의 URL. 프론트 페이지에 링크 할 때 base_path 대신 이것을 사용하십시오. 여기에는 언어 도메인 또는 접두사가 포함됩니다.

base_path : Drupal 설치의 기본 URL 경로. 하위 디렉토리에 Drupal을 설치하지 않은 경우 일반적으로 "/"입니다.

그래서 당신은 글꼴 페이지 Url front_page과 기본 Url을 얻을 수 있습니다base_url

노트

예를 들어 첫 페이지 URL {{ url('<front>') }}을 다른 경로와 연결하려는 경우 문제가 있습니다.

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

반환

Array/landing-page?invitecode= 

이것은 기본적으로 텍스트가 아니며 렌더링 가능한 배열을 잔가지로 반환합니다.


2

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

& 템플릿 파일 U를 통해 전화를 걸 수 있습니다.

{{ base_path ~ directory }}

2

지금까지이 스레드는 적절한 솔루션을 제공하지 않습니다. render_val ()을 사용하여 연결할 수 있습니다

엔티티 이미지의 절대 경로를 얻기 위해 내가 사용한 방법은 다음과 같습니다.

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

먼저 사이트의 기본 URL을 얻습니다. 그런 다음 여분의 /를 제거해야합니다. 그런 다음 기본 경로를 이미지 상대 경로와 연결합니다.


2

언어 경로가 설정되어있어 첫 페이지 URL이 다음과 같아서 위의 모든 것이 실패했습니다 https://example.com/en.

내 사이트의 실제 기본 URL을 얻기 위해이 코드를 사용했습니다.

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

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

이미 올바른 것으로 표시했지만 추가 작업없이 템플릿 파일에서 나뭇 가지 요소로 사용할 수 있습니다. Classy 테마의 block-system-branding-block.html.twig에서 이것을 발견했습니다. 따라서 다음과 같이 사용할 수 있습니다.

<a href="{{ path('<front>') }}" title="{{ 'Home'|t }}" rel="home">{{ site_name }}</a>
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.