[Concrete5]オートナビにページの説明文を表示[メモ]

Concrete5、すごく便利です。
ただ一点、日本語のドキュメントというか、まだユーザが少ないのでwordpressみたいにググればすぐにヒットするような状況ではなくて、一つ一つ手探りでやるんですが、それでもダメでいつもSさんに頼っている次第でございます。

ページリストでやれば説明文は簡単に出せる、でも。

ページリストブロック

Concrete5のページリストブロックには、デフォルトで個別のページの説明文を表示する記述がされているので、ブロック設置時点で表示非表示はワンクリックで出来てしまいます。すげー。

そう、ページリストを使えば全く問題なくページのリンクリストと説明文を表示出来てしまうのですが、ページリストはデフォルトでは階層構造が出せないんです。

↓こんなマークアップがしたいのに。

<ul>
  <li><a href="oya">親ページ</a>
    <ul>
      <li><a href="ko">子ページ</a>
      <ul>
        <li><a href="mago">孫ページ</a>
      </ul></li>
    </ul></li>
</ul>

ページリストだと「親ページ > 子ページ > 孫ページ」と言った階層順に上記のようにマークアップしつつ一覧にする事ができない。
実際に出てくるマークアップは、↓のようになってしまいます。
<ul>
<li><a href="oya">親ページ</a></li>
<li><a href="ko">子ページ</a></li>
<li><a href="mago">孫ページ</a></li>
</ul>

全部並列になってしまう。
ページリストで階層を出したい場合は、カスタムテンプレートをいじる必要があります。

じゃあ、オートナビを使いましょう

オートナビ

階層構造をマークアップしたいのであれば、ページリストのカスタマイズをするより、オートナビを使用すれば何も考えなくても勝手に階層順にしてくれます。

うほっ!超らくちん!

と最初わたしは思いましたが、今回の案件で、お客さんの要望としては、「最下層にあるページの説明をリストに追加したい。」ということですので、上記のマークアップの例で言うと、下記の3点が大きな要件でした。

  1. 孫ページに説明文を表示
  2. 孫ページに説明文が入力されていない場合は非表示
  3. 親と子ページには説明文を表示しない

オートナビに説明文を表示する機能はデフォルトでついていないので、どうにかしてデータを引っ張ってこないといけないのです。

さて、どうしたもんか。

やっぱりカスタムテンプレートは使わないといけないのであった。

オートナビのデフォルトテンプレートは以下のような記述になっています。

