Как установить заголовок страницы?

Я знаю, что могу изменить заголовок страницы с помощью drupal_set_title(t('Amy page title')), но когда я пытаюсь это сделать в Drupal 8, я получаю Нет такой функции .

Как изменить заголовок страницы в Drupal 8?

8
22 голоса | спросил Jeff Madison 24 22015vEurope/Moscow11bEurope/MoscowTue, 24 Nov 2015 08:22:43 +0300 2015, 08:22:43

10 ответов


24

Как вы можете видеть здесь , эта функция устарела в 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']));
ответил zhilevan 24 22015vEurope/Moscow11bEurope/MoscowTue, 24 Nov 2015 08:31:55 +0300 2015, 08:31:55
4

Измените тег заголовка в заголовке 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;
  }
}
ответил arnoldbird 4 FebruaryEurope/MoscowbSat, 04 Feb 2017 21:47:17 +0300000000pmSat, 04 Feb 2017 21:47:17 +030017 2017, 21:47:17
3

Эта функция была удалена из Drupal 8.
Изменить запись: drupal_set_title () и drupal_get_title () были удалены .

Теперь вы можете задать заголовок при определении маршрутов в modulename.routing.yml. Пример того, как это можно сделать, показывает ссылку записи изменений выше.

ответил AjitS 24 22015vEurope/Moscow11bEurope/MoscowTue, 24 Nov 2015 08:29:08 +0300 2015, 08:29:08
2

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);
}
ответил rpayanm 27 AMpWed, 27 Apr 2016 01:27:22 +030027Wednesday 2016, 01:27:22
1

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

Сначала удалите тег в html.html.twig Затем, hook 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')
ответил Kodiak 6 J0000006Europe/Moscow 2016, 16:38:06
1

Взгляните на автоматическую метку объекта , очень хорошо созданный модуль для установки узла титры и т. д.

(Обратите внимание, что «заголовок страницы» является более разговорным способом сказать «метка объекта», где «страница» - это объект контента, а «ярлык» охватывает название и эквивалент для других объектов, например, темы комментариев, имена таксономии .)

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

ответил Kay V 20 PMpThu, 20 Apr 2017 21:53:39 +030053Thursday 2017, 21:53:39
0

Получение названия страницы прекрасно работает, как написано в ответе @ 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.

ответил leymannx 30 MarpmThu, 30 Mar 2017 12:30:27 +03002017-03-30T12:30:27+03:0012 2017, 12:30:27
0

Я нашел в D8, что если вы хотите изменить заголовок для представления сущности, вы можете использовать hook_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();
}
ответил Tyler Fahey 11 MonEurope/Moscow2017-12-11T18:58:45+03:00Europe/Moscow12bEurope/MoscowMon, 11 Dec 2017 18:58:45 +0300 2017, 18:58:45
0

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

    В моем случае я использовал выше второй метод, который будет работать только для страницы профиля пользователя.

ответил Manav 21 ThuEurope/Moscow2017-12-21T16:06:01+03:00Europe/Moscow12bEurope/MoscowThu, 21 Dec 2017 16:06:01 +0300 2017, 16:06:01
0

Я боролся с этим и пробовал все вышеперечисленные решения. Решение, которое в конечном итоге работало, было:

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

, но только после того, как я обновил свой собственный вес модуля:

drush php:eval "module_set_weight('mymodule', 10);"
ответил Peter 22 MarpmThu, 22 Mar 2018 13:52:44 +03002018-03-22T13:52:44+03:0001 2018, 13:52:44

Похожие вопросы

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132