2008-11-23 15 views
6

Tengo un modelo muy simple. Quiero añadir una rutina de correo electrónico para enviar el de los métodos para el modelo:¿Cómo uso el componente de correo electrónico de un modelo en CakePHP?

$this->Email->delivery = 'smtp'; 
$this->Email->template = 'default'; 
$this->Email->sendAs = 'text';  
$this->Email->from = 'email'; 
$this->Email->to  = 'email'; 
$this->Email->subject = 'Error'; 

He intentado poner

App::import('Component', 'Email'); 

en la parte superior, sin ningún resultado. El error que recibo es:

Fatal error: Call to undefined method stdClass::send() in E:\xampp\htdocs8080\app\models\debug.php on line 23

¿Alguna idea?

estoy corriendo CakePHP 1.2

se supone

Respuesta

11

Bueno, lo estás haciendo mal camino.Usted debe colocar de correo electrónico enviar rutina en su AppController:

function _sendMail($to,$subject,$template) { 
    $this->Email->to = $to; 
    // $this->Email->bcc = array('[email protected]'); // copies 
    $this->Email->subject = $subject; 
    $this->Email->replyTo = '[email protected]'; 
    $this->Email->from = 'MyName <[email protected]>'; 
    $this->Email->template = $template; 
    $this->Email->sendAs = 'text'; //Send as 'html', 'text' or 'both' (default is 'text') 
    $this->Email->send(); 
} 

Entonces usarlo desde cualquier controlador de la siguiente manera:

$this->_sendMail($this->data['User']['email'],'Thanks for registering!','register'); 

Y no se olvide de colocar

var $components = array('Email'); 

en los controladores, en el que está usando la función _sendMail.

+2

Gracias! "Por favor ingrese al menos 10 caracteres". es un requisito tonto. – Justin

+0

Sí, no puedo solo dar las gracias. Molesto. – Justin

+0

¿puedo agregar esto al modelo de la aplicación en su lugar? –

2

Componentes para ser utilizado en los controladores, no modelos.

En su utilización controlador

var $components = array('Email'); 

No hay necesidad de utilizar App :: import();

Sin conocer su aplicación y las razones por las que desea utilizarla en un modelo, le sugiero que vuelva a pensar la arquitectura de su sistema y traslade esta lógica a su controlador.

Si definitivamente se necesita en su modo, su código incluido algo así como ...

$this->Email->delivery = ... 

¿Ha puesto creado una nueva instancia del componente y configurarlo para una propiedad de su modelo denominado de correo electrónico? (No tengo idea si esto funcionará.)

El error que está recibiendo es porque está llamando al método send() en un objeto stdClass, es decir, no una instancia del componente EmailComponent.

2

Bien, cierto que no es bueno usar componentes en los modelos. Mi problema era que no quería tener que escribir el bloque de correo electrónico de un millón de veces en mis controladores:

$this->Email->delivery = 'smtp';

$this->Email->template = $template;

$this->Email->sendAs = 'text';

$this->Email->from = $from;

$this->Email->to = $to;

$this->Email->subject = $subject;

$this->Email->send();

Apenas SECO si uso esto 5 veces en un controlador. Así que creé un componente llamado la envoltura, y añadió una rutina sendEmail, por lo que sólo puedo escribir:

$this->Wrapper->sendEmail($from,$to,$subject,$template,$body);

19

incluso si no es la mejor práctica, en realidad se puede utilizar el EmailComponent en un modelo, pero hay que instanciar (en los Modelos no hay carga de Componente automática) y necesita pasarle un controlador. El componente Email se basa en el controlador debido a la conexión que necesita a la vista, para representar plantillas y diseños de correo electrónico.

Con un método como este en su modelo

function sendEmail(&$controller) { 
    App::import('Component', 'Email'); 
    $email = new EmailComponent(); 
    $email->startup($controller); 
} 

Se puede utilizar en el controlador de la siguiente manera:

$ this-> Modelo-> sendEmail ($ this);

