web-dev-qa-db-ja.com

Drupal 8のカスタム404テンプレートファイル

Drupal 8でカスタム404 pageを作成するにはどうすればよいですか?

バックオフィスに404(ノード番号100)という新しいページ(コンテンツ)を作成しました。 Configuration> Basic site設定で404デフォルトページとして設定しました。

Settings

バックオフィスで設定したコンテンツで動作します。

しかし、今はプログラムで編集できるようにしたいので、オーバーライドファイルを作成する方法がわかりません。

私はmytheme/templates/html--node--100.html.twigを作成しようとしましたが、リクエストがそのURL(node/100)を直接要求した場合にのみ機能しますが、URLにランダムスラッグを試みたときに機能しませんdrupalはそれを解決する必要があります。これが発生した場合、drupalは404 pageがバックオフィスに持っているコンテンツを提供しており、作成したばかりのファイルではありません。

page--404-html.twightml--node--404.html.twightml--page--404.html.twig、...のようないくつかのファイルを試しましたが、どちらも機能しません

誰か私に手を貸してくれませんか?

9
cadev

page--system--404.html.twig(または他の4xxステータスの同等のもの)は、4xx応答処理が変更されたため、Drupal 8.3では機能しなくなりました。コアが必要になります。 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 (または https://github.com/ahebrank/fourxx_templates/blob/8)でこのコードの更新バージョンを参照してください。 x-1.x/fourxx_templates.module

12
ahebrank

次の実装は、ページのテンプレート提案を追加します。この場合、テーマにpage--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;
  }
}
7
Israel Morales

Page--system--404.html.twigをお試しください

1
n8tron