example - cakephp email
¿Cómo uso el componente de correo electrónico de un modelo en CakePHP? (8)
Se supone que los componentes deben usarse en controladores, no en modelos.
En tu uso de controlador
var $components = array(''Email'');
No es necesario usar 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 lo necesita en su modo, su código incluye algo así como ...
$this->Email->delivery = ...
¿Has creado una nueva instancia del componente y la configuraste en una propiedad de tu modelo llamada Email? (No tengo idea si esto funcionará.)
El error que está recibiendo se debe a que está llamando al método send () en un objeto stdClass, es decir, no a una instancia de EmailComponent.
Tengo un modelo muy simple. Deseo agregar una rutina de envío de correo electrónico a uno de los métodos para el modelo:
$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, fue en vano. El error que recibo es:
Error fatal: llamada al método indefinido stdClass :: send () en E: / xampp / htdocs8080 / app / models / debug.php en la línea 23
¿Algunas ideas?
Estoy ejecutando CakePHP 1.2
De acuerdo, es 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 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 Wrapper y agregué una rutina sendEmail, así que solo puedo escribir:
$ this-> Wrapper-> sendEmail ($ from, $ to, $ subject, $ template, $ body);
incluso si no es una buena práctica, puede usar el componente EmailComponent en un modelo, pero necesita instanciarlo (en los Modelos no hay carga automática de Componente) y debe 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 tu modelo
function sendEmail(&$controller) {
App::import(''Component'', ''Email'');
$email = new EmailComponent();
$email->startup($controller);
}
Puedes usarlo en tu Controlador así:
$ this-> Model-> sendEmail ($ this);
(omita la & en la firma del método si estás en PHP5)
Bueno, lo estás haciendo mal. Debe colocar la rutina de envío de correo electrónico 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();
}
A continuación, utilícelo desde CUALQUIER controlador como este:
$this->_sendMail($this->data[''User''][''email''],''Thanks for registering!'',''register'');
Y no olvides colocar
var $components = array(''Email'');
en controladores, en los que está usando la función _sendMail.
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, he automatizado procesos 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-> expire () para ''expire'' la solicitud original. Los correos electrónicos deben enviarse al primer destinatario de la oferta caducado, a cualquier nuevo destinatario de la oferta y / o al solicitante si caduca. Estos pueden ser llamados por shell crontabbed o por los Usuarios o por los Administradores que pueden gestionar Solicitudes y Ofertas de forma manual. Todos usan diferentes Controladores o interfaces.
Esto es lo que hice y puedo llamarlo dentro de Modelos y Controladores:
if(empty($this->MailsController)) {
App::import(''Controller'',''Mails'');
$this->MailsController = new MailsController();
$this->MailsController->constructClasses();
$this->MailsController->Email->startup($this->MailsController);
}
Ahora puedo llamar a esto desde cualquier lugar y centralizar toda la lógica de qué datos buscar (), qué correo electrónico generar, a quién enviarlo, etc. a través de lo siguiente llamado dentro del Modelo:
$this->MailsController->orderMail($user_id,$this->id,$mode);
Dado que toda la lógica del correo electrónico es básicamente llamada por los Modelos indirectamente a través de MailsController, voy a probar el código de rscherer.
Espero que esto ayude, oh4real
Tengo una aplicación donde agrego una sola fila a un modelo (modelo1). 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 punto.
¿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.
Mire en un plugin llamado Eventful
Te permitirá transmitir y escuchar 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.
CakePHP 2.0 tiene la nueva clase CakeEmail que funciona en cualquier lugar:
http://book.cakephp.org/2.0/en/core-utility-libraries/email.html