初めてのプラグイン フォームメール - CakePHP1.2RC2 その2送信編
前回 その1モデル編からの続編です
さて、次はコントローラですが
その前に、メール送信用のコンポーネントの準備をしておきましょう。
コンポーネント
今回は、送信用にこちらを使用させていただきました。
PHP高機能日本語メール送信ライブラリ・文字化けフリー - Qdmail - PHP::Mail Library , Quick and Detailed for Multibyte
Qdsmtpとは - Qdsmtp-Simple SMTP Mailer for PHP
それぞれを以下に配置します。
app/plugin/form_mail/controllers/components/qdmail.php
app/plugin/form_mail/controllers/components/qdsmtp.php
個人的な趣味で、smtpの設定はconfigにおいておきたいので
app/config/form_mail/smtp.ini.php
;<?php die() ?> [smtp] host = "smtp_servar_name" port = 587 from = "from_email" user = "user" pass = "pass" protocol = "SMTP_AUTH"
これを読み込む俺俺コンポーネントを作る
smtp使用しないときは、全部コメントアウトしとけばいいようにしとく
文字コードは iso-2022-jp にしときたいのでしとく
(ここでも、プラグインのコンポーネント名に注意!)
app/plugin/form_mail/controllers/components/my_qdmail.php
<?php App::import('Component', 'FormMail.Qdmail'); App::import('Component', 'FormMail.Qdsmtp'); class MyQdmailComponent extends QdmailComponent { function startup(&$controller) { $result = parent::startup($controller); $params = parse_ini_file(CONFIGS . 'form_mail' . DS . 'smtp.ini.php'); if ($params) { $this->smtp(true); $this->smtpServer($params); } return $result; } function template($template = null, $layout = null, $org_charset = null, $target_charset = 'iso-2022-jp', $enc = null, $wordwrap_length = null) { return parent::cakeText(null, $template, $layout, $org_charset, $target_charset, $enc, $wordwrap_length); } } ?>
コントローラ
設定用のコントローラは後回しして、先にフォーム表示用のコントローラから
なんでアクションがeditなのかというと、
viewで使用する$form->createをいろいろいじらなくていいから
app/plugin/form_mail/controllers/form_mail_views_controller.php
<?php class FormMailViewsController extends FormMailAppController { public $name = 'FormMailViews'; public $uses = array('FormMail.FormMailView', 'FormMail.FormMailForm'); public $components = array('MyQdmail'); function edit($id = null) { $formMailForm = $this->FormMailForm->read(null, $id); $elements = array(); foreach ($formMailForm['FormMailElement'] as $key => $element) { $name = $element['type'] . '_' . $element['id']; // elements $elements[$key]['name'] = $name; $elements[$key]['options'] = $this->_setFormOptions($element); // schema $this->FormMailView->setSchema($name, $element['type']); // validate if ($element['rule']) { $allowEmpty = true; if ($element['required']) { $allowEmpty = false; } $this->FormMailView->setValidate($name, $element['rule'], $allowEmpty); } if ($element['required']) { $this->FormMailView->setValidate($name); } } $this->set(compact('formMailForm', 'elements')); if ($this->data) { $this->FormMailView->set($this->data); if ($this->FormMailView->validates()) { if ($this->_send( $formMailForm['FormMailForm']['email'], $formMailForm['FormMailForm']['title'] )) { $this->Session->setFlash('送信しました'); $this->render('send'); } else { $this->Session->setFlash('送信できませんでした'); } } else { $this->Session->setFlash('送信できませんでした メッセージを確認してください'); } } else { $this->data['FormMailView']['id'] = $formMailForm['FormMailForm']['id']; } } function _send($sendTo, $title) { // data整形 $data = $this->FormMailView->data; $body = array(); foreach ($data['FormMailView'] as $key => $value) { if ('id' != $key) { $id = explode('_', $key); $id = $id[1]; $label = $this->FormMailForm->FormMailElement->field( 'label', array('id' => $id)); $body[] = array('label' => $label, 'data' => $value); } } // メール送信処理 $this->set('body', $body); $this->view = 'View'; //$this->MyQdmail->debug(2); $this->MyQdmail->to($sendTo); $this->MyQdmail->subject($title); $this->MyQdmail->template('mail'); return $this->MyQdmail->send(); } function _setFormOptions($element) { $default_element = array( 'label' => false, 'type' => 'text', 'options' => null, ); $element = am($default_element, $element); $options = array(); $options['label'] = h($element['label']); $options['type'] = $element['type']; // From::inputのオプション値となる switch ($element['type']) { case 'datetime': $options['dateFormat'] = 'YMD'; $options['monthNames'] = false; $options['timeFormat'] = '24'; $options['interval'] = 10; break; case 'date': $options['dateFormat'] = 'YMD'; $options['monthNames'] = false; break; case 'time': $options['dateFormat'] = 'NONE'; $options['timeFormat'] = '24'; $options['interval'] = 10; break; case 'select': $opt = explode(',', $element['options']); $options['options'] = array_combine($opt, $opt); break; case 'radio': $opt = explode(',', $element['options']); $options['options'] = array_combine($opt, $opt); $options['legend'] = h($element['label']); break; case 'checkbox': break; } return $options; } } ?>
おっとその前に
Form::datetime にて、24表記のとき interval が利用できないバグ?があるので
https://trac.cakephp.org/ticket/4641
#4641 ([PATCH] Interval option in dateTime form helper) - CakePHP : The Rapid Development Framework for PHP - Trac
↑でやってるようにCoreを修正
ついでにビューも
app/plugin/form_mail/views/form_mail_views/edit.ctp
<h2><?php echo h($formMailForm['FormMailForm']['title']); ?></h2> <?php echo $form->create('FormMailView'); ?> <?php echo $form->input('id'); foreach ($elements as $key => $element) { echo $form->input($element['name'], $element['options']); } ?> <?php echo $form->end('送信'); ?>
app/plugin/form_mail/views/form_mail_views/send.ctp
<?php //お好みで送信後のメッセージ ?>
app/plugin/form_mail/views/elements/email/text/mail.ctp
<?php foreach ($body as $row) { echo "[" . $row['label'] . "]\n"; echo $row['data'] . "\n\n"; } ?>
その3設定編へ続く