SwitchDefaultTemplate更新

MODXリソース作成時のデフォルトテンプレートを切り替える「SwitchDefaultTemplate」をアップしました。
http://www.hikidas.com/hikidas/modx_resource/modx_elements/SwitchDefaultTemplate.ja.html
MODX-1.0.14J-r9の仕様変更で、リソース作成・編集画面のイベント発火とテンプレート変数を読み込む順番が前後したことを受けての更新です。
一応、MODX-1.0.14J-r8以前でも動作するように考えて更新しましたが、検証はできていません。

MODX管理画面(ManagerManager)で必須入力と項目名変更を同時に指定する際の注意

MODX管理画面をManagerManagerでカスタマイズする際、
必須入力の指定「mm_requireFields」を使うと、項目名の横に赤色の星マーク「*」が付きますが、
必須入力の指定「mm_requireFields」より後で、同じ項目に対して、項目名の変更「mm_renameField」を行うと、赤色の星マーク「*」が消えます。
(必須入力のバリデート(チェック)そのものは有効です)

MODX管理画面でフォルダ(コンテナ)内だけを編集可能にする

MODXの管理画面で、ユーザの権限(投稿者等)によっては、
特定のフォルダ(コンテナ)以下は編集可能にしたいが、
フォルダ(コンテナ)自体は編集できないようにしたい。
という場合、
・グローバル設定/インターフェースとその他の機能で、
 「権限のないリソースの表示」を「はい」にして、
・フォルダ(コンテナ)の所属グループを設定する。
という方法がありますが、
これだと、ツリーで見せたくないリソースやフォルダ(コンテナ)等があっても、ユーザに見えてしまいますね。

そこで、
編集させたくないフォルダ(コンテナ)の所属グループは設定せず(制限なし)にしておいて、
MODXプラグインManagerManagerの「mm_widget_accessdenied」を使って、 画面上の表示で編集不可にするという方法があります。
http://modx.jp/docs/extras/plugins/mm/widgets.html

使い方は、リソースIDとメッセージとロールを指定するだけです。
他のManagerManagerの機能を使ったことがある人なら問題なく使えると思いますので、 以下、「mm_widget_accessdenied」応用編ということで…

1)テンプレート単位でアクセス不可にする。

「mm_widget_accessdenied」の指定がリソース単位(リソースIDによる指定)ですので、そのままでは、テンプレートによって編集不可にするということができません。
そこで、以下のような感じで、該当のページが指定のテンプレートを使用していたら「mm_widget_accessdenied」を呼び出すという関数を定義して使うという方法があります。
// テンプレートID指定でアクセス不可を設定する関数
if (! function_exists("mm_deny_templates")) {
	function mm_deny_templates($role_users, $tpl, $denied_message) {
		global $mm_current_page;
		$templates = makeArray($tpl);
		if (in_array($mm_current_page['template'], $templates)) {
			$docid = (int)$_GET[id];
			mm_widget_accessdenied($docid, $denied_message, $role_users);
		}
	}
}
$role = '!1';	// 管理者(ロールID:1)以外のユーザに対して
$tpl = '1,2';	// テンプレートIDが1,2の場合、ユーザは編集不可にする。
$msg = 'このフォルダ自体は編集できません。子リソースを作成・編集して下さい。';
mm_deny_templates($role, $tpl, $msg);

2)ドキュメントルート以外にMODXをインストールした場合

