Drupal 8 中的自定义 404 模板文件

Custom 404 template file in Drupal 8

如何在 Drupal 8 中创建自定义 404 page

我在后台创建了一个名为 404 的新页面(内容)(节点号 100)。 我已将其设置为 Configuration > 的 404 默认页面 Basic site 设置。

它适用于我在后台设置的内容。

但现在我希望它可以通过编程方式进行编辑,但我不知道如何创建覆盖文件。

我尝试创建 mytheme/templates/html--node--100.html.twig,它仅在直接请求 url (node/100) 时有效,但当您尝试随机 slug 时它不起作用在 URL 上,drupal 必须解决它。发生这种情况时,drupal 正在为我提供 404 page 在后台而不是我刚刚创建的文件中的内容。

我已经尝试了几个文件,例如 page--404-html.twightml--node--404.html.twightml--page--404.html.twig、...但它们都不起作用

谁能帮我一把?

尝试页面--系统--404.html.twig

page--system--404.html.twig(或其他 4xx 状态的等效项)在 Drupal 8.3 中不再有效,因为 4xx 响应处理已更改。您现在需要 https://www.drupal.org/node/2363987 的核心补丁或类似的自定义模块挂钩,为这些页面添加模板建议:

/**
 * Implements hook_theme_suggestions_page() to set 40x template suggestions
 */
function MYMODULE_theme_suggestions_page(array $variables) {
  $path_args = explode('/', trim(\Drupal::service('path.current')->getPath(), '/'));
  $suggestions = theme_get_suggestions($path_args, 'page');
  $http_error_suggestions = [
    'system.401' => 'page__401',
    'system.403' => 'page__403',
    'system.404' => 'page__404',
  ];
  $route_name = \Drupal::routeMatch()->getRouteName();
  if (isset($http_error_suggestions[$route_name])) {
    $suggestions[] = $http_error_suggestions[$route_name];
  }

  return $suggestions;
}

编辑:使用hook_theme_suggestions_page_alter 修改建议数组可能更好。在 https://www.drupal.org/project/fourxx_templates (or https://github.com/ahebrank/fourxx_templates/blob/8.x-1.x/fourxx_templates.module)

中查看此代码的更新版本

以下实现为页面添加了模板建议,在这种情况下,如果您在主题中创建一个页面--404.html.twig 文件,您将能够自定义页面并使用 Drupal 8.5。 1

MYTHEME.theme

/**
 * Implements hook_theme_suggestions_HOOK_alter().
 */
function MYTHEME_theme_suggestions_page_alter(&$suggestions, $variables, $hook) {
  /**
   * 404 template suggestion.
   */
  if (!is_null(Drupal::requestStack()->getCurrentRequest()->attributes->get('exception'))) {
    $status_code = Drupal::requestStack()->getCurrentRequest()->attributes->get('exception')->getStatusCode();
    switch ($status_code) {
      case 404: {
        $suggestions[] = 'page__' . (string) $status_code;
        break;
      }
      default:
        break;
    }
  }
}

并创建一个名为 page--404.html.twig 的模板并用您的东西覆盖。

,
如果你想为所有的错误页面添加建议,只需要去掉 switch 语句。

/**
 * Implements hook_theme_suggestions_HOOK_alter().
 */
function MYTHEME_theme_suggestions_page_alter(&$suggestions, $variables) {
  /**
   * error page template suggestions.
   */
  if (!is_null(Drupal::requestStack()->getCurrentRequest()->attributes->get('exception'))) {
    $status_code = Drupal::requestStack()->getCurrentRequest()->attributes->get('exception')->getStatusCode();
    $suggestions[] = 'page__' . (string) $status_code;
  }
}

您现在可以使用 page--404.html.twig。请确保您没有将节点设置为 404 页面。资料来源:https://www.drupal.org/node/2960810