2010/03/10

modx eform の内容を DB に入れる方法(ID 番号採番も)

またまた rails とは無関係ですが、modx の eform を使って、データベースに投稿内容を保存する方法をトライしてみました。一番やりたかったことは、テーブルのレコードIDを取得して、メールに表示させること。

一般的に使われそうな「お問合せフォーム」を例に、簡単なサンプルを作成してみました。

まず、MySQL からテーブルを作成

CREATE TABLE `modx_inquiries` (
  `id` int(10) unsigned NOT NULL auto_increment,
  `name` varchar(255) NOT NULL,
  `subject` varchar(255) NOT NULL,
  `email` varchar(100) NOT NULL,
  `message` text NOT NULL,
  `created_at` int(20),
  PRIMARY KEY  (`id`)
);

複数の異なるフォームがある場合、それぞれテーブルを追加する必要があります。逆に、一つのmodx インスタンスで、いくらでも応用できるということ。
フォームのチャンクを作成 db_inquiries

<p class="error">[+validationmessage+]</p>
<form method="post" action="[~[*id*]~]" id="EmailForm" name="EmailForm" >
 <fieldset>
  <input name="formid" type="hidden" value="ContactForm" />
  <table>
  <tr>
  <th width="30%">お名前<em>*</em></th>
  <td><input name="name" id="cfName" class="text short" type="text" eform="お名前::1:" /></td>
  </tr>
  <tr>
  <th>メールアドレス<em>*</em></th>
  <td><input name="email" id="cfEmail" class="text long" type="text" eform="メールアドレス:email:1" /></td>
  </tr>
  <tr>
  <th>表題<em>*</em></th>
  <td>
   <select name="subject" id="cfRegarding" eform="Form Subject::1">
    <option value="一般のお問合せ">一般のお問合せ</option>
    <option value="その他">その他</option>
   </select>
  </td>
  </tr>
  <tr>
  <th>内容<em>*</em></th>
  <td><textarea name="message" id="cfMessage" rows="4" cols="20" eform="内容:textarea:1"></textarea></td>
  </tr>
  <tr>
  <th></th>
  <td><em>*</em>は必須項目です。</td>
  </tr>
  <tr>
  <th></th>
  <td><input type="submit" name="contact" id="cfContact" class="button" value="メッセージを送る" /></td>
                </tr>
                <tr>
                <td colspan="2">ご登録される個人情報はお問い合わせへのご返答及びそれに付随する内容に関してのみ、利用させていただきます。詳細は<a href="[~133~]">プライバシーポリシー</a>をご覧ください。</td>
                </tr>
                </table>
 </fieldset>
</form>
snippet dbInquiries の作成 (function 名は何でもOK)
<?php
function dbInquiries(&$fields)
 {
  global $modx;
  // Init our array
  $dbTable = array();
  $dbTable['name'] = $modx->db->escape($fields['name']);
  $dbTable['subject'] = $modx->db->escape($fields['subject']);
  $dbTable['email'] = $modx->db->escape($fields['email']);
  $dbTable['message'] = $modx->db->escape($fields['message']);
  $dbTable['created_at'] = time();

         // Run the db insert query
  $dbQuery = $modx->db->insert($dbTable, 'modx_inquiries' );
                $fields['record_id'] = $dbQuery; // so that eform can access this field
                $fields['subject'] = $dbTable['subject']." (".$fields['record_id'].")";
  return true;
 }
?>

$fields['record_id'] = $dbQuery; は、eform が新しく生成されたレコードの ID を取得を可能にするための追加。
$fields['subject'] = $dbTable['subject']." (".$fields['record_id'].")"; はメールの表題に subject とレコード ID を追加する。

問い合わせフォームでの eform コール

[!dbInquiries!]
[!eForm? &subject=`上書きされます` &to=`[(emailsender)]` &formid=`ContactForm` &eFormOnBeforeMailSent=`dbInquiries` &tpl=`db_inquiries` &thankyou=`3` &report=`db_inquiries_report` &automessage=`db_inquiries_thanks` !]
こちらのスレッドのまとめ

0 件のコメント: