ラベル Modx スニペット の投稿を表示しています。 すべての投稿を表示
ラベル Modx スニペット の投稿を表示しています。 すべての投稿を表示

2012年10月12日金曜日

Modx ユーザー別管理画面の編集関係。


ご無沙汰しています。

ここのところ、少々立て込んでいて放置していましたが、時間を見てまた再開します。

今日はModxの覚書です。

ユーザー管理関連で、色々と実験をしていたので、その内容の覚書です。

※2012/10/15 追記
この設定方法は、Modx1.0.6.-r6以降のバージョンにて行なってください。
r6以前のバージョンだとエラーが発生して、編集したコンテンツを保存できません。

別な方法により設置は可能でしょうが、今回の方法ではr6以前のバージョンでは対応致しません。
下記の方法を試される場合は、
必ずr6にバージョンUPした状態で、行なってください。



ユーザー管理から、ロール設定、グループ設定等を行うと、設定されたユーザー権限のページしか表示できない機能がある事はご存じかと思います。

しかし、フォルダの階層構造上、どうしても【権限が無い】あるいは【グループ制限なし(Public)】のページを表示しなければならない場合があります。

それは、編集させたいページの上位フォルダーとされるページです。

ロール設定では、フォルダ(コンテナ)に対し設定された管理権限が無いと、そのフォルダ内の物は全て表示されなくなります。(編集可能なコンテンツはありませんと表示されます)

このようなときに、そのフォルダは【グループ制限なし(Public)】※1状態にして、誰もが閲覧・編集可能な状態にするしか手段がありません。

しかし、そのページはユーザーに編集させたくない場合にどうしたらよいか……

と言う事で、どうしても表示されてしまうが、「編集させたくないページ」を

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

上記の方法で回避する事を試してみます。

しかし、この記事はあくまで
ManagerManager
をある程度使用した事がある。と言うことが前提で実際の使い方(コードの設置方法等)が今一つ……

なので、このコードの設置のしかたを書いておきます。
(私もあまり使った事が無いので、完全に自己流です)


メインのコードはmm.inc.php

上記のメインになるコードは、

/plugins/managermanager/mm.inc.php

に書き込み。

mm.inc.phpを開き、最終行以下に、下記コードをペースト。

// テンプレート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);


これを書いてしまうと、ページを表示したときにエラーコードが表示されるので、注意が必要。


後は、実際の命令文を、

エレメント管理>チャンク>mm_rules

に記述する。
記述位置は、3行目以降で、

