Re: 特定のページだけを階層を含めたメニュー表示にする方法について

2014年3月4日 at 12:10

返信ありがとうございます。
わかりにくい質問で失礼いたしました。

今回実現させたいことは、
オートナビで下層ページを非表示にしたいのではなく、下層ページをも表示させたいのです。

かつ、ナビから除く属性を使わずに一部ページに絞り込めたらと思います。

このスレッドの最初の質問と同じ事をしたいと思っておりますが、
下記の記述をみつけられないため困っております。

if (!$_c->getCollectionAttributeValue('exclude_nav')) {

どうぞよろしくお願いいたします。

Re: 特定のページだけオートナビなどを使ってメニューに表示する方法

2014年3月4日 at 14:16
いえ、理解しているのですが下層ページを除く属性を使って表示したい階層以外は消した方が楽です。テンプレートでできることには限界があります。
 

Re: Re: 特定のページだけオートナビなどを使ってメニューに表示する方法

2014年3月4日 at 16:10
たびたびすみません。

下記のように、階層を維持した状態で表示させたいのです。

○サイトマップ
ホーム
┣ p1
┃┣ p1-1
┃┗ p1-2
┣ p2
┣ p3
┗ p4
 ┣ p4-1
 ┗ p4-2

○オートナビで表示させたいページ
メニューAの場合
p1
┗ p1-1
p3
p4
┣ p4-1
┗ p4-2

メニューBの場合
p2
p4
┣ p4-1
┗ p4-2

メニューによって表示させたいページが違うので、「ナビから除く」属性ではなく、
自作した属性でしぼり込めないかどうかと思いました。

(メニューAの場合)
'menu_a'という属性を自作し表示したいページにチェック。
menuA用のカスタムテンプレートに
下記の記述を足す事で絞り込む事は可能になりました。
if($ni->cObj->getAttribute('menu_a')){


しかし、下記のように閉じタグが出力されず、どんどん入れ子になっていってしまいます。
p1
┗ p1-1
 ┣ p3
 ┗ p4
  ┣ p4-1
  ┗ p4-2

出力結果

<ul>
 <li>p1
  <ul class="sub">
   <li>p1-1
   <ul class="sub">
    <li>p3</li>
    <li>p4
    <ul class="sub">
     <li>p4-1</li>
     <li>p4-2</li>
 </li>
</ul>


いまのバージョンでは実現不可なのでしたらあきらめたいと思います。
 

Re: 特定のページだけオートナビなどを使ってメニューに表示する方法

2014年3月4日 at 17:08
テンプレートの作り方の問題だと思いますので、全体を投稿してください。このフォーラムにコードを投稿しにくくてすみませんが、gistやpastbinを使っていただければ。
 

Re: 特定のページだけオートナビなどを使ってメニューに表示する方法

2014年3月4日 at 17:32
こちらです。
http://pastebin.com/pbmHKy2R
よろしくお願いいたします。
 

Re: 特定のページだけオートナビなどを使ってメニューに表示する方法

2014年3月4日 at 18:28
こんな感じでオリジナルの属性をチェックしたページがナビから表示されなくなります。

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

$navItems = $controller->getNavItems();

foreach ($navItems as $ni) {
$classes = array();

if ($ni->isCurrent) {
$classes[] = 'current';
}

if ($ni->inPath) {
$classes[] = 'nav-path-selected';
}

$ni->classes = implode(" ", $classes);
}

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

$exclude_children_below_level = 9999;

foreach ($navItems as $ni) {

$exclude_subpages = $ni->cObj->getAttribute('exclude_subpages_from_menu_a');

$current_level = $ni->level;
if ($current_level > $exclude_children_below_level) {
$exclude_page = true;
} else {
$excluded_parent_level = 9999;
$exclude_children_below_level = $exclude_subpages ? $current_level : 9999;
$exclude_page = false;
}

if (!$exclude_page) {

echo '<li class="' . $ni->classes . '">'; //opens a nav item

echo '<a href="' . $ni->url . '" target="' . $ni->target . '" class="' . $ni->classes . '">' . $ni->name . '</a>';

if (!$exclude_subpages) {
if ($ni->hasSubmenu) {
echo '<ul class="sub">'; //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
 

Re: Re: 特定のページだけオートナビなどを使ってメニューに表示する方法

2014年3月4日 at 19:19
いろいろとありがとうございます。
書いていただいたテンプレートの通りだと、
オリジナルの属性をチェックしたページの下層ページがナビから表示されなくなりました。

下層ページだけでなく、オリジナルの属性をチェックしたページ自体も非表示にするために
if (!$exclude_page) {


if (!$exclude_page && !$exclude_subpages) {

に変更しました。

!を取るとやはり階層表示できなくなるようですので、
ページ属性にチェックが入っている場合、表示するという風には現状できないということで納得いたしました。

なので「メニューAに含む」ではなく「メニューAに含まない」属性で進めたいと思います。

どうもありがとうございました。