如何在我的自定义页面的模块中覆盖 page.html.twig

问题描述 投票:0回答:1

我在路由中定义了一个自定义页面,其

ControllerBase
类。我想覆盖此页面的整个
page.html.twig

如果我使用

hook_theme
并在那里定义
'page__test' => [...]
,它会用我的
page--test.html.twig
覆盖页面,但我没有来自
ControllerBase
类的变量。

drupal drupal-8 drupal-modules
1个回答
0
投票

要覆盖自定义页面的整个

page.html.twig
模板,您可以使用以下方法:

  1. 在您的主题或自定义模块中,实现
    hook_theme_suggestions_HOOK_alter
    为您的页面建议自定义模板:
/**
 * Implements hook_theme_suggestions_HOOK_alter().
 */
function my_theme_theme_suggestions_page_alter(array &$suggestions, array $variables) {
  // Check if this is your custom page.
  if (\Drupal::routeMatch()->getRouteName() == 'your.route_name') {
    // Suggest a custom template for the page.
    $suggestions[] = 'page__test';
  }
}
  1. 在主题或模块的模板目录中创建自定义模板文件
    page--test.html.twig
    ,在此文件中您可以访问
    ControllerBase
    类中的变量:
{# themes/custom/my_theme/templates/page--test.html.twig #}

<div class="layout-container">

  <header role="banner">
    {{ page.header }}
  </header>

  {{ page.primary_menu }}
  {{ page.secondary_menu }}

  {{ page.breadcrumb }}

  {{ page.highlighted }}

  {{ page.help }}

  <main role="main">
    <a id="main-content" tabindex="-1"></a>

    <div class="layout-content">
      {{ page.content }}
    </div>

    {% if page.sidebar_first %}
      <aside class="layout-sidebar-first" role="complementary">
        {{ page.sidebar_first }}
      </aside>
    {% endif %}

    {% if page.sidebar_second %}
      <aside class="layout-sidebar-second" role="complementary">
        {{ page.sidebar_second }}
      </aside>
    {% endif %}

  </main>

  {% if page.footer %}
    <footer role="contentinfo">
      {{ page.footer }}
    </footer>
  {% endif %}

</div>

© www.soinside.com 2019 - 2024. All rights reserved.