Drupal 8でカスタム404 page
を作成するにはどうすればよいですか?
バックオフィスに404
(ノード番号100)という新しいページ(コンテンツ)を作成しました。 Configuration
> Basic site
設定で404デフォルトページとして設定しました。
バックオフィスで設定したコンテンツで動作します。
しかし、今はプログラムで編集できるようにしたいので、オーバーライドファイルを作成する方法がわかりません。
私はmytheme/templates/html--node--100.html.twig
を作成しようとしましたが、リクエストがそのURL(node/100
)を直接要求した場合にのみ機能しますが、URLにランダムスラッグを試みたときに機能しませんdrupalはそれを解決する必要があります。これが発生した場合、drupalは404 page
がバックオフィスに持っているコンテンツを提供しており、作成したばかりのファイルではありません。
page--404-html.twig
、html--node--404.html.twig
、html--page--404.html.twig
、...のようないくつかのファイルを試しましたが、どちらも機能しません
誰か私に手を貸してくれませんか?
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 )
次の実装は、ページのテンプレート提案を追加します。この場合、テーマに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;
}
}
Page--system--404.html.twigをお試しください