Отправить письмо в CakePHP afterSave - PullRequest
0 голосов
/ 06 декабря 2011

Я пытаюсь создать компонент / модель электронного письма, который будет добавлять электронное письмо в базу данных (с определенными полями, такими как, тема, сообщение, созданный, измененный и т. Д.).

ПОСЛЕданные были успешно сохранены (что в настоящее время делает), я бы хотел на самом деле отправить сообщение.

Я полагаю, что это будет проще всего с функцией afterSave (), но я не могу получить электронное письмо для отправки.

Вот соответствующий код:

Модель электронной почты

<?php
class Email extends AppModel {
    var $name = 'Email';

    var $displayField = 'subject';

        function afterSave() {

            $this->Email->to = $this->data['Email']['email'];
            $this->Email->subject = $this->data['Email']['subject'];
            $this->Email->replyTo = $this->data['Email']['email'];
            $this->Email->from = 'Private Message <' . $this->data['Email']['email'] . '>';
            //$this->Email->template = 'simple_message';
            $this->Email->send($this->data['Email']['email_text']);

        }
}

add.ctp для электронной почты

<div class="universities form">
<?php echo $this->Form->create('Email');?>
    <fieldset>
        <legend><?php __('Add Email'); ?></legend>
    <?php
        echo $this->Form->input('subject');
        echo $this->Form->input('email_text');
        echo $this->Form->hidden('email', array('value' => $this->params['named']['contact_email']));
        echo $this->Form->hidden('user_from', array('value' => $this->Session->read('User.id')));
        echo $this->Form->hidden('created', array('value' => date("Y-m-d")));
        echo $this->Form->hidden('modified', array('value' => date("Y-m-d")));

    ?>
    </fieldset>
<?php echo $this->Form->end(__('Submit', true));?>
</div>

Код сохранения контроллера:

    function add() {
        if (!empty($this->data)) {
            $this->Email->create();
//                        pr($this->data);
//                        die;
            if ($this->Email->save($this->data)) {
                $this->Session->setFlash(__('The email has been saved', true));
            } else {
                $this->Session->setFlash(__('The email could not be saved. Please, try again.', true));
            }
        }
    }

Ошибка при попытке отправить:

Fatal error: Call to undefined method stdClass::send() in /Users/[USER]/Sites/example_app/app/models/email.php on line 14

Новый код контроллера:

function add() {
        if (!empty($this->data)) {
            $this->Email->create();
//                        pr($this->data);
//                        die;
            if ($this->Email->save($this->data)) {
                $this->Session->setFlash(__('The email has been saved', true));

                                function _sendMail() {
                                    $this->Email->to = $this->data['Email']['email'];
                                    $this->Email->subject = $this->data['Email']['subject'];
                                    $this->Email->replyTo = $this->data['Email']['email'];
                                    $this->Email->from = 'Private Message <' . $this->data['Email']['email'] . '>';
                                    $this->Email->sendAs = 'text'; //Send as 'html', 'text' or 'both' (default is 'text')
                                    $email->send();
                                }

                                $this->_sendMail();

            } else {
                $this->Session->setFlash(__('The email could not be saved. Please, try again.', true));
            }
        }
    }

1 Ответ

2 голосов
/ 06 декабря 2011

компоненты предназначены для использования в контроллере, а не в модели, поэтому самый простой способ - отправлять почту с контроллера, когда $ this-> Model-> save () возвращает true.

Поскольку выЯ назвал вашу модель "Электронная почта", я не думаю, что вы можете использовать компонент "Электронная почта" стандартным способом, и вам нужно загрузить его вручную:

В контроллере (функция add ())

if ($this->Email->save($this->data)) {
    // save was successfull

    App::import('Component', 'Email');
    $email = new EmailComponent();
    $email->startup($this);

    $email->from='joe@example.com';
    $email->to = $this->data['Email']['email'];
    $email->subject = $this->data['Email']['subject'];
    $email->replyTo = $this->data['Email']['email'];
    $email->from = 'Private Message <' . $this->data['Email']['email'] . '>';
    $email->sendAs = 'text'; //Send as 'html', 'text' or 'both' (default is 'text')
    $email->send();


    $this->Session->setFlash(__('The email has been saved', true));
}

Тем не менее, можно отправлять письма из модели, см. Второй ответ этой (дублирующей) ветки: Как использовать компонент электронной почты из модели в CakePHP?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...