phxで親判定?  【解決済み】

質問全般・改善要望
返信する
mune3001
メンバー
メンバー
記事: 63
登録日時: 2010年5月08日(土) 16:58

phxで親判定?  【解決済み】

投稿記事 by mune3001 »

お知恵をお貸し下さい。

リソースが
document Parent(14)
 └document A(15)
   └document B(16)
   └document C(17)
 └document D(18)
   └document E(19)
   └document F(20)

このような構造の場合に
document C(17) にて
document A(15)に含まれてる場合にtrueを返すには
phxのModifiersでどのように書けばよろしいのでしょうか?


【やりたいこと】

document Parent(14)

[!Ditto?
&parents=`14`
&display=`all`
&hideFolders=`0`
&tpl=`list_tpl`
&depth=`1`
!]
このような場合に
list_tpl内にて
<li><a href=[~[+id+]~]>[+pagetitle+]</a></li>

<li class="current">
としたい

jsでの出力もいいですが
URLの関係で出せない場合がでてくるので
ditto内で出来ればいいと思います。

カレントページであれば
tplCurrentDocument
で対応可能ですが
例えばカテゴリーのみを一覧表記している場合に効かなくなります。


応用として
ヘッダーナビゲーションなどに
ハイライトできるなど痒いところに手が届く気がします。

宜しくお願いいたします。
アバター
yama
管理人
記事: 3236
登録日時: 2009年7月29日(水) 02:50

Re: phxで親判定?

投稿記事 by yama »

<li class="[+parent:current+]">
というふうに記述して、[+parent+]の値を判定するcurrentモディファイアを作成できると思います。

<li class="[[current]]">
[+parent:current+]という書き方が可読性的に分かりにくいようにも思いますので、上記のようにスニペットとして作るのもシンプルでよさそうに思います。
スニペット内部では$modx->documentObject['parent']の値を参照します。
mune3001
メンバー
メンバー
記事: 63
登録日時: 2010年5月08日(土) 16:58

Re: phxで親判定?

投稿記事 by mune3001 »

yama様
お忙しい中ありがとうございました。

今回はスニペットの形で作成いたしました。

[[current]]
<?php
$documents = $link;
$docId = $modx->documentObject['id'];
$arrayParents = $modx->getParentIds($docId);
$set = "current";


if ($documents == $docId) {
$output = $set;
} else {

foreach ( $arrayParents as $val ) {
if ($documents == $val) {
$output = $set;
break;
}
}
}
echo $output;
?>

[[current? &link=`id`]]
の形で&linkにIDを投げると
子孫または同じ
$set のテキストを返します。

ditto内だけでなく
各ページのナビゲーションなど応用が効くかとおもいます。

もっと最適化した書き方があるとは思いますので
他の書き方などありましたらご教授ください。
アバター
yama
管理人
記事: 3236
登録日時: 2009年7月29日(水) 02:50

Re: phxで親判定?

投稿記事 by yama »

コード: 全て選択

<?php
if(!isset($set)) $set = 'current';
$docId = $modx->documentObject['id'];
if($link == $docId) return $set;
else {
    $arrayParents = $modx->getParentIds($docId);
    foreach ($arrayParents as $val) {
        if($link == $val) return $set;
    }
}
?>
チャットで回答した内容ほぼそのままですが、簡単にこれだけでよさそうに思います
返信する