ページ 11

Dittoのフィルターで「テンプレート変数に何かが入っていたら出力する」という使い方  【解決済み】

Posted: 2012年12月02日(日) 15:41
by Kenny
-----
ご利用のサーバ:heteml
Webサーバのバージョン :Apache 2.0.xx
PHPのバージョン : PHP5.3
データベースのバージョン :MySQL5
MODXのバージョン :1.0.6J-r3
ブラウザ :IE9
-----

最近、頻繁にお世話になっております。

私は、Dittoのフィルターを、妙な使い方で使用しております。
フィルターで、「テンプレート変数の中に何かがある場合は、引っ張ってくる」という使い方をしております。
下記のコードの場合「テンプレート変数①」「テンプレート変数②」”どちらにも何かが入っている場合”は、引っ張ってくるという風になります。
言葉はおかしいですが「andのフィルター」になってしまいます。

これを「orのフィルター(テンプレート変数①”もくしくは”テンプレート変数②に何かが入っている場合)」にしたいと思い、様々な組み合わせで試してみたのですが、どうもうまくいきません。

[[Ditto? &tpl=チャンク &filter=`テンプレート変数①,0,3|テンプレート変数②,0,3` &parents=`親ID` &depth=`1`]]

この様なことは不可能でしょうか?

よろしくお願い致します。

Re: Dittoのフィルターで「テンプレート変数に何かが入っていたら出力する」という使い方

Posted: 2012年12月02日(日) 23:45
by yama
http://mng.demo.modx.jp/
上記でサンプルを作っていただくことは可能でしょうか?(自分でもやってみたのですが、ちょっと把握できなかった気がするので)

その他、ヒント的な情報は2つあって、

https://github.com/Sammyboy/MODx-Ditto-Extenders
上記のエクステンダがもしかすると使えるかも?ということと

コード: 全て選択

function exampleFilter($resource) {
	if (strtolower($resource['pagetitle']) == "foo") {
		return 1;
	} else {
		return 0;
	}
}
自分はやってみたことはないですが、エクステンダの自作は意外と簡単なのでは?という気もしています。
同梱されている上記のコード例だと、リソース名が「foo」だった場合にフラグを立ててリストに表示するという処理になっているものと思います。
これだったら10行も書かないくらいで実装できそうかなと。

Re: Dittoのフィルターで「テンプレート変数に何かが入っていたら出力する」という使い方

Posted: 2012年12月03日(月) 10:12
by kazuike
参考にならないかもしれませんが…

Dittoのフィルターは、その名前の通り、その条件にあうものだけが通っていくイメージで、
基本的に絞り込みになります。
複数のフィルタを指定した場合は、ANDになりますね。

これは、ちょっと裏技的な使い方にはなりますが、
Dittoで、複数条件をORで使いたいときは、タギングを使うという手もあります。

Dittoのタギング(tagging)をフィルター代わりに使う
http://d.hatena.ne.jp/hikidas_ikeda/20090517/1242521866

追記)
よく考えてみると、この方法でも、
Kenny さんが希望されてる、否定のORは、無理かもしれませんね。f(^^;;

Re: Dittoのフィルターで「テンプレート変数に何かが入っていたら出力する」という使い方

Posted: 2012年12月03日(月) 10:45
by kazuike
DittoのExtenderって色々とあって、
作ったExtenderを、Dittoのフィルターとして使う際の指定の仕方がちょっと思い出せないので…

もう一つ、さらに裏ワザ的ですが…
Dittoのtpl側でPHxを使って、

コード: 全て選択

[+tv1:is=`0`:and:if=`tv2`:is=`0`:then=``:else=`出力したい内容`+]
のような感じで、条件によっては、何も出力しないという方法も考えられます。
ただし、件数のプレイスホルダやページング等を使用する場合は、
上記の出力しないレコードも、件数にカウントされますので、使えません。

Re: Dittoのフィルターで「テンプレート変数に何かが入っていたら出力する」という使い方

Posted: 2012年12月03日(月) 13:00
by Kenny
kazuikeさん

様々な方法を提案戴きありがとうございます。

やはり、かなり特殊なフィルターの使い方なのですね。。
削っていく方向で使うものを、反対の使い方をしているわけですからね。

提案戴いたものを試してみます!
ありがとうございました。

Re: Dittoのフィルターで「テンプレート変数に何かが入っていたら出力する」という使い方

Posted: 2012年12月03日(月) 13:07
by Kenny
yamaさま

毎度毎度、ありがとうございます。

サンプルは下記のURLにございます。
使用しているファイルは、一番上の「test」とその下の「test」フォルダだけです。

http://121203115255-1945.evo.demo.modx.jp/manager/

検証までして戴きまして、本当にありがとうございます。

Re: Dittoのフィルターで「テンプレート変数に何かが入っていたら出力する」という使い方

Posted: 2012年12月03日(月) 13:47
by kazuike
せっかくなので、
Dittoのカスタムフィルタの作り方

1)
以下のような内容の「hogeFilter.extender.inc.php」を作成する。
例)テンプレート変数「tv1」「tv2」がともに「0」の場合は出力しない。

コード: 全て選択

<?php
$filters["custom"]["hogeFilter"] = array("tv1,tv2","hogeFilter"); 
if (!function_exists("hogeFilter")) {
	function hogeFilter($resource) {
		if ($resource['tv1'] == "0" && $resource['tv2'] == "0") {
			return 0;
		} else {
			return 1;
		}
	}
}
?>
2)
作成した「hogeFilter.extender.inc.php」を
「assets/snippets/ditto/extenders/」にアップロードする。

3)
Dittoのパラメータに「extenders=`hogeFilter`」を加える。

Re: Dittoのフィルターで「テンプレート変数に何かが入っていたら出力する」という使い方

Posted: 2012年12月04日(火) 09:31
by Kenny
kazuikeさま

再びありがとうございます!

この様な方法もあるのですね。
是非試させていただきます。

Re: Dittoのフィルターで「テンプレート変数に何かが入っていたら出力する」という使い方

Posted: 2012年12月04日(火) 09:48
by yama
http://121203115255-1945.evo.demo.modx.jp/manager/
なるほど確認しました。kazuikeさんのおっしゃるとおり、フィルターは条件を増やすごとに表示数が減るものなので今回は基本的に無理があるかもしれません。andかorかというより、フィルター自体が増えるということになるのですね。

http://121203115255-1945.evo.demo.modx.jp/2.html
kazuikeさんが書いたエクステンダーを少し調整して組み込んでみましたが、どうでしょう?こっちのほうが単純で分かりやすいのではと思います。

コード: 全て選択

<?php
$filters["custom"]["hogeFilter"] = array("テンプレート変数①,テンプレート変数②","hogeFilter");
if (!function_exists("hogeFilter")) {
   function hogeFilter($resource) {
      if (empty($resource['テンプレート変数①']) && empty($resource['テンプレート変数②'])) {
         return 0;
      } else {
         return 1;
      }
   }
}
[[Ditto? &tpl=test &extenders=`hogeFilter` &parents=`16`&depth=`1`]]

Re: Dittoのフィルターで「テンプレート変数に何かが入っていたら出力する」という使い方

Posted: 2012年12月04日(火) 20:42
by Kenny
yamaさま

検証戴きありがとうございました。

利用させていただきます。

毎回、本当に勉強になります。

回答いただいた方みなさん、本当にありがとうございました。

Modxバンザイ!