페이지 제목을 어떻게 설정합니까? 있다는 것을 알고 drupal_set_title(t(‘Amy

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

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



답변

여기 에서 볼 수 있듯이 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';
  }
}

답변

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;
  }
}

답변

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);
}

답변

이 기능은 Drupal 8에서 제거되었습니다 .
레코드 변경 :
drupal_set_title () 및 drupal_get_title ()이 제거되었습니다 .

에서 경로를 정의 할 때 제목을 설정할 수 있습니다 modulename.routing.yml. 수행 방법의 예는 위의 레코드 변경 링크를 보여줍니다.


답변

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();
}

답변

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

먼저 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')

답변

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

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

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