Як встановити назву сторінки?


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, а CHECK_PLAIN за замовчуванням в Drupal 7, тоді як у 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->? Це додається як частина заголовка, що надходить у 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_set_title () в Drupal 8

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

drupal_get_title () в Drupal 8

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

Отримати назву добре, можливо, скрізь. Цікаво, де встановити заголовок, тому що на сторінці попередньої обробки це, здається, не працює.
leymannx

3

Ця функція була видалена з Drupal 8.
Змінення запису: drupal_set_title () та drupal_get_title () були видалені .

Тепер ви можете встановити заголовок під час визначення маршрутів у modulename.routing.yml. Приклад того, як це можна було зробити, показано вище за зміною запису змін.


3

У D8 я виявив, що якщо ви хочете змінити заголовок для перегляду сутності, ви можете використовувати гачку_ENTITY_TYPE_view_alter (). Наприклад, ось як можна змінити представлення сутності користувача з полем на ім'я користувача "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 /
Вішал Кумар Саху

2

Я знайшов інший спосіб, який може бути простішим, якщо у вас немає контролера і хочете змінити заголовок на всьому веб-сайті. Ви можете використовувати його для зміни заголовка на основі поточного вузла.

Спочатку видаліть тег у своєму html.html.twig Потім, підключіть гачок_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

Погляньте на автоматичну мітку сутності , дуже добре створений модуль для встановлення назв вузлів тощо.

(Зауважте, що "заголовок сторінки" - це більш розмовний спосіб висловлення "мітка об'єкта", де "сторінка" є об'єктом вмісту, а "мітка" охоплює заголовок та еквівалент для інших об'єктів, наприклад, тематика коментарів, назви термінів таксономії.)

Незважаючи на те, що op, як правило, просить ввести інструкції щодо написання користувальницького коду, з наявних подробиць незрозуміло, що користувацький код найкраща рекомендація. Для читачів, які не мають конкретних причин дублювання функції, доступної із внесеного коду, спільнота Drupal настійно радить (а власники сайтів сильно користуються) прийняти існуючий модуль.


2

drupal_set_title()і drupal_get_title()обидва видаляються з drupal 8, але найкраща частина - це окремий блок для page_title. Користувач може приховати або додати цей блок на будь-якій сторінці / регіоні.

Для цього є 2 рішення.

  1. Відключити title_blockна певній сторінці та додати новий спеціальний блок із розміткою для заголовка. Тепер розмістіть цей блок відразу після розділу title_blockв блоці 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

я змінив блок page_title для користувача / uid на інше спеціальне ім’я поля облікового запису, як це:

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;
      }
    }
  }
}
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.