忍び歩く男 - SLYWALKER

大阪のこっそりPHPer

初めてのプラグイン フォームメール - 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設定編へ続く