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

質問全般・改善要望
返信する
Kenny
メンバー
メンバー
記事: 179
登録日時: 2011年5月28日(土) 13:41

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

投稿記事 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`]]

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

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

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

投稿記事 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行も書かないくらいで実装できそうかなと。
kazuike
メンバー
メンバー
記事: 507
登録日時: 2009年8月12日(水) 12:53

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

投稿記事 by kazuike »

参考にならないかもしれませんが…

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

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

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

追記)
よく考えてみると、この方法でも、
Kenny さんが希望されてる、否定のORは、無理かもしれませんね。f(^^;;
▼ウェブ屋のCMS→modxヒキダス流(備忘録)
http://d.hatena.ne.jp/hikidas_ikeda/
kazuike
メンバー
メンバー
記事: 507
登録日時: 2009年8月12日(水) 12:53

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

投稿記事 by kazuike »

DittoのExtenderって色々とあって、
作ったExtenderを、Dittoのフィルターとして使う際の指定の仕方がちょっと思い出せないので…

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

コード: 全て選択

[+tv1:is=`0`:and:if=`tv2`:is=`0`:then=``:else=`出力したい内容`+]
のような感じで、条件によっては、何も出力しないという方法も考えられます。
ただし、件数のプレイスホルダやページング等を使用する場合は、
上記の出力しないレコードも、件数にカウントされますので、使えません。
▼ウェブ屋のCMS→modxヒキダス流(備忘録)
http://d.hatena.ne.jp/hikidas_ikeda/
Kenny
メンバー
メンバー
記事: 179
登録日時: 2011年5月28日(土) 13:41

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

投稿記事 by Kenny »

kazuikeさん

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

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

提案戴いたものを試してみます!
ありがとうございました。
Kenny
メンバー
メンバー
記事: 179
登録日時: 2011年5月28日(土) 13:41

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

投稿記事 by Kenny »

yamaさま

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

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

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

検証までして戴きまして、本当にありがとうございます。
kazuike
メンバー
メンバー
記事: 507
登録日時: 2009年8月12日(水) 12:53

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

投稿記事 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`」を加える。
▼ウェブ屋のCMS→modxヒキダス流(備忘録)
http://d.hatena.ne.jp/hikidas_ikeda/
Kenny
メンバー
メンバー
記事: 179
登録日時: 2011年5月28日(土) 13:41

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

投稿記事 by Kenny »

kazuikeさま

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

この様な方法もあるのですね。
是非試させていただきます。
アバター
yama
管理人
記事: 3251
登録日時: 2009年7月29日(水) 02:50

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

投稿記事 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`]]
Kenny
メンバー
メンバー
記事: 179
登録日時: 2011年5月28日(土) 13:41

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

投稿記事 by Kenny »

yamaさま

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

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

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

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

Modxバンザイ!
返信する