Como faço para definir o título da página?

29

Sei que poderia mudar o título da página drupal_set_title(t('Amy page title')), mas quando o experimento no Drupal 8, recebo o erro de função Não existe .

Como posso alterar o título da página no Drupal 8?

Jeff Madison
fonte

Respostas:

30

Como você pode ver aqui, essa função está obsoleta no Drupal 8.

Agora, os títulos nas rotas podem ser definidos de várias maneiras, dependendo do seu caso de uso. Anteriormente, apenas drupal_set_title()era chamado em qualquer lugar. Existem os seguintes casos de uso:

Título estático

Para títulos estáticos, você define um '_title' na definição de roteamento:

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'

Título dinâmico

Se você escreve um controlador e precisa de um título dinâmico, por exemplo, dependendo da configuração do site, use _title_callback nos padrões de rota.

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

Substituição final do título

Se você escrever um controlador e precisar substituir o título da rota, poderá retornar #title na matriz de renderização. Isso geralmente deve ser evitado, pois o título da página, quando totalmente renderizado, pode ser diferente do título em outros contextos (como na trilha de navegação).

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

}
?>

Sinalizador de saída de drupal_set_title()

A validação de saída no Drupal 8 é oposta ao Drupal 7. Temos que especificar explicitamente PASS_THROUGH e CHECK_PLAIN é por padrão no Drupal 7, enquanto no Drupal 8 a situação é diferente. A saída é escapada automaticamente, a menos que seja marcada como segura. Ambos t()e new FormattableMarkupobjetos de retorno que não serão escapados automaticamente.

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

e você também pode hook_preprocess_HOOK()substituí-lo

/**
 * Implements hook_preprocess_HOOK().
 */
function MYMODULE_preprocess_page_title(&$variables) {
   // WRITE YOUR LOGIC HERE, 
  if ($YOUR_LOGICS === TRUE) {

    $variables['title'] = 'New Title';
  }
}
Yusef
fonte
Por que você precisa anexar o nome system.site->? Isso é anexado como parte do título que entra no cabeçalho html se você fornecer uma string de título sem isso.
anoopjohn 3/11
5

Altere a tag title no cabeçalho do seu documento HTML.

function mymodule_preprocess_html(&$variables) {

  $variables['head_title']['title'] = $something;
}

Altere o título que aparece no conteúdo da página.

function mymodule_preprocess_block(&$variables) {

  if ('page_title_block' == $variables['plugin_id']) {
    $variables['content']['#title'] = $something;
  }
}
arnoldbird
fonte
4

drupal_set_title () em 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 () em 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
fonte
O título GET funciona bem, talvez em qualquer lugar. Gostaria de saber onde definir o título, porque na página pré-processo, ele não parece funcionar.
Leymannx
3

Essa função foi removida do Drupal 8. O
registro de alterações: drupal_set_title () e drupal_get_title () foram removidos .

Agora você pode definir o título ao definir as rotas modulename.routing.yml. Exemplo de como isso pode ser feito, é mostrado o link do registro de alterações acima.

AjitS
fonte
3

Eu descobri no D8 que se você deseja alterar o título para uma visualização de entidade, pode usar hook_ENTITY_TYPE_view_alter (). Por exemplo, veja como você pode alterar a exibição de uma entidade de usuário com um campo no usuário "field_display_name", em vez do ID do usuário como o título:

/**
* 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
fonte
Abordagem boa e limpa. Funciona bem em D8 /
Vishal Kumar Sahu
2

Encontrei outra maneira, que pode ser mais simples se você não tiver um controlador e quiser modificar o título em todo o site. Você pode usá-lo para modificar o título com base no nó atual.

Primeiro, remova a tag em seu html.html.twig. Em seguida, conecte hook_page_attachments_alter

function mytemplate_page_attachments_alter(array &$page) {
    $page['#attached']['html_head'][] = [
        [
          '#tag' => 'title',
          '#value' => "My title"
        ],
        'title'
    ];
}

Você pode obter o nó atual do termo de taxonomia com

$node = \Drupal::routeMatch()->getParameter('node');
$term = \Drupal::routeMatch()->getParameter('taxonomy_term')
Kodiak
fonte
2

Dê uma olhada no Rótulo automático de entidade , um módulo contribuído muito bem criado para definir títulos de nós e similares.

(Observe que 'título da página' é uma maneira mais coloquial de dizer 'rótulo da entidade', onde 'página' é uma entidade de conteúdo e 'rótulo' engloba o título e o equivalente para outras entidades, como assuntos de comentários, nomes de termos de taxonomia.)

Enquanto op parece estar pedindo orientação sobre como escrever código personalizado, não está claro nos detalhes disponíveis que o código personalizado é a melhor recomendação. Para leitores sem uma razão muito específica para duplicar um recurso disponível a partir do código contribuído, a comunidade Drupal aconselha fortemente (e os proprietários do site se beneficiam fortemente) a adotar um módulo existente.

Kay V
fonte
2

drupal_set_title()e drupal_get_title()ambos são removidos do drupal 8, mas a melhor parte é que existe um bloco separado parapage_title . O usuário pode ocultar ou adicionar este bloco em qualquer página / região.

Existem 2 soluções para isso.

  1. Desative title_blockem uma página específica e adicione um novo bloco personalizado com alguma marcação para o título. Agora coloque esse bloco logo após otitle_block seção do bloco drupal.
  2. Usando a hook_preprocess_block()função no seu custom_theme.themearquivo.
    Aqui está o exemplo de código:

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

    No meu caso, usei o segundo método acima, que funcionará apenas para a página de perfil do usuário.

Manav
fonte
1

Eu lutei com isso e tentei todas as soluções acima. A solução que finalmente funcionou foi:

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

mas somente após a atualização do peso do meu módulo personalizado:

drush php:eval "module_set_weight('mymodule', 10);"
Pedro
fonte
1

Obter o título da página funciona bem como está escrito na resposta do @ rpayanm. Mas configurá-lo acabou sendo bastante complicado. Finalmente, descobri que hook_preprocess_HOOK()poderia ser usado para pré-processar o título da página com bastante facilidade.

/**
 * Implements hook_preprocess_HOOK().
 */
function MYMODULE_preprocess_page_title(&$variables) {

  if ($MYLOGIC === TRUE) {

    $variables['title'] = 'New Title';
  }
}

E como já mencionado em outras respostas aqui, você pode usar adicionalmente hook_preprocess_html()para definir a tag do título HTML em conformidade.

leymannx
fonte
0

Alterei o bloco page_title para user / uid para um nome de campo de conta personalizado diferente como este:

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