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 にパスを通せばいい。