로 페이지 제목을 변경할 수 있다는 것을 알고 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 커뮤니티는 기존 모듈을 채택 할 것을 강력히 권고합니다 (및 사이트 소유자는 이로 인한 혜택을 누릴 수 있음).