我想以编程方式更改Drupal 8中的页面标题,以便在主题文件中对其进行硬编码。
我试图将钩子函数用于preprocess_page_title,但似乎无法理解要更改标题的页面。
这是我到目前为止所拥有的:
function test_preprocess_page_title(&$variables) {
if (arg(0) == 'node/12') {
$variables['title'] = 'New Title';
}
}
我认为在一个特定页面上进行此更改的唯一方法是设置节点参数。有没有人想出一种方法来覆盖Drupal上的页面标题?
答案 0 :(得分:2)
以下是预处理页面的方法:
AnyTabBusy
并在您的模板page.html.twig
中Tabs
答案 1 :(得分:2)
在你的template.theme文件中添加预处理器,然后通过打印变量覆盖模板文件夹中的page-title.html.twig,如下所示:
function theme_preprocess_page_title(&$variables) {
$node = \Drupal::request()->attributes->get('node');
$nid = $node->id();
if($nid == '14') {
$variables['subtitle'] = 'Subheading';
}
}
然后{{subtitle}}
答案 2 :(得分:0)
有两种方法可以更改页面标题
在模板上
/**
* Implements hook_preprocess_HOOK().
*/
function MYMODULE_preprocess_page_title(&$variables) {
if ($YOUR_LOGIC == TRUE) {
$variables['title'] = 'New Title';
}
}
在节点视图页面上
/**
* Implements hook_ENTITY_TYPE_view_alter().
*/
function mymodule_user_view_alter(array &$build, Drupal\Core\Entity\EntityInterface $entity, \Drupal\Core\Entity\Display\EntityViewDisplayInterface $display) {
if ($YOUR_LOGIC == TRUE) {
$build['#title'] = $entity->get('field_display_name')->getString();
}
}
如果要更改用户标题,请获取示例
function mymodule_user_view_alter(array &$build, Drupal\Core\Entity\EntityInterface $entity, \Drupal\Core\Entity\Display\EntityViewDisplayInterface $display) {
if ($entity->getEntityTypeId() == 'user') {
$build['#title'] = $entity->get('field_first_name')->getString();
}
}
在控制器上或hook_form_alter
if ($YOUR_LOGIC == TRUE) {
$request = \Drupal::request();
if ($route = $request->attributes->get(\Symfony\Cmf\Component\Routing\RouteObjectInterface::ROUTE_OBJECT)) {
$route->setDefault('_title', 'New Title');
}
}
答案 3 :(得分:0)
页面标题是Drupal 8中的一个块。如果可以找到页面标题块的plugin_id
(很可能是page_title_block
),则可以使用无需使用块预处理器来更改现有的树枝模板。您的代码可能类似于以下代码:
function vhs_preprocess_block(&$variables) {
// This example restricts based on the actual URL; you can replace this with any other logic you wish.
$request = \Drupal::request();
$uri = $request->getRequestUri();
if (
isset($variables['elements']['#base_plugin_id']) &&
$variables['elements']['#base_plugin_id'] == 'page_title_block' &&
isset($variables['content']['#title']['#markup']) &&
strpos($uri, '/url-to-match') === 0 // replace with logic that finds the correct page to override
) {
$variables['content']['#title']['#markup'] = 'My Custom Title';
}
}
上面的示例使用Drupal请求对象来获取和比较实际URL。最初的问题要求根据节点路径进行匹配;你可以用类似的东西来做到这一点:
$current_path = \Drupal::service('path.current')->getPath();
然后,可以使用上面的strpos
条件代替
$current_path == 'node/12'
答案 4 :(得分:0)
我已将用户/ 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;
}
}
}
}