Html.html.twigにリージョンを追加する方法はありますか?ブロックレイアウトを介してさまざまなjsカウンターをレンダリングできるように、1つの内部タグが必要です
したがって、解決策は、theme.info.ymlに新しい領域を追加することです(たとえば、before_body
)。theme_name.themeに配置するコードは次のようになります。
function theme_name_preprocess_html(&$vars) {
/**
* moves region before_body into before_body var inside basic html
*/
if (isset($vars['page']['before_body'])) {
$vars['before_body'] = $vars['page']['before_body'];
}
function theme_name_preprocess_region(&$vars){
/**
* Cleans before_body from standard html markup
*/
if ($vars['region'] === 'before_body') {
$vars['content'] = theme_name_clean_special_content($vars['content']);
}
}
/**
* Cleans content from basic markup
* @param $content
* @return \Drupal\Component\Render\MarkupInterface|string
*/
function theme_name_clean_special_content($content) {
/** @var \Drupal\Core\Render\Markup $content */
$content = preg_replace('~<\/?section.*?>|<h\d?.*?>.*<\/h\d?>|<\/?div.*?>~', '', $content);
$content = preg_replace('/(?=<!-- (THEME DEBUG|BEGIN OUTPUT|THEME HOOK|FILE NAME SUGGESTIONS|END OUTPUT))([\s\S]*?)-->/i', '', $content);
$content = preg_replace('/((\r\n|\n|\r)$)|(^(\r\n|\n|\r))$/m', '', $content);
return \Drupal\Core\Render\Markup::create(trim($content));
}
基本的なHTMLテンプレートにbefore_body
変数を追加することを忘れないでください。
ブロックレイアウトで操作する領域はページ変数の一部であり、bodyタグでレンダリングされるため、html.html.twigテンプレートに領域を直接配置する方法はありません。
HtmlRenderer::prepare()
はメインコンテンツレンダーを受け取り、 '#type' => 'page'レンダー配列があることを確認します(これはに対応します):
メインコンテンツのレンダリング配列がすでに '#type' => 'page'である場合、これで完了です
それ以外の場合は、「#type」=>「page」レンダー配列を構築する必要があります。 RenderEvents :: SELECT_PAGE_DISPLAY_VARIANTイベントが送出され、ページ表示バリアントを選択します。
デフォルトでは、装飾を適用しないSimplePageVariantが使用されます。
ただし、Blockモジュールを有効にすると、BlockPageVariantが使用されます。これにより、サイトビルダーは任意のページ領域にブロックを配置できるため、メインコンテンツを「装飾」できます。
Drupal 8モジュールはこのイベントにもサブスクライブでき、ルートごとでも、別のページバリアントを使用できます。 (パネル、ページマネージャーなどは、このイベントのおかげできれいに実装できます。)
HtmlRenderer::prepare()
が '#type' => 'page'レンダー配列で機能することが保証されるようになりました。 hook_page_attachments()
およびhook_page_attachments_alter()
が呼び出されます。 (特定のページにバインドされていないページレベルのアセットを添付する場合。)
レンダラー(以前のdrupal_render()
)は、'#type' => 'html'
テンプレートを使用するhtml.html.twig
レンダー配列で呼び出され、戻り値は文字列としてのHTMLドキュメントです。
このHTML文字列は、応答として返されます(具体的には、HtmlResponse
のより特殊なサブクラスであるResponse
オブジェクト)。
このページの詳細: https://www.drupal.org/docs/8/api/render-api/the-drupal-8-render-pipeline