CakePHP устанавливает данные для отправки электронного письма от компонента - PullRequest
3 голосов
/ 30 августа 2011

У меня есть компонент, который подключается к удаленной базе данных по нескольким причинам.Однако удаленная база данных не гарантируется, поэтому, если она не работает, я хочу отправить электронное письмо, предупреждающее кого-то о сбое.

Вот пример

App::import('Vendor', 'remote_connection_pdo');

class RemoteComponent extends Object 
{
    public $components = array('Email');

    private function remote_connection_failed($data)
    {
        //set info about what was processing when connection failed
        $this->set(compact('data'));

        $this->Email->to = 'team@example.com';
        $this->Email->subject = 'Remote Connection Failed';
        $this->Email->template = 'remote_connect_failure';
        $this->Email->sendAs = 'html';

        $this->Email->send();
    }

    public function doSomething($data)
    {
        try
        {
            $pdo = new RemoteConnectionPDO(RemoteConnectionPDO::getConnection());
        }
        catch(PDOException $e)
        {
            $conn_fail_data = array(
                'While Processing'  => 'Doing something',
                'Other Info'        => $data['Other']['info'],
                'foo'               => 'bar',
            );
            $this->remote_connection_failed($conn_fail_data);

            return false;
        }

        //do something
        //...
        return true;
    }
}

Проблема заключается в том, чтоу класса компонента нет метода set(), как у класса контроллера.Итак, я получаю эту ошибку:

Неустранимая ошибка: вызов неопределенного метода RemoteComponent :: set () в /var/www/app/controllers/components/remote.php в строке 19

Мне нужно установить данные для представления, которое будет использовать электронное письмо (не для представления, представленного пользователю)

Я хочу обработать это внутренне в компоненте, потому что многие контроллеры могут использовать этокомпонент по разным причинам, и этот компонент обрабатывает все соединения с удаленной базой данных.

Так что есть идеи о том, что было бы идеально для этой ситуации?

Ответы [ 2 ]

2 голосов
/ 30 августа 2011

Я не уверен, что это лучший способ продолжить, я обычно создаю метод в AppController:

protected function __sendMail($from,$to,$bcc,$subject,$replyto,$template,$attachments = array(),$headers = array()){
        // SMTP Options
        $this->Email->smtpOptions = array(
            'port'=>MAIL_PORT, 
            'timeout'=>'30',
            'host' => MAIL_HOST,
            'username'=>SENDER_MAIL,
            'password'=>SENDER_PASS
        );

        // Set delivery method
        $this->Email->delivery = 'smtp';
        $this->Email->SMTPAuth = true;
        $this->Email->SMTPSecure = 'tls';
        $this->Email->charset  = 'UTF-8';
        $this->Email->to = $to;
        $this->Email->bcc = $bcc;
        $this->Email->subject = $subject;
        $this->Email->replyTo = $replyto;
        $this->Email->from = $from;
        $this->Email->template = $template;
        $this->Email->header($headers); 

        //Send as 'html', 'text' or 'both' (default is 'text')
        $this->Email->sendAs = 'both';

        $this->Email->attachments = $attachments;

        // Do not pass any args to send()
        $this->Email->send();

        // Check for SMTP errors.
        $this->set('smtp_errors', $this->Email->smtpError);

    }

Я помещаю его в AppController, потому что я использую его в разных контроллерах.Так что в вашем случае, id сохраните ссылку на контроллер (или передайте ее в качестве аргумента), что-то вроде

class RemoteComponent extends Object 
{
    function initialize(&$controller) {
        $this->controller = $controller;
    }

    private function remote_connection_failed($data){
            $this->controller->set('data',$data); //your data
            $this->controller->__sendMail($from,$to,....);
    }

или

class RemoteComponent extends Object 
{
    private function remote_connection_failed($data,$controller){
            $controller->set('data',$data); //your data
            $controller->__sendMail($from,$to,....);
    }

Надеюсь, это поможет

1 голос
/ 30 августа 2011

Я заставил его работать, захватывая ссылку на компонент и вызывая вместо него набор:

public function initialize(&$Controller) 
{
    $this->Controller = $Controller;
}

...

$this->Controller->set(compact('conn_fail_data'));
...