Drupal 8 - Hook to Change Page Title

时间:2017-10-04 21:13:22

标签: web drupal nodes drupal-8 preprocessor

我想以编程方式更改Drupal 8中的页面标题,以便在主题文件中对其进行硬编码。

我试图将钩子函数用于preprocess_page_title,但似乎无法理解要更改标题的页面。

这是我到目前为止所拥有的:

function test_preprocess_page_title(&$variables) {
  if (arg(0) == 'node/12') {
    $variables['title'] = 'New Title';
  }
}

我认为在一个特定页面上进行此更改的唯一方法是设置节点参数。有没有人想出一种方法来覆盖Drupal上的页面标题?

5 个答案:

答案 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;
      }
    }
  }
}