MODx の eForm から DB に保存する

MODx の eForm
を使うと、メールフォームが簡単につくれる。しかし、メールではなくてDB保存して、あとでまとめてデータを取得したいということもある。



<p>そういう用途にぴったりな eForm2db というのを見かけた。MODx が備える DBAPI と、eForm
のイベントハンドリングを使った、シンプルな snippet だ。こんなに簡単にできるのか、と喜んだのもつかの間、この snippet
を呼ぶと画面は真っ白、Apache のログにはエラー、DB には何も記録されない、という状態になった。</p>

<p>Apache のエラーログはこのような感じ。</p>

<pre class="prettyprint">
[Fri May 08 04:26:59 2009] [error] [client 10.1.1.231] PHP Fatal error: Call to
undefined function eForm2db() in /home/xxx/public_html/modx-0.9.6.3/assets
/snippets/eform/eform.inc.php on line 377, referer: http://test1.xxx.xxx/~xxx/modx/
</pre>

<p>試行錯誤の結果、snippet の呼び出しを [[snippet]] から [!snippet!]
に変えることで解決した。前者はキャッシュされた結果を用いるが、後者は snippet
をキャッシュせずに毎回実行する。たとえばログインsnippet
があって、未ログインの場合はログインフォームを、ログイン後はユーザー名を表示する場合には、キャッシュしてはいけないので後者を使う。</p>

ページに貼り付けるフォームはこんな感じ。フォーム chunk の直前に eForm2db の snippet
を置く。eFormOnBeforeMailSent で、メール送信前にイベント処理をする。

<pre class="prettyprint">
[!eForm2db!]

[!eForm? &formid=form1 &tpl=form1_tpl
&report=form1_report &thankyou=form1_thankyou
&to=xxx@xxx.xxx &from=xxx@xxx.xxx
&fromname=form1 &subject=form1
&eFormOnBeforeMailSent=eForm2db !]
</pre>

eForm2db snippet はこんな感じ。複数選択のチェックボックスは join で一つの文字列にまとめてみた。RDB
のテーブルは、MODx と同じ DB にあらかじめ作っておく。

<pre class="prettyprint">
<?php
function eForm2db( &$fields ) {
global $modx;

$dbTable = array();

$dbTable[email] = $fields[email];
$dbTable[checkbox1] = join(‘, ‘, $fields[checkbox1]);
$dbTable[hitokoto] = $fields[hitokoto];
$dbTable[postdate] = date( ‘YmdHis’, strtotime( $fields[postdate] ) );

$dbQuery = $modx->db->insert( $dbTable, ‘form1’ );

return true;
}
return ‘’;
?>
</pre>

CentOS5 で set_loginuid failed opening loginuid

Logwatch で毎日これが大量に報告される

crond[10075]: pam_loginuid(crond:session): set_loginuid failed opening loginuid
crond[10087]: pam_loginuid(crond:session): set_loginuid failed opening loginuid
crond[10101]: pam_loginuid(crond:session): set_loginuid failed opening loginuid



<p>ので修正。</p><pre class="prettyprint">$ sudo vi /etc/pam.d/crond

$ cat /etc/pam.d/crond
#
# The PAM configuration file for the cron daemon
#
#
auth sufficient pam_rootok.so
auth required pam_env.so
auth include system-auth
account required pam_access.so
account include system-auth
#session required pam_loginuid.so # ここをコメントアウトした
session include system-auth
</pre>

<p>CentOS5 標準では、カーネルで audit が有効になっていないので、sudo したときや crond で set_loginuid failed が出るらしい。</p>

<ul><li>0002191: pam_loginuid fails with message: set_loginuid failed opening loginuid</li>
</ul>

MODx でメールフォームを作る

MODx(v0.9.6) 標準添付の eForm を使う。



<p>作る Chunk(HTMLの断片) は 3つ。

<ul> <li>フォームテンプレート</li>
<li>フォームサブミット後のありがとうメッセージ</li>
<li>メールテンプレート</li>
</ul></p>

