ページタイトルを設定するにはどうすればよいですか?


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の反対です。Drupal8ではデフォルトでPASS_THROUGHと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']));

Drupal 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ヘッドに入るタイトルの一部として追加されます。
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タイトルはどこでも問題なく機能します。タイトルをどこに設定すればよいのか、前処理ページでは機能しないようです。
レイマンクス


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

別の方法を見つけました。コントローラーがなく、Webサイト全体でタイトルを変更したい場合は、より簡単な方法かもしれません。これを使用して、現在のノードに基づいてタイトルを変更できます。

まず、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ます。ユーザーは、任意のページ/領域でこのブロックを非表示または追加できます。

これには2つの解決策があります。

  1. title_block特定のページで無効にし、タイトルのマークアップを含む新しいカスタムブロックを追加します。次に、このブロックをtitle_blockin drupalブロックセクションの直後に配置します。
  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';
        }
      }
    }

    私の場合、上記の2番目の方法を使用しましたが、これはユーザープロファイルページでのみ機能します。


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.