web-dev-qa-db-ja.com

メニューブロックがレンダリングされる領域を決定する

わずかに異なるマークアップを使用して、2つの異なるリージョンで同じメニューを再利用する必要があります。私の考えは、ブロックがレンダリングされている領域を確認し、ifステートメントを使用して必要に応じてクラス/構造を変更することでした。

私は障害物にぶつかった。ブロックがどの領域にあるかを取得する方法を見つけることはできましたが、そのデータをメニューに渡す方法がわかりません。これが私の現在のコードです:

_// Add a region variable to a block.
function theme_preprocess_block(&$variables, $hook) {
    $block_id = $variables["elements"]["#id"];
    $block = \Drupal\block\Entity\Block::load($block_id);
    $variables["region"] = $block->getRegion();
}
_

_block--system-menu-block.html.twig_でregion変数を問題なく出力できますが、変数を試しても_menu.html.twig_に渡されません。

私はこれに対する答えを形作っている石のように感じます。誰かが私を正しい方向に向けることができれば、私は非常に感謝します。

簡単なメモ:WordPress開発から来たDrupalは初めてです。これまでのところ、移行は難しいため、テーマ設定について何も知らないと仮定してください:)

1
JacobTheDev

記事の助けを借りてこれを理解しました!

http://kristiankaa.dk/article/drupal8-region-specific-menu-theme-hook-suggestion

// Add a region variable to a block.
// http://kristiankaa.dk/article/drupal8-region-specific-menu-theme-hook-suggestion
function THEMENAME_preprocess_block(&$variables) {
    if (isset($variables["elements"]["#id"])) {
        $block_id = $variables["elements"]["#id"];
        $block = \Drupal\block\Entity\Block::load($block_id);

        if ($block) {
            $variables["content"]["#attributes"]["region"] = $block->getRegion();
        }
    }
}

// add a template suggestion based on region name
// http://kristiankaa.dk/article/drupal8-region-specific-menu-theme-hook-suggestion
function THEMENAME_theme_suggestions_menu_alter(array &$suggestions, array $variables) {
    if (isset($variables["attributes"]["region"])) {
        $suggestions[] = $variables["theme_hook_original"] . "__" . $variables["attributes"]["region"];
    }
}

それは私が試していたことを正確に行いませんが、ブロックがレンダリングされている領域に基づいて異なるテンプレートを使用することができます。閉じる私には十分です:)

7
JacobTheDev