※この問題は、MODX 1.0.5J-r6で修正されました。
ドキュメントルート(例:http;//hogehoge.com/)にMODXをインストールした場合、 「mm_widget_accessdenied」は、警告アイコン(三角形に「!」マーク)とメッセージを表示しますが、
ドキュメントルート以外の場所(例:http;//hogehoge.com/fugafuga/)にMODXをインストールした場合、そのままでは警告アイコンが出ません。(メッセージは出ます)
それは「assets/plugins/managermanager/widgets/accessdenied/accessdenied.css」内に警告アイコンのパスが「/assets/plugins/managermanager/widgets/accessdenied/alert.png」と設定されているからです。
ですので、この部分をサイトにあわせて(例:「/fugafuga/assets/plugins/managermanager/widgets/accessdenied/alert.png」に)変更すれば、警告アイコンも出るようになります。

MODXデフォルトテンプレートを切り替える「SwitchDefaultTemplate」

今までたくさんのMODXサイトを立ち上げてきた中で、色々なMODXのカスタマイズをやってきました。中には一般的に使えそうなものもたくさんあります。
そのうちの一つが、なんとか整理できたので、公開しました。

リソース新規作成時のデフォルトテンプレートを、任意のルールに基づいて切り替えるMODXプラグイン「SwitchDefaultTemplate」です。

たとえば、イベント用のフォルダ内にリソースを新規作成する時は、イベント記事用のテンプレートが自動的にデフォルトになるようにする等、デフォルトテンプレートを、設定したルールに従って自動的に切り替えることができます。

以下のようなルールが設定できます。

  • 親フォルダの使用テンプレートで切り替える
  • 親フォルダのエイリアスで切り替える
  • 親フォルダのリソースIDで切り替える
  • ユーザのロールで切り替える

詳しくは、
http://www.hikidas.com/hikidas/modx_resource/modx_elements/SwitchDefaultTemplate.ja.html
をご覧ください。

MODxの一覧表示で、一定件数毎等、データ毎に細く制御する

※とりあえずメモだけ(未検証)

MODxのDittoで一覧表示する際、
○件毎に改行(<div>〜</div>や<tr>〜</tr>とかで囲む)したい等、
表示上何件目のデータかで、細かく表示を制御したい場合、
プレイスフォルダ
[+ditto_iteration+]
に、表示上何件目か(1件目が0、2件目が1、…)が入るので、
これを使って、PHx等で制御すれば可能。
(チャンク等、tpl等で指定したDitto用の出力テンプレート内で使用します)


で、既に使っている方がいらっしゃいました。
http://modxcms-jp.com/bb/viewtopic.php?f=7&t=190#p1234
http://modxcms-jp.com/bb/viewtopic.php?p=1430#p1430

      • -

Dittoのプレイスフォルダ(リソース変数以外)には、
以下のようなものがあるようです。(未検証)

[+author+] 作成者のフルネーム(未登録ならユーザー名)
[+title+] リソース名([+pagetitle+]と同じ)
[+ditto_iteration+] 表示上の順番(1件目が0、2件目が1、…)
[+url+] URL(フレンドリーURL対応)
[+date+] 日時(dateSource、dateFormatで指定した内容)
      • -

ちなみに、
一覧表示での切替ですが、
奇数件目、偶数件目の切り替えだけなら、
Dittoパラメータ「tpl」と「tplAlt」を使う方法があります。
さらに、最初や最後は「tplFirst」「tplLast」が使えます。

テンプレート変数の情報(getTemplateVar、getTemplateVars)

テンプレート変数の入力値を含め、テンプレート変数の情報を取得するMODxAPI(getTemplateVar、getTemplateVars等)を使った場合、連想配列で情報が返されますが、その内容は、
・入力値「value
・テンプレート変数の定義情報(下記参照)
です。

スニペットで「getTemplateVar」を使う時は、以下のような感じです。

$tmplvar_info = $modx->getTemplateVar('hogehoge');    // テンプレート変数「hogehoge」の情報を取得
if ($tmplvar_info !== FALSE) {    // 問題なく情報が取得できた場合
    $tmplvar_value = $tmplvar_info['value'];    // テンプレート変数の入力値を取得
}


参考)CSVを使ってテンプレート変数を一括作成
http://d.hatena.ne.jp/hikidas_ikeda/20090306/1236344122


API

getTemplateVar($idname= "", $fields= "*", $docid= "", $published= 1)
getTemplateVars($idnames= array (), $fields= "*", $docid= "", $published= 1, $sort= "rank", $dir= "ASC")

空のテンプレート

MODxを使っていると、「空のテンプレート」を作ることがよくあります。
この「空(カラ)」というのは、中身=テンプレートコード(HTML)の無いことを言っているのですが、実際に1枚のページとして表示する必要はないけれど、テンプレート変数を使ったり、入力画面をカスタマイズしたい時などに、この空のテンプレートを使います。
簡単に言うと、一覧表示だけで、個別のページが必要ないようなものですね。
たとえば、

  • トップページにバナーを並べて表示
  • リンク集
  • コメント集
  • よくある質問と答え(FAQ)
  • スタッフ紹介
  • 支店連絡先一覧

等々で、個別詳細ページを作らない場合が、これに当たるかと思います。(というか、個別詳細ページを作るんだったら、テンプレートの中身(コード)を入れれば良いだけのことですが)

MODxでは、テンプレート変数を入力画面に出す/出さないについても、ManagerManagerによって、入力画面をカスタマイズする場合も、それぞれ、テンプレートが設定対象になります。

一般的には、テンプレートと言えば、ページデザインのテンプレートというイメージかと思いますが、MODxの場合には「入力画面の単位」にもなっているわけですね。

追記)
ちなみに、同じ一覧でも、1つの内容入力欄に、ずらずらと繰り返し入力するやり方の場合は、上記とは異なります。
上記では、例えば、バナーであれば、バナー1件分を1つのリソース(この場合ならウェブリンクにするでしょう)として作成し、複数作成したものを一覧に並べて表示するというやり方について説明しています。