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

2012年5月23日 at 17:29

------------------------------------------------------------------------------------------------------
解決済 ----- 以下解決方法
*バージョン5.5.2.1jaを使用
*適当に行えば、動作確認済みですが、自己責任でお願いします。

目的
オートナビブロックを使って、特定のページのみを表示する方法。

例として、menu1というカスタムテンプレートを適用した
オートナビブロックで特定のページのみを表示したいとする。



方法
0.
あらかじめ、menu1というカスタムテンプレートを作っておく。
phpファイルの情報は、

concrete/blocks/autonav/view.php

の内容をコピー&ペースト。
(デフォルトの設定)

1.
ページ属性を作成する。

管理画面、ページ&テーマ、属性より、
「属性を追加」から、
真偽値として、新規に属性を追加する。

2.
項目を埋めていく。

「ハンドル名」は任意でよいが、
「このページ属性を追加したページはmenu1に表示される」
という風にしたいので、

include_menu1

と仮にしておく。



「名前」も任意でよい。わかりやすいように、

menu1に含める

と仮にしておく。

3.
ページにページ属性を付加していく。

サイトマップより、menu1に表示したいページに
さきほど作ったページ属性を与えていく。

ページをクリック、設定、カスタム属性の一覧に
「menu1に含める」という項目ができているはずなので、

クリックして、はいにチェックを入れ、保存。

4.
phpファイルをいじっていく。

詳しくはよくわからないが、25行目の

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

によりメニュー表示の有無が制御されている。

上記を読み替えると、

「exclude_nav」というページ属性がついていないページをメニューに表示します。

という意味なので、

「exclude_nav」というページ属性がついていない、
かつ「include_menu1」というページ属性がついているページをメニューに表示します。

という風にすれば、目的が達成される。


ちなみに、! は ≠(ノットイコール)という意味で、「かつ」を指定するには、and を使用する。

なので、25行目を以下に書き換える。

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



そして、ファイルを保存すれば・・・完成!
------------------------------------------------------------------------------------------------------
こんにちわ。Concrete5初心者です。
現在バージョン5.5.2.1を使用して、仮想環境でいろいろ試しています。
知識としては、まだhtmlとcssしかありません。

さて、特定のページだけメニューに表示する方法ですが、
僕は以下のような方法でやっております。

これが一般的なやり方なのか、
あるいは他にも方法があるのか教えていただければありがたいです。

---------------------------------------------------

例えば、

Aメニューには、ページ1,2,3
Bメニューには、ページ4、5,6
Cメニューには、ページ1~9
(ページ総数は上記9ページのみとする。)

を表示させたいとします。
加えて、ページ構造上、
ページ1~9は同階層(かつトップと同階層)に置きたいとします。

Cメニューは単純にオートナビので簡単に処理できますが、
Aメニュー、Bメニューに関しては僕は以下のようにやっております。

1.
Aメニュー用、Bメニュー用にそれぞれ、

menuA
menuB

というページを作る。(+オートナビなどから除く処理を施す。)

2.
menuA内に、ページ1~3のエイリアスを作成
menuB内に、ページ4~6のエイリアスを作成

3.
オートナビで、表示開始レベルを特定のページ下にして、
それぞれ、menuA,menuBを選ぶ。

---------------------------------------------------

以上で、外見上やりたい事は達成されますが、
例えば、Aメニューよりページ1にアクセスすると、
ページパスが

/menuA/ページ1

となりますよね?

「普通」にアクセスすれば、

/ページ1

が本来のページパスとなるところですが。

「プリティURLだからそうなるだけで本来のURLはまた別だ。」
と言われればそれまでですが、
この例の場合で、メニューAからページ1にアクセスしても、
ページパス表示を

/ページ1

にすることは可能なのでしょうか?

あるいは、根本的にこのようなメニューを作る方法が別にあり、
その方法ならどこからのアクセスでもページパス表示が、

/ページ1

という風になる方法はあるのでしょうか?

長文失礼致しました。

タグ:

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

2012年5月23日 at 18:30
カスタムテンプレートを使うことが多いです。

オートナビから除く処理は、exclude_navというページ属性の有無を見て、autonavブロックのテンプレートに書かれています。
if (!$_c->getCollectionAttributeValue('exclude_nav')) {


例えばcustom_navというページ属性にチェックが入ってる場合、という風に変えるなら
if ($_c->getCollectionAttributeValue('custom_nav')) {



あるいは Page List Plus という有償アドオンなら、特定のページタイプのみ表示することもできるようです。
 

解決しました!

2012年5月23日 at 22:47
>hissyさん

おおおーーーーできました!!!ありがとうございます☆

ページ属性・・・そういう概念だったんですか!

カスタムテンプレートは使っていましたが、
ページ属性の存在はスルーされていましたw

せっかくなので、他の人のためにもやった方法記しておきます。
・・・という風にした方がフォーラム的にも良いですよね?
 

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

2012年5月24日 at 8:39
解決方法の追記、ありがとうございます。ところで、PHPで and が使えるのを初めて知りましたw
同じ意味ですけど、PHPでは and と or ではなくて && と || のほうがよく使われるような気がします。
 

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

2014年2月28日 at 16:55
初めまして、
関連が強いと思いましたので解決後の記事への質問、失礼致します。

現在オリジナルテーマでサイトを作成中です。

オートナビを利用して特定のページだけを表示させる際、
こちらを参考にさせていただきましたが、

バージョンが違うためか、
4.の表示を制御するphpが見つからなかったため、

if (!$_c->getCollectionAttributeValue('属性')) {

の代わりに
foreach ($navItems as $ni) {
の直後に
if($ni->cObj->getAttribute('属性')){
を追加してみました。

するとその属性値にチェックしたものだけを表示する事はできたのですが、
階層表示がされなくなってしまいました。

if($ni->cObj->getAttribute('属性')){
の中だと
echo str_repeat('</ul></li>', $ni->subDepth);
の部分が動作しないようです。

これは
if($ni->cObj->getAttribute('属性')){
この部分が間違っているということでしょうか。
上記を追加して閉じた以外はデフォルトのview.phpと同じです。

ナビから除く属性は使わない
解決方法があればご指南いただきたいです。
よろしくお願いいたします。

concrete5バージョン:5.6.2.1
 

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

2014年3月4日 at 9:42
"exclude_subpages_from_nav" というハンドルの属性を作りチェックすると、下層ページがオートナビから表示されなくなります。いまのバージョンでは、この属性を使用した方が楽だと思います。
 

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に含まない」属性で進めたいと思います。

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