Sé que podría cambiar el título de la página drupal_set_title(t('Amy page title'))
, pero cuando lo intento en Drupal 8 aparece el mensaje No existe tal error de función .
¿Cómo puedo cambiar el título de la página en Drupal 8?
Sé que podría cambiar el título de la página drupal_set_title(t('Amy page title'))
, pero cuando lo intento en Drupal 8 aparece el mensaje No existe tal error de función .
¿Cómo puedo cambiar el título de la página en Drupal 8?
Respuestas:
Como puede ver aquí, esa función está en desuso en Drupal 8.
Los títulos en las rutas ahora se pueden configurar de varias maneras, dependiendo de su caso de uso. Anteriormente solo
drupal_set_title()
se llamaba en cualquier lugar. Existen los siguientes casos de uso:Título estático
Para títulos estáticos, establezca un '_title' en la definición de enrutamiento:
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
Si escribe un controlador y necesita un título dinámico, por ejemplo, dependiendo de la configuración del sitio, use _title_callback en los valores predeterminados de la ruta.
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; } } ?>
Anulación final del título
Si escribe un controlador y necesita anular el título de la ruta, puede devolver #title en la matriz de representación. En general, esto debe evitarse, ya que el título de la página cuando se procesa por completo podría ser diferente del título en otros contextos (como en la ruta de exploración).
<?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; } } ?>
Indicador de salida de
drupal_set_title()
La validación de salida en Drupal 8 es opuesta a Drupal 7. Tenemos que especificar explícitamente PASS_THROUGH y CHECK_PLAIN es por defecto en Drupal 7, mientras que en Drupal 8 la situación es diferente. La salida se escapa automáticamente a menos que esté marcada como segura. Ambos objetos devueltos
t()
ynew FormattableMarkup
que no se escaparán automáticamente.$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');
}
y también puedes usar hook_preprocess_HOOK()
para anularlo
/**
* Implements hook_preprocess_HOOK().
*/
function MYMODULE_preprocess_page_title(&$variables) {
// WRITE YOUR LOGIC HERE,
if ($YOUR_LOGICS === TRUE) {
$variables['title'] = 'New Title';
}
}
Cambie la etiqueta del título en el encabezado de su documento HTML.
function mymodule_preprocess_html(&$variables) {
$variables['head_title']['title'] = $something;
}
Cambia el título que aparece en el contenido de la página.
function mymodule_preprocess_block(&$variables) {
if ('page_title_block' == $variables['plugin_id']) {
$variables['content']['#title'] = $something;
}
}
drupal_set_title () en 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 () en 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);
}
Esa función se eliminó de Drupal 8.
Cambio de registro: se
eliminaron drupal_set_title () y drupal_get_title () .
Ahora puede establecer el título al definir las rutas en modulename.routing.yml
. Ejemplo de cómo se podría hacer, se muestra el enlace de registro de cambio arriba.
Descubrí en D8 que si desea modificar el título de una vista de entidad, puede usar hook_ENTITY_TYPE_view_alter (). Por ejemplo, así es como puede cambiar la vista de una entidad de usuario con un campo en el usuario "field_display_name", en lugar de la ID de usuario como 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();
}
He encontrado otra forma, que puede ser más simple si no tiene un controlador y desea modificar el título en todo su sitio web. Puede usarlo para modificar el título en función del nodo actual.
Primero, elimine la etiqueta en su html.html.twig Luego, enganche hook_page_attachments_alter
function mytemplate_page_attachments_alter(array &$page) {
$page['#attached']['html_head'][] = [
[
'#tag' => 'title',
'#value' => "My title"
],
'title'
];
}
Puede obtener el término actual de nodo de taxonomía con
$node = \Drupal::routeMatch()->getParameter('node');
$term = \Drupal::routeMatch()->getParameter('taxonomy_term')
Eche un vistazo a Automatic Entity Label , un módulo contribuido muy bien diseñado para configurar títulos de nodo y similares.
(Tenga en cuenta que 'título de página' es una forma más coloquial de decir 'etiqueta de entidad', donde 'página' es una entidad de contenido y 'etiqueta' abarca el título y el equivalente para otras entidades, por ejemplo, asuntos de comentarios, nombres de términos de taxonomía).
Si bien op parece estar pidiendo orientación sobre cómo escribir código personalizado, no está claro a partir de los detalles disponibles que el código personalizado sea la mejor recomendación. Para los lectores sin una razón muy específica para duplicar una característica disponible del código contribuido, la comunidad de Drupal aconseja (y los propietarios del sitio se benefician enormemente) de la adopción de un módulo existente.
drupal_set_title()
y drupal_get_title()
ambos se eliminan de drupal 8, pero la mejor parte es que hay un bloque separado para page_title
. El usuario puede ocultar o agregar este bloque en cualquier página / región.
Hay 2 soluciones para esto.
title_block
en una página en particular y agregue un nuevo bloque personalizado con algunas marcas para el título. Ahora coloque este bloque justo después de la title_block
sección en bloque drupal.Mediante el uso de la hook_preprocess_block()
función en su custom_theme.theme
archivo.
Aquí está el ejemplo 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';
}
}
}
En mi caso, he utilizado el segundo método anterior, que funcionará solo para la página de perfil de usuario.
Luché con esto y probé todas las soluciones anteriores. La solución que finalmente funcionó fue:
function mymodule_preprocess_html(&$variables) {
$variables['head_title']['title'] = $something;
}
pero solo después de actualizar el peso de mi módulo personalizado:
drush php:eval "module_set_weight('mymodule', 10);"
Obtener el título de la página funciona bien como está escrito en la respuesta de @ rpayanm. Pero configurarlo resultó ser bastante complicado. Finalmente descubrí que hook_preprocess_HOOK()
simplemente podría usarse para preprocesar el título de la página con bastante facilidad.
/**
* Implements hook_preprocess_HOOK().
*/
function MYMODULE_preprocess_page_title(&$variables) {
if ($MYLOGIC === TRUE) {
$variables['title'] = 'New Title';
}
}
Y como ya se mencionó en otras respuestas aquí, también puede usar hook_preprocess_html()
para configurar la etiqueta de título de la cabeza HTML en consecuencia.
He cambiado el bloque page_title para user / uid a un nombre de campo de cuenta 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;
}
}
}
}