MODxでCMSの恩恵を賜りつつ、validを保ち、かつWEB標準化を目指そう
Welcome !! Now 2010.03.14 01:26 (JST)
Jotは、ユーザーからのフィードバックを受けるとことができるよう、コメント入力のためのフィールドを挿入します。また投稿されたコメントを一覧表示する機能もあります。
投稿は、WEBユーザに限ることも、ゲストユーザの投稿を受け付けることもでき、コメントの公開を保留する機能もあります。
細かな入力チェックやcaptchaによる入力チェックも可能です
※wikiの内容を参考にして書いていますが、wikiの記述は、v1.0用のようです。パラメータなどが増えているかも知れません※
hirahiraさん作の、便利なスニペットコールジェネレータはこちらです。パラメータの値を入力するだけで、スニペットコールを自動生成してくれます。
ドキュメントのキャッシュを無効にするか以下の書式を利用する
[!Jot? &pagination=`5`!]
[[Jot]]
表示するブロックを指定する。デフォルト「入力フォーム&コメント一覧」。他に以下が指定可能
Jotでリンクさせたいドキュメントid。デフォルト「カレントドキュメント」。
スニペットコールサンプル:
[[Jot?]] ←docid「81」
[[Jot? docid=`81`]] ←docid「80」
docid「81」と「80」でJotの出力を共有できる
同じドキュメント内で二つ以上のJotを使うときに決めるユニークID。「A-Za-z0-9」が指定可能
同じIDはデータを共有する
サプスクリプション機能を利用するか否か。デフォルト「しない(0)」
※サプスクリプション機能とは、コメントごとにエンドユーザに対し新規投稿があった場合に通知する機能です。エンドユーザが「購読する」「購読しない」を選択できます。
コメントの公開に管理者・モデレータの承認を必要とするか否か。デフォルト「しない(0)」。
コメントがあった場合、「canmoderate」で指定したModeratorに通知するか否か。
サブスクリプション通知の件名をテキストで指定。
モデレータへの通知の際の件名を指定。
CAPTCHAを利用した入力チェックをするか否か。
禁止語をコンマで区切って指定。理想的な指定の方法は、以下のようにチャンクを利用する
[[jot? &badwords=`{{MyBadwordsChunk}}`]]
「MyBadwordsChunk」に禁止語をコンマで区切って書く
また「bw」で禁止語を発見したときの動作を指定できる
※マネージャユーザでログイン中は、禁止語も投稿できる
「badwords」で指定した禁止語を発見したときの動作を指定する。
「0」…なにもしない
「1」…受け付けるが公開しない
「2」…拒否する
フォームで使用したいフィールドネームをカンマで区切って指定します。デフォルト「name」「email」。これらは、_jot_fields に保存されます。
※title、content は、_jot_content に保存されます※
オーサidを指定します。いまいちよくわかりません。デフォルト「カレントドキュメントのオーサid」。
コメントのタイトルを指定。デフォルトは、フィールドの「subject」が空の場合は、ドキュメントの「longtitle」が利用される。「longtitle」も空の場合は、単に「Re:」と挿入される。
※&title=`タイトルを指定`しても「0」と表示されるだけで上手く機能せず※
jot で利用する CSS を<head>~</head>に挿入するかどうかを指定します。デフォルト「します(1)」。
CSS ファイルのパスを MODx のルートからの相対パスで指定します。デフォルト「assets/snippets/jot/templates/jot.css」
[!Jot? &cssFile=`assets/templates/common/jot.css`!]コメント一覧の並べ替えの基準になるフィールドを指定します。デフォルト「作成日降順(createdon:d)」
コメントの通し番号を最初のコメントから「1、2…」とするか、最後のコメントから「1、2…」とするかを指定します。デフォルト「最初のコメントから番号を振ります(1)」
入力チェックを行いたい、フィールド名(フォームで利用しているフィールド名)とチェックルールを指定します。フィールド名及び、チェックルールは、カンマで区切って複数指定可能です。デフォルトは、「content」が必須になっています。
入力チェックを行うフィールドはすべて必須項目となります。
以下の入力チェックルールーがあります。
名無しさんの表示の仕方を指定します。デフォルト「anonymous」
同一ユーザからのポストの制限時間を秒で指定します。デフォルト「15秒」。「0」を指定すると同一ユーザからのポストはできなくなります。
ページ送りナビゲーションを挿入するかどうかを指定します。デフォルト「しない(0)」。1ページに何件コメントを表示するかを数字で指定します。「0」以外の値を指定すると、ナビゲーションが自動的に挿入されます。
プレイスホルダを利用して、各フォームブロックを出力するかどうかを指定します。デフォルト「しない(0)」。
後述の「output=`0`」と組み合わせて、ブロックを個別に出力させたり、出力順序を変更したりもできます。
「placeholders=`1`」を指定したページ内に、以下のように記述します
[+jot.html.form+][+jot.html.form.tagid+]
スニペットによるコメントフォーム(その他)を出力するかどうかを指定します。デフォルト「する(1)」。
jot の隠し変数の出力をするかどうかを指定します。デフォルト「しない(0)」。
信頼する Web ユーザグループをカンマで区切って指定します。「moderated=`1`」のとき、ここで指定したグループに所属するユーザによるコメントは、承認なしで公開されます。
また、このグループは禁止語も投稿できます。
ポストできる Web グループをカンマで区切って指定します(ポストできるユーザを限定します)。これを指定しなければ、誰でもポストできる状態です。ここで指定したグループ以外がページにアクセスしてもコメントフォームは表示されません(コメント一覧・ナビゲーションは表示されます)。
Web ユーザ、Web グループの作り方は「Web ユーザを作成する」を参照してください。
コメント一覧を閲覧できる Web グループをカンマで区切って指定指定します。指定しない場合は、すべての人が閲覧できます。
※「canpost」で指定していても、「canview」で指定されていなければ、コメントフォームのみが表示され(ポストもできる)、コメント一覧は閲覧できない(つまり「canpost」は「canview」を兼ねるわけではない)。
自分でポストしたコメントを編集できる Web ユーザをカンマで区切って指定します。これを指定しない場合、どんな Web ユーザもコメントを編集することはできません。
すべてのコメントに対して管理権限を持つ Web ユーザをカンマで区切って指定します。マネージャユーザと同等の権限です。編集、公開・非公開、削除ができます(「canedit」を指定していなくても、これを指定すれば、編集できます)。
また、モデレーションブロックも表示されます。
メッセージなどを日本語にしたい場合も、テンプレートを変更します。デフォルトは「templates」以下にある、html ファイルです。jot の動作に必要なプレイスホルダが記述されていますので、これらを元にしてカスタマイズすると良いでしょう。
コメントフォーム用のテンプレートをチャンク名で指定します。デフォルト「chunk.form.inc.html」。
コメントリスト用のテンプレートをチャンク名で指定します。デフォルト「chunk.comment.inc.html」。
モデレーションセクション用のテンプレートをチャンク名で指定します。デフォルト「chunk.moderate.inc.html」。
ナビゲーションセクション用のテンプレートをチャンク名で指定します。デフォルト「chunk.navigation.inc.html」。このセクションは、デフォルトでコメントリストの前と後に挿入されます。
サプスクリプションセクション用のテンプレートをチャンク名で指定します。デフォルト「chunk.subscribe.inc.html」。
サプスクリプション通知メールのテンプレートをチャンク名で指定します。デフォルト「chunk.notify.inc.txt」(これはユーザに送信されるメールです)。
モデレータへの通知メールのテンプレートをチャンク名で指定します。デフォルト「chunk.notify.moderator.inc.txt」。
ドキュメントでJotをコールしている場合、ドキュメントをを削除してもコメントはデータベースに残るので、phpMyAdmin などを使ってメンテナンスをする必要があるでしょう。jot のコンテンツは、「_jot_content」に保存されています。
wiki では、Jotコールは、チャンクに登録し、それをドキュメントではなく、テンプレートで呼び出すよう推奨しています。
また、jot の管理機能を使って、コメントを削除しても、カスタムフィールド(「_jot_fields」に保存されている)は、削除されないので、これも phpMyAdmin などでメンテナンスする必要があるでしょう。ていうか、これって問題なんじゃ…?
「jot.class.inc.php」で生成している乱数をタブインデックスに利用しているのが原因らしいので、以下のいずれかで、対処可能
$this->config["seed"] = rand();
↓
$this->config["seed"] = rand(1000,10000);
関連トピ:PHxをインストールしている場合のJotの挙動について
テンプレートごとにPHxプラグインの有効/無効を切り替えることで対処可能。参照ページ:PHx 2.1.2 - ドキュメント(またテンプレート)ごとにPHxプラグインの有効/無効を切り替える
jot.class.inc.phpの以下の部分を修正します(0963+jot1.1.4ではこの方法ではできません)。
// Notifications
function doNotifySubscribers($commentid=0) {
global $modx;
if ($this->config["subscription"]["enabled"]) {
mb_language('ja'); // 挿入
mb_internal_encoding($modx->config['modx_charset']); // 挿入
... 中略...
$message = $tpl->Render();
mb_send_mail($user["email"], $this->config["subject"]["subscribe"], $message, "From: ".$modx->config['emailsender']."\r\n"."X-Mailer: Content Manager - PHP/".phpversion()); // mb_send_mail に変更
}
}
}
}
// Moderator Notification
function doNotifyModerators($commentid=0) {
global $modx;
if ($this->config["moderation"]["notify"]) {
mb_language('ja'); // 挿入
mb_internal_encoding($modx->config['modx_charset']); // 挿入
... 中略...
$message = $tpl->Render();
mb_send_mail($user["email"], $this->config["subject"]["moderate"], $message, "From: ".$modx->config['emailsender']."\r\n"."X-Mailer: Content Manager - PHP/".phpversion()); // mb_send_mail に変更
}
}
}
現行バージョン(1.1.2)の仕様では、サイト内のすべてのコメントをまとめて拾ってくることができません。そのため、「最近のコメントを5件表示する」などという利用方法ができません。このカスタマイズは、それを可能にします。
参照トピ:Displaying comments from several documents
$this->config["docid"] = !is_null($this->Get("docid")) ? intval($this->Get("docid")):$modx->documentIdentifier;
↓
if (!is_null($this->Get("docid")) && ($this->Get("docid") == '*'))
$this->config["docid"] = '*';
else
$this->config["docid"] = !is_null($this->Get("docid")) ? intval($this->Get("docid")):$modx->documentIdentifier;
$sql = 'SELECT count(id) FROM '.$this->tbl["content"].' WHERE uparent = '.$docid.' AND tagid = "' . $tagid .'"'.$where;
↓
if ($docid == '*')
$sql = 'SELECT count(id) FROM '.$this->tbl["content"].' WHERE tagid = "' . $tagid .'"'.$where;
else
$sql = 'SELECT count(id) FROM '.$this->tbl["content"].' WHERE uparent = '.$docid.' AND tagid = "' . $tagid .'"'.$where;
$sql = "select a.* from " . $tbl . " as a " . $tblcustom . " where uparent = '" . $docid . "' and tagid = '" . $tagid ."' and mode = '0' " . $where . $orderby . $limit;
↓
if ($docid == '*')
$sql = "select a.* from " . $tbl . " as a " . $tblcustom . " where tagid = '" . $tagid ."' and mode = '0' " . $where . $orderby . $limit;
else
$sql = "select a.* from " . $tbl . " as a " . $tblcustom . " where uparent = '$docid' and tagid = '" . $tagid ."' and mode = '0' " . $where . $orderby . $limit;
[!Jot? &placeholders=`1` &output=`0` &tplComments=`recent_comment` &sortby=`createdon:d` &pagination=`0` &css=`0` &docid=`*`!]
<div class="sidebox kommentar">
<h3>コメント一覧</h3>
<ul class="latest">
[+jot.html.comments+]
</ul>
</div>
<li><a href="[~[+comment.uparent+]~]#jc[+comment.id+]"><strong>[+comment.title:limit:esc+]</strong>: [+comment.content:wordwrap:esc:nl2br:limit=`100`+] ...von <strong>[+comment.createdby:isnt=`0`:then=``+][+comment.createdby:userinfo=`username`:ifempty=`[+comment.custom.name:ifempty=`[+jot.guestname+]`:esc+]`+][+comment.createdby:isnt=`0`:then=``+]</strong></a></li>
Jot コールで「tagid」を指定すると、拾いたいコメントを限定することができます。その際、プレイスホルダ側にも、Jot コールで指定した「tagid」を指定する必要があります。
[!Jot? &tagid=`blogcomment`&placeholders=`1` &output=`0` &tplComments=`recent_comment` &sortby=`createdon:d` &pagination=`0` &css=`0` &docid=`*`!]
<div class="sidebox kommentar">&
<h3>コメント一覧</h3>
<ul class="latest">
[+jot.html.comments.blogcomment+]
</ul>
</div>