(omita el & en la firma del método, si estás en PHP5)

2

Estoy contigo Justin.

Tengo una serie de modelos que desencadenan correos electrónicos basados ​​en ciertas acciones que pueden provenir de usuarios, administradores y scripts de shell para procesos automatizados.

Es mucho más fácil centralizar una respuesta de correo electrónico en el Modelo (como cuando un registro de Orden es "cancelado") que reescribir el correo electrónico en múltiples ubicaciones.

Además, tengo procesos automatizados en los Modelos que manejan algunas 'lógicas' centrales que se conectan en cascada a otros modelos HasOne, belongsTo o hasMany que son reglas de negocio.

Por ejemplo, un script de shell crontabbed llama a Offer-> expire() para 'expirar' una oferta que luego llama a Offer-> make() para hacer otra oferta, pero si no puede, entonces llama a Request-> expira() para 'expirar' la solicitud original. Los correos electrónicos deben enviarse al primer destinatario de la oferta caducado, a los nuevos destinatarios de la oferta y/o al solicitante si caduca. Estos pueden ser llamados por shell crontabbed o por Usuarios o por Admins que pueden gestionar Solicitudes y Ofertas de forma manual. Todos usan diferentes Controladores o interfaces.

Esto es lo que hice y puedo llamarlo modelos dentro y controladores:

if(empty($this->MailsController)) { 
    App::import('Controller','Mails'); 
    $this->MailsController = new MailsController(); 
    $this->MailsController->constructClasses(); 
    $this->MailsController->Email->startup($this->MailsController); 
} 

Ahora estoy en condiciones de llamar a esto desde casi cualquier lugar y centralizar toda la lógica de lo que los datos de encontrar(), lo correo electrónico para generar, a quién enviar a, etc a través del siguiente llamado dentro del modelo:

$this->MailsController->orderMail($user_id,$this->id,$mode); 

Dado que toda la lógica de correo electrónico está básicamente llamados por los modelos indirecta a través MailsController, voy a dar el código de rscherer un intento.

espero que esto ayude, oh4real

+1

"No debe usar EmailComponent en un modelo. Usar un controlador" realmente no tiene sentido y se basa en un razonamiento arbitrario. En Rails, los correos electrónicos a menudo se envían desde un Observer, que básicamente es un modelo de comportamiento en Cake, porque los correos electrónicos generalmente ocurren en los cambios de estado. – method

0

Tengo una aplicación donde añado una sola fila a un modelo (model1). Ese modelo luego activa entradas en otro modelo (modelo2). modelo1 tiene muchos modelo2. Solo quería enviar correos electrónicos si el modelo2 se inserta correctamente. Así que estaba buscando que el modelo 1 envíe correos electrónicos cada vez que se inserte correctamente en el modelo2.

La reestructuración de la arquitectura del sistema es demasiado tiempo en este momento.

Mi solución? Cuando hago un Model1-> addRecord, hace un model2-> addRecord(). Tengo el modelo 1 para hacer un seguimiento de cada falla o éxito del modelo2-> addRecord. Desde model1-> addRecord I devuelve una matriz de éxito/falla al controlador que invoca (model1_controller). A partir de ahí, haré que model1_controller emita los correos electrónicos.

Por lo tanto, es posible hacerlo correctamente sin tener que reescribir completamente la arquitectura. Simplemente devuelva más información del Model1 al controlador, luego haga que el controlador (correctamente) envíe los correos electrónicos.

Perdón por la publicación poco clara. Mi cerebro está en modo código en este momento.

0

mirada en un plugin llamado lleno de acontecimientos

Se permitirá transmitir y detectar eventos personalizados. Para el poster que está debajo de mí: puedes transmitir un evento Model1Saved, escucharlo en el modelo2, luego realizar el segundo guardado y transmitir un evento de éxito al modelo1, o incluso a un controlador. Desde allí puedes enviar tu correo electrónico.

Cuestiones relacionadas