페이지 제목을 어떻게 설정합니까?


29

로 페이지 제목을 변경할 수 있다는 것을 알고 drupal_set_title(t('Amy page title'))있지만 Drupal 8에서 시도하면 해당 기능 오류 가 없습니다 .

Drupal 8에서 페이지 제목을 어떻게 변경합니까?

답변:


30

여기 에서 볼 수 있듯이 Drupal 8에서는이 기능이 더 이상 사용되지 않습니다.

이제 유스 케이스에 따라 경로의 제목을 다양한 방법으로 설정할 수 있습니다. 이전에는 어느 drupal_set_title()곳에서나 호출되었습니다. 다음과 같은 사용 사례가 있습니다.

정적 제목

정적 제목의 경우 라우팅 정의에서 '_title'을 설정하십시오.

block.admin_add:
  path: '/admin/structure/block/add/{plugin_id}/{theme}'
  defaults:
    _controller: '\Drupal\block\Controller\BlockAddController::blockAddConfigureForm'
    _title: 'Configure block'
  requirements:
    _permission: 'administer blocks'

다이나믹 타이틀

컨트롤러를 작성하고 사이트 구성에 따라 동적 제목이 필요한 경우 경로 기본값에서 _title_callback을 사용하십시오.

mymodule.test:
  path: '/mymodule/test'
  defaults:
    _controller: '\Drupal\mymodule\Controller\Test::getContent'
    _title_callback: '\Drupal\mymodule\Controller\Test::getTitle'

<?php
class Test {

  /**
   * Returns a page title.
   */
  public function getTitle() {
    return  'Foo: ' . \Drupal::config()->get('system.site')->get('name');
  }

  /**
   * Returns a page render array.
   */
  public function getContent() {
    $build = array();
    $build['#markup'] = 'Hello Drupal';
    return $build;
  }
}
?>

최종 타이틀 재정의

컨트롤러를 작성하고 경로에서 제목을 재정의해야하는 경우 렌더 배열에서 #title을 반환 할 수 있습니다. 완전히 렌더링 된 페이지의 제목은 다른 컨텍스트 (예 : 이동 경로)의 제목과 다를 수 있으므로 일반적으로 피해야합니다.

<?php
class Test {

  /**
   * Renders a page with a title.
   *
   * @return array
   *   A render array as expected by drupal_render()
   */
  public function getContentWithTitle() {
    $build = array();
    $build['#markup'] = 'Hello Drupal';
    $build['#title'] = 'Foo: ' . Drupal::config()->get('system.site')->get('name');

    return $build;
  }

}
?>

의 출력 플래그 drupal_set_title()

Drupal 8의 출력 유효성 검사는 Drupal 7과 반대입니다. PASS_THROUGH를 명시 적으로 지정해야하며 Drupal 7에서는 CHECK_PLAIN이 기본적으로 지정되어 있지만 Drupal 8에서는 상황이 다릅니다. 안전으로 표시되지 않으면 출력이 자동 이스케이프됩니다. 모두 t()new FormattableMarkup반환 개체를 자동으로 이스케이프하지 않을 것이다.

$form['#title'] = $this->t('Add new shortcut');
$form['#title'] = $this->t("'%name' block", array('%name' => $info[$block->delta]['info']));

드루팔 8.5+

$request = \Drupal::request();
if ($route = $request->attributes->get(\Symfony\Cmf\Component\Routing\RouteObjectInterface::ROUTE_OBJECT)) {
  $route->setDefault('_title', 'New Title');
}

또한 hook_preprocess_HOOK()재정의하는 데 사용할 수 있습니다

/**
 * Implements hook_preprocess_HOOK().
 */
function MYMODULE_preprocess_page_title(&$variables) {
   // WRITE YOUR LOGIC HERE, 
  if ($YOUR_LOGICS === TRUE) {

    $variables['title'] = 'New Title';
  }
}

왜 system.site-> name을 추가해야합니까? 제목 문자열을 제공하지 않으면 html head로 들어가는 제목의 일부로 추가됩니다.
anoopjohn

5

HTML 문서 헤드에서 제목 태그를 변경하십시오.

function mymodule_preprocess_html(&$variables) {

  $variables['head_title']['title'] = $something;
}

페이지 내용에 나타나는 제목을 변경하십시오.

function mymodule_preprocess_block(&$variables) {

  if ('page_title_block' == $variables['plugin_id']) {
    $variables['content']['#title'] = $something;
  }
}

4

Drupal 8의 drupal_set_title ()

$request = \Drupal::request();
if ($route = $request->attributes->get(\Symfony\Cmf\Component\Routing\RouteObjectInterface::ROUTE_OBJECT)) {
  $route->setDefault('_title', 'New Title');
}

Drupal 8의 drupal_get_title ()

$request = \Drupal::request();
if ($route = $request->attributes->get(\Symfony\Cmf\Component\Routing\RouteObjectInterface::ROUTE_OBJECT)) {
  $title = \Drupal::service('title_resolver')->getTitle($request, $route);
}

GET 제목은 어느 곳에서나 잘 작동합니다. 제목을 설정할 위치가 궁금합니다. 전처리 페이지에서 작동하지 않는 것 같습니다.
leymannx


3