/* =============

とコメントアウトしている前。

書き込み例

mm_widget_showimagetvs(); // Imageタイプのテンプレート変数の画像をプレビューします
if($modx->config['track_visitors']==='0') mm_hideFields('log');

//// ここから下 /////

mm_deny_templates('3', '4', 'このフォルダ自体は編集できません。子リソースを作成・編集して下さい。');


//// ここより上 /////

/* ==========================================================

と言った感じ。


書き込む書式は、下記のようにすれはOK。

mm_deny_templates('3', '4', 'このフォルダ自体は編集できません。子リソースを作成・編集して下さい。');

解説
上記の書式は、管理者ID3番は、テンプレートID4番の場合、編集出来ないようにする。
編集出来ない画面には「このフォルダ自体は編集できません。子リソースを作成・編集して下さい。」と表示しなさい。

と言った内容。

少し解りにくいかと思うので、もう少し柔らかく。
要するに、

ID3番のユーザーは、テンプレート4番以外のぺーじは編集できます。

と言う事です。


この方法は、はっきり言って自己流です。

でも、問題無く動いているで、とりあえずOKと言う事で。
もう少しスマートな方法があれば、コメントをください。



※1
必ずしも【グループ制限なし(Public)】である必要はありません。
この階層以下を編集するユーザーが関連した、他の管理ロールでも問題ありません。





2012年8月7日火曜日

Modx Dittoのfilterで50音別にリスト分け【表示スニペット】

Modx Dittoのfilterで50音別にリスト分け

店舗名称や商品名称など、意外と50音順に並べ替えてみたい事が、時々あります。

今回は、Dittoのfilter機能を使って、50音順にリスト化するスニペットを作ります。

基本スニペット

[!Ditto? &parents=`指定id` &tpl=`指定テンプレート` &showInMenuOnly=`1`  &filter=`ふりがな,あ,6|ふりがな,か,5` &orderBy=`ふりがな ASC`!]

解説
parents
親ドキュメントの指定

tpl
表示テンプレートの指定

showInMenuOnly
メニュー表示がされているモノのみ選択。

filter
テンプレート変数:ふりがなの、【あ】という言葉以上を選び、or ふりがなの【か】までを取得しなさい。

orderBy
取得たデータのテンプレート変数:ふりがなを、【あ】から順番に表示しなさい。

filterパラメーターの書き方の詳細は、下記参照でお願いします。
http://www.modx.liolion.net/resource/ditto2.html

説明
指定した親ID以下のリソースページの【ふりがな】というテンプレート変数に入力された、テキストを抜き出し、そのテキストを、あ~おの順番に並べ変えて、表示しなさい。
と言った内容です。

このスニペットのキモは、やはりfilterパラメーターの扱いです。

今回の設定で言えば、【あ】よりも大きい。つまり50音で言う【あ】以降の文字全てを選びなさい。という条件付けがされています。しかし、このままでは50音全ての文字が取得されてしまうので、どこかで取得を止めなければなりません。そこでもう一つのパラメーターを設定します。

filterパラメーターは、複数条件の指定が出来ます。各条件の関連はORです。
通常で考えれば「AまたはB」という考え方になりますが、入力設定のmodeで抽出条件の設定を変えることで、取得を止めます。

今回は、【あ行】の取得が目的ですので、【お】までの文字列を取得できれば良いですから、下記のようなパラメーターを設定します。

【ふりがな,か,5】

これは、【ふりがな】から【か】以下※の文字を取得しなさい。となります。

つまり、「あ~お」までの値を抜き出した事になります。

これで、あ行の取得設定が出来たことになります。
同様のやり方で、か行以降のスニペットを作れば、50音全ての取得設定が可能です。

さて、カンの良い人はお気づきかと思いますが、この条件だと50音にしか対応していません。つまりアルファベットや数字には対応していない状態です。

アルファベットや数字の場合も同様のスニペット設定で取得が可能ですので、アルファベット用や数字用といったスニペットを用意すれば、それぞれのリスト制作が可能です。

今回あらためて、Dittoの強力なデータ抽出を実感しましたが、奥が深いというよりも、色々と実験してみて、初めて判ることがまだまだあるなぁと感心しました。と同時に、MODxは本当に「決まった型のない、カスタマイズ思考の強いCMS」だとあらためて思いました。



本来はあ行であれば、あ~おなので、取得終了は【お】で良いのでは?と思われがちですが、
【お】で終了設定をすると、【お】が含まれない状態になるので、一つ先の【か】までを取得条件としています。





2011年11月22日火曜日

Modx Jot改造 入力フォームを入れ替え 覚書 【表示スニペット】

Jotはお手軽で比較的高機能?なブログツールですが、以外と関連情報が無いのが、玉に傷。

と言うことで、先日かなりイジリまわして、まぁ忘れないうちに覚書にでもしておくか。てな内容です。

タイトルからだとわかりづらいかも知れませんが、要するに、デフォルトだと、入力フォームがあって、その下にコメント一覧があるレイアウトになります。

これを、まずコメント一覧があって、その下に入力フォームが来るようにブロックの配置を変えるだけの事です。

では、変更箇所です。

表示位置変更 **********************************************

Jot v1.1.4

入力欄と、コメント表示欄を上下入れ替え

変更ファイル:jot.class.inc.php
場所: assets/snippets/jot/


355行 // Display default
の、箇所を修正。

デフォルト

$output = $this->getOutputForm();
$output .= $this->getOutputComments();

を、

$output = $this->getOutputComments();
$output .= $this->getOutputForm();

に変更。

この時、$変数後の.を下の項目のみに使用すること。
これを間違える(上の欄に付ける)と表示しなくなるので、注意。
(単純に上下を入れ替えるだけでは、ダメと言う事ですね)


たったこれだけです。
簡単でしょう。


覚えていて損はない変更箇所です。

おそらくヴァージョンが違っても、jot.class.inc.phpファイルに、記述があるはずですので、古いヴァージョンでも、出来ると思います。
(古いヴァージョン未確認のため、若干無責任かな?)

2011年11月14日月曜日

Modx ユーザーエージェントによる表示切り替え 【表示スニペット】

ブラウザーのユーザーエージェントを使って、表示(内容)を切り替える極簡単なスニペット。

ページ全体の表示を切り替えるのであれば、MobileConverter※1を使用すれば、指定したブラウザー毎に表示変更が可能になりますが、そこまで必要ないと言ったような場合に意外と便利。

ページの極一部の表示がそのブラウザーに対応していないなどの場合、新たにテンプレートを作るよりは効率的?ではないかな。



●iPadなどでFlashを採用している箇所を他のパーツに置き換える。
●IE8以前のブラウザーは、別のCSSを読み込ませる。

など。

基本的に、スニペットなので、テンプレート内のどこに設置しても動作しますし、書き換えの内容もスニペット・チャンクの別を問わないので、使用範囲も幅広いはずです。



サンプル
**************************************************************************

<?php
$agent = $_SERVER['HTTP_USER_AGENT'];
if(ereg("^DoCoMo", $agent)){
■■■;// DoCoMo対応
}else if(ereg("^J-PHONE|^Vodafone|^SoftBank", $agent)){
■■■;// ソフトバンク部類
}else if(ereg("^UP.Browser|^KDDI", $agent)){
■■■;// AU?
}else if(ereg("iPhone", $agent)){
■■■;// iPhone
}else if(ereg("WILLCOM", $agent)){
■■■;// WILLCOM
}else if(ereg("^PDXGW", $agent)){
■■■;// PDXGW
}else if(ereg("DDIPOCKET", $agent)){
■■■;// DDIPOCKET
}else{
■■■;// 上記以外 PC等?
}
?>


**************************************************************************

■■■部に、表示させたい内容を書き出す。
書き出す方法は、echo または、return 文で。

また、ターゲットとするブラウザーが決まっている場合は、こんなにユーザーエージェントを列挙する必要はないので、ターゲットとするブラウザーのみを書けばよいです。


ユーザーエージェントの種類に関しては、下記サイトを参照。
PCブラウザ
http://www.openspc2.org/userAgent/

スマートフォン関連
http://www.kagua.biz/android/ualist.html


※1
MobileConverterはユーザーエージェントで指定したブラウザーに対して、使用できるテンプレートは1種類しか利用できなくなるので、MobileConverterのタイトル通り、モバイル用にした方が無難でしょうかね…

2011年11月2日水曜日

Modx 入力されたら表示する。【表示スニペット】


テンプレート上にテンプレート変数を挿入して、使用する事はModxユーザーであれば、ごく当たり前に行なっていますよね。

しかし、必ずしもそのテンプレート変数を使うとは限らない場合もありますよね。

そうした場合、ソースにはテンプレート変数を表示させる為に使ったDIVタグや、他のタグだけが表示されることになります。



例えばソースはこんな感じに製作した場合、

<div class="txt_box">
[*テンプレート変数*]
</div>

実際の出力は(ソース)

<div class="txt_box">

</div>


という具合になりますよね。
まぁ、別にこれでも悪くは無いのですが、どうも中身が空のDIVタグが見えているのは、いかがなものかと言う事で、テンプレート変数に入力(値)がある時だけ表示するスニペットをつくりました。


【表示スニペット】
<?php
$hyouji = $modx->getTemplateVar('テンプレート変数名'); //表示したいテンプレート変数名を設定
if ( $hyouji ['value'] ) {
echo '{{表示チャンク}}'; // $hyoujiに値があるとき
}
  else {
echo '' ; //$hyoujiに値が無い時
  } ;
?>


【表示チャンク】
<div class="txt_box">
[*テンプレート変数*]
</div>


としておけば、テンプレート内に表示スニペットを設置すれば、指定したテンプレート変数に入力があった時のみチャンクが表示されるので、ソースは見た目もきれいになります。

この【表示スニペット】は他にも色々と使い道があるので、工夫次第で使い道が色々とありそうです。

2011年11月1日火曜日

Modx 指定した時間に、変更する。


使用テンプレート内の、一部を変更するスニペット


ページの一部だけに、時間で変更できる表示を入れたかった。
キャンペーンとかで、ページそのものを表示させるには、公開開始日時の設定で、対応出来ますが、表示の一部のみ(バナーや、時間指定のログインパーツなど)を変更したい時に使えます。



<?php
$output = & $modx->documentOutput;
$time_stamp = mktime(17,3,0,11,1,2011); //変更時間
$now_time = time();
if ($now_time <= $time_stamp) {
return '変更前の指定' ;  //変更時間前
} elseif($now_time >= $time_stamp) {
return '変更後の指定' ;  //変更時間後
  } ;
?>

$time_stamp = mktime(時,分,秒,月,日,年);


変更前の箇所に、現在使用しているデータをチャンクやテンプレート変数を使って指定します。
変更後に表示したい内容のこれまたチャンクやテンプレート変数を設定して、このスニペットを使用しているテンプレート内の変更箇所に入れれば出来上がり。


テンプレート内に記述する時は、スニペットの表記では

[[スニペット名]]

と記述しますが、この記述方法では、キャッシュがクリアされない為に、指定の時間になっても、表示が切り替わりません。

そこで、下記のように記述してください。

[!スニペット名!]


これで、キャッシュがクリアされるので、指定時間になれば、表示が切り替わります。


可能なかぎりシンプルにしました。
本当は指定時間に、使用テンプレートが変わるのが理想ですが、さすがにそこまでの物は作れないので…