echo '<ul class="nav">'; //opens the top-level menu
foreach ($navItems as $ni) {
	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

階層に応じて、ifがあって、表示する階層分だけ繰り返すように書かれています。
concrete5のブロックというか、テンプレのファイルには結構な量のコメントが書かれていて、それを読めばどうやってデータを取得出来るかがわかりやすいです。
コメント内に、下記のようなインフォメーションが記載されているので、それを参照しつつ、テンプレートを書き換えます。

 * Each nav item object contains the following information:
 *	$navItem->url        : URL to the page
 *	$navItem->name       : page title (already escaped for html output)
 *	$navItem->target     : link target (e.g. "_self" or "_blank")
 *	$navItem->level      : number of levels deep the current menu item is from the top (top-level nav items are 1, their sub-items are 2, etc.)
 *	$navItem->subDepth   : number of levels deep the current menu item is *compared to the next item in the list* (useful for determining how many <ul>'s to close in a nested list)
 *	$navItem->hasSubmenu : true/false -- if this item has one or more sub-items (sometimes useful for CSS styling)
 *	$navItem->isFirst    : true/false -- if this is the first nav item *in its level* (for example, the first sub-item of a top-level item is TRUE)
 *	$navItem->isLast     : true/false -- if this is the last nav item *in its level* (for example, the last sub-item of a top-level item is TRUE)
 *	$navItem->isCurrent  : true/false -- if this nav item represents the page currently being viewed
 *	$navItem->inPath     : true/false -- if this nav item represents a parent page of the page currently being viewed (also true for the page currently being viewed)
 *	$navItem->attrClass  : Value of the 'nav_item_class' custom page attribute (if it exists and is set)
 *	$navItem->isHome     : true/false -- if this nav item represents the home page
 *	$navItem->cID        : collection id of the page this nav item represents
 *	$navItem->cObj       : collection object of the page this nav item represents (use this if you need to access page properties and attributes that aren't already available in the $navItem object)

今回使用するのは、最後の行の「$navItem->cObj」で、英語がよくわからないながらも読んでみると、どうやら「
ナビアイテムに該当するページのコレクションオブジェクト(既に用意されている$navItemオブジェクト以外でページプロパティとか属性が必要だったらこれを使え)」って書いてあるっぽいです。なんとなく雰囲気で和訳してるので多少の間違いは勘弁してください。

で、コードを追加しますた↓

echo '<ul class="nav">'; //opens the top-level menu
foreach ($navItems as $ni) {
	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 {
			$cobj = $ni->cObj; // ← $navItems->cObjを$cobjに入れる
			if($ni->level == 2 && $cobj->getCollectionDescription()) { //後述
			echo '<p>' . $cobj->getCollectionDescription() . '</p>';
		}
		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

順を追って説明すると、該当箇所は「$cobj = $ni->cObj;」から始まる4行です。

「$cobj = $ni->cObj;」で、インフォメーションにあった$navItems->cObjを変数にしました。

さらに、次の行のifの条件ですが、「$ni->level」を使用すると階層の深さが0から順に取得できますので、「$ni->level == 2」とすることで、「孫ページのみ」の条件指定ができます。汎用性持たせるなら、levelの値を数値じゃなくて、「一番大きい値」とか「最後の値」とか変数にしておいた方がいいかもですね。

さらに先ほど変数にした$cobjから「$cobj->getCollectionDescription()」を記述する事で、説明文が存在するかどうかの判別をしています。なので条件が「if($ni->level == 2 && $cobj->getCollectionDescription())」となっています。

で、最後にechoするだけ。なんということでしょう。今になって考えればこんなに簡単な事を、全然わからなくて2日くらいずっとやってました。アホです。

最終的に上記のカスタムテンプレートで、↓のようなマークアップになります。

<ul>
  <li><a href="oya">親ページ</a>
    <ul>
      <li><a href="ko">子ページ</a>
      <ul>
        <li><a href="mago">孫ページ</a>
     <p>説明文テキスト説明文テキスト説明文テキスト説明文テキスト説明文テキスト</p>
      </ul></li>
    </ul></li>
</ul>

以上。

iMac(2007 Mid)のHDDを交換しました。

実家で約3年ほど放置していた2007MidのiMacを久しぶりに起動した所、HDDから異音と共に動作しなくなってしまったので、さらに放置しておりましたが、ドライブやその他のパーツに関しては全く問題が無いので、なんとか復活させようと画策いたしました。

いろいろ調べた結果、手順と必要なものもわかりました。

最低限必要なもの

  • プラスドライバー
  • トルクスドライバー(ヘックスローブ) T-8
  • 大きめの吸盤(2個くらい)

あったら良いなーなもの

  • エアダスター
  • 拭き後が残らない液晶クリーナー
  • 毛布
  • 高さ20センチくらいの台
  • 掃除機
  • エタノール
  • 綿棒

では行った手順をどぞー。

1.メモリスロットパネルを外す

iMacには、画面下にあるリンゴのさらに下の面にメモリ増設用のスロットがありまして、そこを塞いでいるパネルがプラスのネジで留められています。

後の手順で、アルミの被さっている部分をごそっと外すのですが、このメモリスロットのパネルが外れていない状態ですと、下部が曲がったりしてしまうそうです(事前に知っていないとパネル外さないよねこれ)。

外しました。きったねー!!!!

掃除機でホコリを吸い取りました。

2.画面のガラスを外す

iMac2007というか、近年のiMacは大福iMacの後の液晶の大型化に伴い、画面にガラスが貼られています。
まずはガラスを取らないと話が始まらないという事で、吸盤を使って、ガラスをとっぱらいます。実際吸盤は何でも良いと思います。前述で大きめでって書いてるのは、安定感があるから。
iMacのガラスは磁石で張り付いてるので、吸盤をくっつけてちょっと引っ張れば簡単にはずれます。ぐいっとね。
吸盤を貼付けて持ち上げると、ガラスが外れます。

ガラスはどこかに置いておきましょう。

3.周りのアルミパネルを外す

液晶のガラスを外すと、写真のような、液晶がむき出しの状態になります。
ここで、トルクスドライバー(ヘックスローズ)を使用してアルミ部分に付いているネジを外していきます。ネジは全部で上辺4つ下辺4つ左右にそれぞれ2つずつで合計12個ありました。
無くさないように注意。

なお、ネジの種類は下辺の中央2つのネジだけ長く、それ以外は全て同じものでした。

アルミパネルは、裏側を抱え込むようにして上辺から外し、少し手前に持ち上げた後に下辺方向へスライドすると上手く外れました。

外れたー\(^o^)/やっぱりここもきったねー!!!

多分HDDが壊れた原因って、ホコリの所為で温度が上がりすぎて壊れたんじゃないかと思うくらいホコリが酷かった…。
ホコリは掃除機で一通り吸い取ったあと、細かい部分はエタノールを付けた綿棒でクルクルするときれいに取れます。きれいになった後の写真撮りわすれた。

上部に赤外線のセンサーのケーブル(多分)があって、セロハンテープが巻いてありました。
これも一旦外します。

4.液晶パネルを外す

液晶パネルの辺縁にもトルクスドライバーを使用する星形のネジが左右にそれぞれ4つずつありました。
これも外します。というか、HDDは液晶の裏中央にあるので、外さないと交換出来ません。
直接液晶部分を触ってしまうと、皮脂がついて汚れてしまうので気をつけましょう。
ネジを外したら、左右の金属部分を持ち上げて液晶パネルを外します。

液晶パネルを剥がして内部を見ると、僕の2007Midでは、左側の接続、右側の接続、中央下部の接続の3本のコネクタがありました。
それらを外したかったのですが、どうにも上手く外せなかったので、高さ20センチくらいの台の上に液晶パネルを乗せ、中を確認しました。


片手で撮ったからブレてら…。

中央の緑の基盤が見えているのが目的のHDDです。
右の黄色のシールが貼ってあるのは光学ドライブです。

5.HDDを外す

まず、HDD中央にあるコードを外します。温感センサーらしいです。テープかなんかで貼ってあるので剥がします。

HDDを止めているネジをトルクスドライバーで外します。
ここで外すネジは上部の2つだけです。
僕は下にある2つのネジも外そうとして、一つネジを外した時点で、外さなくて良い事を理解しました。え、だってググったサイトに書いてなかったんだもん…。

上部2つのネジを外すと、ドライブを止めている黒いプラスチックの部品が横にずらして外れるようになります。この後にHDD本体を上に持ち上げるとスイッと取り出す事ができます。

外れました。

6.新しいHDDに付け替える

元々入っていたHDDの下部にトルクスネジが2つ付いているのでこれを外し、新しいHDDに取り付けます。
外した時と同様に、新しいHDDを設置し、黒いプラスチックのHDD止め(?)をスライドして設置し、ネジを締めます。


右が純正のHDD。リンゴロゴが確認できます。western digital製でした。


新しいHDDを取り付けました。

7.外したものを全て取り付けて行く

同じ手順で外していたものを戻していきます。ネジの付け忘れに注意。

8.OSインストール

OS10.7以降はHDDやSSDと別の領域にOSがあるのでストレージを交換しても普通に起動するとOSインストール画面が起動した覚えがあるのですが、元々のマシンが10.5だったりするとインストーラーディスクが必要になるみたい。持っててよかったSnowLeopard!!

インストールディスクをドライブに突っ込んで、option(alt)キーを押しながら起動→「インストールディスク」をクリックすれば、必要事項の入力とかあるけど大体40分くらいでOSインストール完了!

320GBから2TBになってよみがえったiMac!!

多分SSDもマウンタ買えば出来るはず。興味がある人はやってみるといいよ、でも壊れても自己責任だよ、僕の所為にしちゃいけないよ。