D8에서 엔티티보기의 제목을 변경하려면 hook_ENTITY_TYPE_view_alter ()를 사용할 수 있음을 발견했습니다. 예를 들어, 제목으로 사용자 ID가 아닌 사용자 "field_display_name"의 필드를 사용하여 사용자 엔티티의보기를 변경하는 방법은 다음과 같습니다.

/**
* Implements hook_ENTITY_TYPE_view_alter().
*/
function mymodule_user_view_alter(array &$build, Drupal\Core\Entity\EntityInterface $entity, \Drupal\Core\Entity\Display\EntityViewDisplayInterface $display) {
  $build['#title'] = $entity->get('field_display_name')->getString();
}

좋고 깨끗한 접근. D8 /
Vishal Kumar Sahu

2

컨트롤러가없고 웹 사이트 전체에서 제목을 수정하려는 경우 더 간단한 다른 방법을 찾았습니다. 현재 노드를 기준으로 제목을 수정하는 데 사용할 수 있습니다.

먼저 html.html.twig에서 태그를 제거한 다음 hook_page_attachments_alter를 연결하십시오.

function mytemplate_page_attachments_alter(array &$page) {
    $page['#attached']['html_head'][] = [
        [
          '#tag' => 'title',
          '#value' => "My title"
        ],
        'title'
    ];
}

분류법 용어의 현재 노드를

$node = \Drupal::routeMatch()->getParameter('node');
$term = \Drupal::routeMatch()->getParameter('taxonomy_term')

2

노드 제목 등을 설정하기 위해 잘 제작 된 기여 모듈 인 Automatic Entity Label을 살펴보십시오 .

( '페이지 제목'은 '엔터티 레이블'을 말하는 구어체적인 방법입니다. 여기서 '페이지'는 콘텐츠 엔터티이고 '라벨'은 제목 및 다른 엔터티 (예 : 댓글 제목, 분류 용어 이름)에 해당하는 제목 및 해당 항목을 포함합니다.)

op가 사용자 정의 코드 작성에 대한 지침을 요구하는 것처럼 보이지만, 사용자 정의 코드가 가장 권장되는 세부 사항은 명확하지 않습니다. 기여 된 코드에서 제공하는 기능을 복제 할 특별한 이유가없는 독자를 위해 Drupal 커뮤니티는 기존 모듈을 채택 할 것을 강력히 권고합니다 (및 사이트 소유자는 이로 인한 혜택을 누릴 수 있음).


2

drupal_set_title()그리고 drupal_get_title()drupal 8에서 모두 제거되었지만 가장 중요한 부분은 별도의 블록이 있다는 것입니다 page_title. 사용자는 모든 페이지 / 지역에서이 블록을 숨기거나 추가 할 수 있습니다.

이에 대한 두 가지 솔루션이 있습니다.

  1. title_block특정 페이지에서 비활성화 하고 제목에 일부 태그를 추가하여 새 사용자 정의 블록을 추가하십시오. 이제이 블록 title_block을 드루팔 블록 섹션 바로 뒤에 배치 하십시오.
  2. 파일 hook_preprocess_block()에서 기능 을 사용 custom_theme.theme합니다.
    코드 예제는 다음과 같습니다.

    function custom_themename_preprocess_block(&$variables) {
      if ('page_title_block' == $variables['plugin_id']) {
        $request = \Drupal::request();
        $path = $request->getRequestUri(); // get current path
        if(strpos($path, 'user')) { //check current path is user profile page
          $variables['content']['#title'] = 'My Profile';
        }
      }
    }

    제 경우에는 위의 두 번째 방법을 사용했으며 이는 사용자 프로필 페이지에서만 작동합니다.


1

나는 이것으로 고생하고 위의 모든 해결책을 시도했다. 마침내 효과가 있었던 솔루션은 다음과 같습니다.

function mymodule_preprocess_html(&$variables) {
  $variables['head_title']['title'] = $something;
}

하지만 사용자 정의 모듈 무게를 업데이트 한 후에 만 ​​:

drush php:eval "module_set_weight('mymodule', 10);"

1

페이지 제목을 얻는 것은 @rpayanm의 답변으로 작성된대로 잘 작동합니다. 그러나 그것을 설정하는 것은 매우 복잡한 것으로 판명되었습니다. 마지막으로 hook_preprocess_HOOK()페이지 제목을 매우 쉽게 전처리하는 데 사용될 수 있다는 것을 알았습니다 .

/**
 * Implements hook_preprocess_HOOK().
 */
function MYMODULE_preprocess_page_title(&$variables) {

  if ($MYLOGIC === TRUE) {

    $variables['title'] = 'New Title';
  }
}

그리고 다른 답변에서 이미 언급했듯이 hook_preprocess_html()HTML 헤드 제목 태그를 적절하게 설정하는 데 추가로 사용할 수 있습니다 .


0

user / uid의 page_title 블록을 다음과 같이 다른 사용자 정의 계정 필드 이름으로 변경했습니다.

function hook_preprocess_block(&$variables) {  
  $path = \Drupal::request()->getpathInfo();
  $arg = explode('/', $path);
  if (isset($arg[2]) && $arg[2] == 'user' && isset($arg[3])) {
    if (isset($variables['elements']['content']['#type']) && $variables['elements']['content']['#type'] == 'page_title') {
      $account = \Drupal\user\Entity\User::load($arg[3]);
      if(isset($account) && isset($account->field_mycustomfield->value)){
        $variables['content']['#title']['#markup']=$account->field_mycustomfield->value;
      }
    }
  }
}
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.