ドロップダウンナビを作るメモ

   

concrete5で作ったサイトのメインナビゲーションで、サブページをドロップダウンで表示したくてメモ。

mainnav1デモのメインナビはこんな感じ。
属性によるメインナビに表示するナビゲーションを制御しない場合は、属性の部分は飛ばしてください。

属性を作る

dropdown1

管理画面内の「ページとテーマ」にある「属性」をクリックして、
ページ下部の「属性を追加」でチェックボックスを選択して「実行」をクリックする。

dropdown2

メインから除く属性にするか、メインに含む属性にするか…。
これは迷ったんですけど、ナビに表示したいページは限られているため、今回は「メインナビに含む」という新しい属性を作成しました。
メインナビに含むページにチェックを入れるので、デフォルト値はチェックをはずしておく。
ナビのボリュームが大きいならはずすの方が便利だろうしこのあたりは好みとかお客様との相談とかでどっちがいいのかで適宜変更してください。今回は含むでメモる。

sitemap2

メインナビに表示したいページの属性から「メインナビに含む」を選択し、チェックをいれて保存しておく。

オートナビブロックを追加する

mainnav1

サービス、サブページ1、サブページ2には「メインナビに含む」属性が選択されています。
お知らせ及びその子ページやサイトマップなどなどメインナビに含まないものには選択してありません。

カスタムテンプレートを作る

メインナビ用のカスタムテンプレートを作ります。
concrete/blocks/autonavフォルダ内にあるview.phpをコピーし、
application/blocks/autonav/templates/内にmainnavフォルダを作ってペーストする。

ドロップダウンメニューは、今回flexnavを利用します。

カスタムテンプレートを作るにあたっての準備

基本的な動かし方はflexnavサイトのBasic Usageのままです。
別に行った作業として、下記コードは今回外部ファイルにし、flexnavsetting.jsとしました。

$(".flexnav").flexNav();

 

jquery.flexnav.min.jsとflexnavsetting.jsはapplication/js/内に設置します。
css、fontフォルダは先ほど作ったmainnavフォルダ内に設置します。

view.phpファイルにFlexNavを動かすための記述をします。

defined('C5_EXECUTE') or die("Access Denied.");

の下に下記を追加します。

$html = Core::make('helper/html');
print $this->addFooterItem($html->javascript('jquery.flexnav.min.js'));
print $this->addFooterItem($html->javascript('flexnavsetting.js'));

cssは自動的に呼ばれるのでリンクははらなくても大丈夫です。

echo '<ul class="nav">'; //opens the top-level menu

の箇所を

echo '<div class="menu-button">Menu</div><ul class="flexnav" data-breakpoint="800">'; //opens the top-level menu

に変更します。

mainnav2

カスタムテンプレートを「Mainnav」にします。

flexnav1

こんな感じになります。
デフォルトでは800px未満のサイズのブラウザではこんな感じ。flexnav2

cssで色デザインやjavascriptのoptionsを好きなようにカスタマイズしていきます。

属性による分岐

FlexNavによるドロップダウンが動くことを確認し、あとはさきほど作った属性で分岐をします。

//*** Step 2 of 2: Output menu HTML ***/

if (count($navItems) > 0) {
    echo '<div class="menu-button">Menu</div><ul class="flexnav" data-breakpoint="800">'; //opens the top-level menu

    foreach ($navItems as $ni) {
	   	if ($ni->cObj->getAttribute('global_nav_select')) {
	        echo '<li class="' . $ni->classes . '">'; //opens a nav item
	        echo '<a href="' . $ni->url . '" target="' . $ni->target . '" class="' . $ni->classes . '">' . $ni->name . '</a>';

	        if ($ni->hasSubmenu) {
	            echo '<ul>'; //opens a dropdown sub-menu
	        } else {
	            echo '</li>'; //closes a nav item
	            echo str_repeat('</ul></li>', $ni->subDepth); //closes dropdown sub-menu(s) and their top-level nav item(s)
	        }
	    }
    }

    echo '</ul>'; //closes the top-level menu
} else if (is_object($c) && $c->isEditMode()) { ?>
    <div class="ccm-edit-mode-disabled-item"><?php echo t('Empty Auto-Nav Block.')?></div>
<?php }

flexnav3
メインナビに含まれているもののみ表示されるようになります。

 - concrete5