web-dev-qa-db-ja.com

html.html.twigに領域を挿入する

Html.html.twigにリージョンを追加する方法はありますか?ブロックレイアウトを介してさまざまなjsカウンターをレンダリングできるように、1つの内部タグが必要です

1
Evgeniy Monakov

したがって、解決策は、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変数を追加することを忘れないでください。

2
Evgeniy Monakov

ブロックレイアウトで操作する領域はページ変数の一部であり、bodyタグでレンダリングされるため、html.html.twigテンプレートに領域を直接配置する方法はありません。

HtmlRenderer::prepare()はメインコンテンツレンダーを受け取り、 '#type' => 'page'レンダー配列があることを確認します(これはに対応します):

  1. メインコンテンツのレンダリング配列がすでに '#type' => 'page'である場合、これで完了です

  2. それ以外の場合は、「#type」=>「page」レンダー配列を構築する必要があります。 RenderEvents :: SELECT_PAGE_DISPLAY_VARIANTイベントが送出され、ページ表示バリアントを選択します。

    • デフォルトでは、装飾を適用しないSimplePageVariantが使用されます。

    • ただし、Blockモジュールを有効にすると、BlockPageVariantが使用されます。これにより、サイトビルダーは任意のページ領域にブロックを配置できるため、メインコンテンツを「装飾」できます。

    • Drupal 8モジュールはこのイベントにもサブスクライブでき、ルートごとでも、別のページバリアントを使用できます。 (パネル、ページマネージャーなどは、このイベントのおかげできれいに実装できます。)

  3. HtmlRenderer::prepare()が '#type' => 'page'レンダー配列で機能することが保証されるようになりました。 hook_page_attachments()およびhook_page_attachments_alter()が呼び出されます。 (特定のページにバインドされていないページレベルのアセットを添付する場合。)

  4. レンダラー(以前のdrupal_render())は、'#type' => 'html'テンプレートを使用するhtml.html.twigレンダー配列で呼び出され、戻り値は文字列としてのHTMLドキュメントです。

  5. このHTML文字列は、応答として返されます(具体的には、HtmlResponseのより特殊なサブクラスであるResponseオブジェクト)。

このページの詳細: https://www.drupal.org/docs/8/api/render-api/the-drupal-8-render-pipeline

0
Andrew Nim