ページマネージャーとテーマの提案
2種類のレイアウトがあります
custom_2col_brick
custom_1col_landing
選択したレイアウトに従ってページをレンダリングする必要があります。基本的に、レイアウトごとに2つのページテンプレートが必要でした。次のようなもの:
page__custom_2col_brick.html.twig
page__custom_1col_landing.html.twig
これを行う方法はありますか?
Drupal 7では次のようにできますが、panels_get_current_page_displayがDrupal 8で機能しません
/**
* Implements hook_preprocess_page().
*
* @see page.tpl.php
*/
function THEME_preprocess_page(&$variables) {
if (module_exists('ctools') && module_exists('page_manager')) {
$display = panels_get_current_page_display();
$layout = (isset($display->layout)) ? $display->layout : false;
/* layout e.g column_one_fluid, column_three_fluid etc. */
$fluid = $layout ? preg_match("/\s*.+_fluid$/", $layout) : false;
/* layout e.g column_one_landing, column_three_landing_fluid etc. */
$landing = $layout ? preg_match("/\s*.+_landing$|\s*.+_landing_fluid$/", $layout) : false;
$variables['page_fluid'] = ($fluid) ? true : false;
$variables['page_landing'] = ($landing) ? true : false;
if($fluid) {
$variables['theme_hook_suggestions'][] = 'page__fluid';
}
if($landing) {
$variables['theme_hook_suggestions'][] = 'page__landing';
}
}
hook_theme_suggestions_HOOK_alter() および \ Drupal :: routeMatch()-> getRouteObject() を使用します。
/**
* Implements hook_theme_suggestions_HOOK_alter().
*/
function mytheme_theme_suggestions_page_alter(&$suggestions, &$vars) {
$request = \Drupal::routeMatch()->getRouteObject();
if ($request->getDefault('_entity_view') === 'page_manager_page_variant') {
$page_name = $request->getDefault('page_manager_page');
$page_variant = $request->getDefault('page_manager_page_variant');
$suggestions[] = 'page__page_manager';
$suggestions[] = 'page__page_manager__' . $page_name;
$suggestions[] = 'page__page_manager__' . $page_name . '__' . $page_variant;
}
}
まだ持っていない場合は、themeフォルダーにyourtheme.layouts.ymlファイルを作成してください。そこで、リージョン、プレビューアイコン、ラベルを定義します。
custom_2col_brick:
label: Two Column Brick
category: My Custom Layouts
template: layouts/custom_2col_brick
icon: layouts/custom_2col_brick.png
regions:
left:
label: Left
right:
label: Right
footer:
label: Footer
custom_1col_landing:
label: One Column Landing
category: My Custom Layouts
template: layouts/custom_1col_landing
icon: layouts/custom_1col_landing.png
regions:
main:
label: Main Region
footer:
label: Footer
これで、レイアウトフォルダーにpage__custom_2col_brick.html.twigファイルとpage__custom_1col_landing.html.twigファイルを作成できます。そこで、テンプレートを定義できます。たとえば、custom_1col_landing.html.twigには
<div class="one-column-layout">
<div class="row main">
{{ content.main }}
</div>
<div class="row expanded one-column-footer">
{{ content.footer }}
</div>
</div>
完了すると、次のファイルができます。 (プレビューアイコンはオプションです)
/yourtheme/yourtheme.layouts.yml
/yourtheme/layouts/custom_2col_brick.html.twig
/yourtheme/layouts/custom_1col_landing.twig
ギャンブリーの答えを拡張する:
/**
* Implements hook_theme_suggestions_HOOK_alter().
*/
function mytheme_theme_suggestions_page_alter(&$suggestions, &$vars) {
$request = \Drupal::routeMatch()->getRouteObject();
if ($request->getDefault('_entity_view') === 'page_manager_page_variant') {
$page_variant = $request->getDefault('page_manager_page_variant');
$name = 'page_manager.page_variant.' . $page_variant;
$config = \Drupal::configFactory()->getEditable($name);
if ($config->get('variant') === 'panels_variant') {
$layout_id = $config->get('variant_settings.layout');
$suggestions[] = 'page__page-manager';
$suggestions[] = 'page__page-manager__' . $layout_id;
}
}
}
レイアウトIDが表示されます。私の場合、デフォルトの1列のレイアウトを使用するパネルがあり、次のtwigテンプレートを使用できます。
ページの重要な部分についてはパネルレイアウトのtwigファイル(yourtheme.layouts.ymlメソッド)を使用する必要があることをマットに同意します。パネルレイアウトに基づく全体的なページテンプレート。