<h3>フォームテンプレート</h3><p>名前は ‘form1_tpl’ だとする。</p><pre class="prettyprint"><form id='form1' method='post' action='[~[*id*]~]'>
<fieldset>
<legend>アンケート</legend>
<dl>
<dt></dt>
<dd><input name=’email’ id=’email’ type=’text’
size=’30’/></dd>

<dt></dt>
<dd>
<input type=’checkbox’ name=’choice[]’ value=’choice1’
id=’choice1’><label
for=’choice1’>選択肢1</label></input>

<input type=’checkbox’ name=’choice[]’ value=’choice2’
id=’choice2’><label
for=’choice1’>選択肢2</label></input>

<input type=’checkbox’ name=’choice[]’ value=’choice3’
id=’choice3’><label
for=’choice1’>選択肢3</label></input>

</dd>

<dt></dt>
<dd><input name=’hitokoto’ id=’hitokoto’ type=’text’
size=’30’/></dd>
</dl>

</fieldset>
</form>
</pre>

<h3>ありがとうメッセージ</h3><p>名前は ‘form1_thankyou’ だとする。</p><pre class="prettyprint"><p>ありがとー</p>
</pre>

<h3>メールテンプレート</h3><p>名前は ‘form1_report’ だとする。</p><pre class="prettyprint"><p>アンケートに記入してもらいましたよ。</p>

<ul>
<li>記入日時: [+postdate+]</li>
<li>メールアドレス:[+email+]</li>
<li>選択肢:[+datetime+]</li>
<li>ひとこと:[+hitokoto+]</li>
</ul>
</pre>

<p>チェックボックスの複数選択のときは、フォームでの名前を variable[] にして、メールテンプレートでは variable にするようだ。</p>

<h3>表示する画面へ貼り付ける</h3><p>これを好きなところに貼り付ける</p><pre class="prettyprint">[!eForm? &formid=form1 &tpl=form1_tpl &report=form1_report
&thankyou=form1_thankyou &to=xxxxxxxx@xxxx.xxx
&from=yyyyyyyy@yyyyyyy.yyy &fromname=Enquete &subject=Enquete !]
</pre>

MTOS で Google 認証を使えるようにするために Crypt::SSLeay をインストール

△openssl-devel が必要
# yum install openssl-devel

△古いといわれたのでCPANもアップデート
# cpan Bundle::CPAN

△お目当ての SSLeay
# cpan Crypt::SSLeay

CentOS5 に TeX をインストール


$ wget http://tutimura.ath.cx/~nob/tex/ptetex/ptetex3/ptetex3-20090506.tar.gz (←超最新版であることにびっくり)
$ wget wget http://www.ring.gr.jp/pub/text/CTAN/systems/unix/teTeX/3.0/distrib/tetex-src-3.0.tar.gz
$ wget http://www.ring.gr.jp/pub/text/CTAN/systems/unix/teTeX/3.0/distrib/tetex-texmf-3.0po.tar.gz

$ tar zxvf ptetex3-20090506.tar.gz
$ cd ptetex3-20090506

$ cp my_option.sample my_option
$ vi my_option

△変更箇所
KANJI_CODE=UTF8

### X 環境がない場合
conf_option --without-x
conf_option --without-xdvik

### make test で xdvi を除外する
XDVI=echo
PXDVI=echo


$ make

△途中で起きたエラーへの対処
configure: error: no working lexical scanner (lex/flex) found
$ sudo yum install flex

configure: error: no working parser generator (yacc/bison) found
$ sudo yum install bison

terminal.o: In function `terminal_ring_bell':
/var/tmp/ptetex3/tetex-src-3.0/utils/texinfo/info/terminal.c:349: undefined reference to `tputs'
(同様のエラーが他に多数)
$ sudo yum install ncurses-devel

searching xdvi fonts...
./7font-search.sh: No font was found as Ryumin-Light.
$ sudo yum install fonts-japanese


$ sudo make install



あとは、/usr/local/teTeX/bin にパスを通せばいい。