Joomla.it Forum
Non solo Joomla... => Sviluppo => : vales 03 Sep 2007, 18:09:27
-
In vari post è stato richiesto come inviare allegati per email, email multiple e più in generale gestire i campi email con FacileForms.
In questo post qui (http://forum.joomla.it/index.php?topic=14595.msg91548#msg91548) di qualche mese fa, riferito all'invio di email di notifica multiple, mi ero posto il problema che oggi ho risolto. Era più semplice del previsto.
Riassumo per semplicità e chiarezza la procedura già esposta nel post sopra citato e le varianti inserite.
1. Dopo creato e salvato il form cliccare sul "nome" del form non sul "titolo".
2. Nella tab "impostazioni" settare "Notifica email" a NO.
3. Cliccare sulla tab "Carica pezzi".
4. Nella sezione di questa linguetta "Fine caricamento" settare il pulsante di opzione "custom". Ciò visualizzerà una casella di testo per scrivere dentro il codice PHP. Inserire il codice qui sotto riportato.
// Send profile to Client
global $ff_config, $mosConfig_mailfrom, $mosConfig_fromname, $my;
$this->execPieceByName('ff_InitLib');
if ($this->dying) return;
$from = $mosConfig_mailfrom;
$fromname = $mosConfig_fromname.' - FacileForms';
if ($this->formrow->emailntf==2)
$recipient = $this->formrow->emailadr;
else
$recipient = $ff_config->emailadr;
$subject = _FACILEFORMS_PROCESS_FORMRECRECEIVED;
$body = '';
if ($this->record_id != '')
$body .= _FACILEFORMS_PROCESS_RECORDSAVEDID." ".$this->record_id.nl().nl();
$body .=
_FACILEFORMS_PROCESS_FORMID.": ".$this->form.nl().
_FACILEFORMS_PROCESS_FORMTITLE.": ".$this->formrow->title.nl().
_FACILEFORMS_PROCESS_FORMNAME.": ".$this->formrow->name.nl().nl().
_FACILEFORMS_PROCESS_SUBMITTEDAT.": ".$this->submitted.nl().
_FACILEFORMS_PROCESS_SUBMITTERIP.": ".$this->ip.nl().
_FACILEFORMS_PROCESS_PROVIDER.": ".$this->provider.nl().
_FACILEFORMS_PROCESS_BROWSER.": ".$this->browser.nl().
_FACILEFORMS_PROCESS_OPSYS.": ".$this->opsys.nl().nl();
if (count($this->maildata)) foreach ($this->maildata as $data)
$body .= $data[_FF_DATA_TITLE].": ".$data[_FF_DATA_VALUE].nl();
$attachment = NULL;
if ($this->formrow->emailxml>0) {
$attachment = $this->expxml();
if ($this->status != _FF_STATUS_OK) return;
} // if
$recipient2 = ff_getSubmit('email_input', '');
// email_input è il nome del campo email nel mio form - email_input is the email field input in the my form
$attachment=ff_getSubmit('input_foto1', '');
//input_foto1 è il campo del percorso dell'allegato nel mio form - input_foto1 is the field width the path of the attachment in to my form
// definire eventuale variabile $body2 per testi email personalizzati
/* Sostituendo la variabile $body2 a $body nelle funzioni sendMail() sotto richiamate
con $body2 = $body.nl()."testo riga 1".nl()."testo riga 2";
si possono aggiungere righe al testo della risposta standard.
con $body2 ="testo riga 1".nl()."testo riga 2".nl();
invece si può creare una nuova email con righe a piacere.
nota - nl() è la funzione che manda a capo il testo
*/
// ora invio l'email all'amministratore - now send the mail to administrator
$this->sendMail($from, $fromname, $recipient, $subject, $body, $attachment);
// ora invio l'email di conferma al mittente a $recipient2 - now send the mail to $recipient2
$this->sendMail($from, $fromname, $recipient2, $subject, $body, $attachment);
Aggiornamenti inseriti il 09.12.2007
Per maggiore chiarezza segnalo che il codice sopra riportato è una modifica della funzione originale di Facileforms che invia l'email di notifica e si trova nella directory del componente nel file "facileforms.process.php"
function sendEmailNotification()
{
global $ff_config, $mosConfig_mailfrom, $mosConfig_fromname;
if ($this->dying) return;
$from = $mosConfig_mailfrom;
$fromname = $mosConfig_fromname.' - FacileForms';
if ($this->formrow->emailntf==2)
$recipient = $this->formrow->emailadr;
else
$recipient = $ff_config->emailadr;
$subject = _FACILEFORMS_PROCESS_FORMRECRECEIVED;
$body = '';
if ($this->record_id != '')
$body .= _FACILEFORMS_PROCESS_RECORDSAVEDID." ".$this->record_id.nl().nl();
$body .=
_FACILEFORMS_PROCESS_FORMID.": ".$this->form.nl().
_FACILEFORMS_PROCESS_FORMTITLE.": ".$this->formrow->title.nl().
_FACILEFORMS_PROCESS_FORMNAME.": ".$this->formrow->name.nl().nl().
_FACILEFORMS_PROCESS_SUBMITTEDAT.": ".$this->submitted.nl().
_FACILEFORMS_PROCESS_SUBMITTERIP.": ".$this->ip.nl().
_FACILEFORMS_PROCESS_PROVIDER.": ".$this->provider.nl().
_FACILEFORMS_PROCESS_BROWSER.": ".$this->browser.nl().
_FACILEFORMS_PROCESS_OPSYS.": ".$this->opsys.nl().nl();
if (count($this->maildata)) foreach ($this->maildata as $data)
$body .= $data[_FF_DATA_TITLE].": ".$data[_FF_DATA_VALUE].nl();
$attachment = NULL;
if ($this->formrow->emailxml>0) {
$attachment = $this->expxml();
if ($this->status != _FF_STATUS_OK) return;
} // if
$this->sendMail($from, $fromname, $recipient, $subject, $body, $attachment);
} // sendEmailNotification
che ha sua volta usa la funzione sendMail() contenuta sempre in "facileforms.process.php"
function sendMail($from, $fromname, $recipient, $subject, $body,
$attachment = NULL, $html = NULL, $cc = NULL, $bcc = NULL)
{
if ($this->dying) return;
$mail = mosCreateMail($from, $fromname, $subject, $body);
if (is_array($recipient))
foreach ($recipient as $to) $mail->AddAddress($to);
else
$mail->AddAddress($recipient);
if ($attachment) {
if ( is_array($attachment) )
foreach ($attachment as $fname) $mail->AddAttachment($fname);
else
$mail->AddAttachment($attachment);
} // if
if (isset($html)) $mail->IsHTML($html);
if (isset($cc)) {
if( is_array($cc) )
foreach ($cc as $to) $mail->AddCC($to);
else
$mail->AddCC($cc);
} // if
if (isset($bcc)) {
if( is_array($bcc) )
foreach ($bcc as $to) $mail->AddBCC($to);
else
$mail->AddBCC($bcc);
} // if
if (!$mail->Send()) {
$this->status = _FF_STATUS_SENDMAIL_FAILED;
$this->message = $mail->ErrorInfo;
} // if
} // sendMail
Quest'ultima ci mostra che i parametri utilizzabili sono molti di più e per utilizzarli basta aggiungerli alla funzione chiamante. (es. $html = NULL, $cc = NULL, $bcc = NULL)
abilitando $html=true si può inserire in $body i tag html che consentono di formattare il testo.
Gli altri due parametri sono: $cc chi legge per conoscenza e $bcc chi legge in copia nascosta.
Un'ulteriore possibilità è data dall'uso di array anzichè semplici variabili in $recipient ed $attachement.
Nel primo caso se si crea l'array
$recipient = array($recipient1,$recipient2,"mia@mail.it");
ecc. aggiungendo variabili contenenti email o costanti a piacimento e possibile inviare email multiple.
La differenza rispetto alla soluzione riportata nel codice è che in questo caso ogni recipiente vede l'indirizzo di tutti gli altri.
Se questo non è desiderato si usa più volte la funzione sendMail() come nel mio caso.
Altra bella cosina è che usando l'array
$attachment= array($attachemnt1,$attachment2,"/mio/percorso/file.jpg");
è possibile inviare allegati multipli.
Attenzione i percorsi nelle variabili o nelle costanti devono essere percorsi assoluti del server ed i file allegati devono essere ospitati in directory accessibili (es: images)del server.
Il percorso assoluto si trova in Pannello amministratore
Sito->Configurazione generale->Server
A quello va aggiunta/e la/e directory del sito che ospita/no gli allegati e i nomi degli allegati.
Esempio mio caso:
/home/petra/data/VirtualDomains/miosito/www/docs/images/file.txt
Nel caso di file allegati nei campi del form la funzione
$attachment=ff_getSubmit('input_foto1','');
da già il percorso assoluto.
Come si può vedere con questi codici è possibile personalizzare tutti i campi dell'email ed inviarne a piacere.
Sperando di essere stato utile e sufficientemente chiaro, invio saluti a tutti
Vales
-
Grandioso!!! Finalmente ho trovato risp :Dosta alle mie domande!!!
-
Ho inserito oggi nel primo post importanti aggiornamenti.
Saluti Vales
-
grande Vales... come al solito un super perno della magnifica macchina che è forum.joomla..
Volevo porti/Vi una domanda riguardo la funzione di allegati multipli
Ho un problema che non riesco a risolvere
nel mio form ho la necessita di mettere 10 campi allega file
volevo sapere alcune info
1) c'è un limite per ogni singolo allega? io ho messo a zero la property " Max.Dimensione file " altrimenti non mi permetteva di mettere più di 2 mega di file!
2)posso mettere un alert e quale per consentire all'utente di capire quando sta sforando con l'allegato?
Un altra domandona ma questa è meno impellente..
nel form ho messo una "Seleziona Lista" èsiste la remota possibilità che a seconda di una selezione di una voce mi carica con dei dati(diversi a seconda della scelta) un altra lista?
Vi ringrazio ragazzi... spero di essere stato chiaro..
Saluti, Lele
-
abilitando $html=true si può inserire in $body i tag html che consentono di formattare il testo.
Cosa devo inserire in questa funzione per formattare il testo e dove? grazie
-
Nel primo post mi riferivo alla funzione originaria sendmail e dicevo quanto segue.
Quest'ultima ci mostra che i parametri utilizzabili sono molti di più e per utilizzarli basta aggiungerli alla funzione chiamante. (es. $html = NULL, $cc = NULL, $bcc = NULL)
abilitando $html=true si può inserire in $body i tag html che consentono di formattare il testo.
Ciò vuol dire che puoi aggiungere alla funzione modificata
$this->sendMail($from, $fromname, $recipient2, $subject, $body, $attachment);
dopo il parametro $attachment il parametro $html=true così
$this->sendMail($from, $fromname, $recipient2, $subject, $body, $attachment, $html=true);
e questo abiliterà ad inserire nella variabile $body tag html per formattare il testo della email.
Saluti Vales
-
ok...però ora ho tutto formattato vicino...come posso dargli un ordine in modo che sia chiaro?
-
Non conoscendo il testo che hai formattato non so dirti.
Comunque penso che usando appropriati tag html che agiscono sulla dimensione caratteri e sullo stile di testo otterrai i risulti voluti.
Saluti Vales
-
scusa potresti chiarirmi una cosa quando dici
// email_input è il nome del campo email nel mio form - email_input is the email field input in the my form
io sostituisco così
$recipient2 = ff_getSubmit('cf_email', ''); ma non funziona;
ho provato anche così:
$recipient2 = ff_getSubmit('email_input', 'cf_email'); ma non va lo stesso.
saresti così gentile da spiegarmi?
Grazie per la pazienza
-
scusa potresti chiarirmi una cosa quando dici
// email_input è il nome del campo email nel mio form - email_input is the email field input in the my form
io sostituisco così
$recipient2 = ff_getSubmit('cf_email', ''); ma non funziona;
ho provato anche così:
$recipient2 = ff_getSubmit('email_input', 'cf_email'); ma non va lo stesso.
saresti così gentile da spiegarmi?
Grazie per la pazienza
Se "cf_email" è il nome del tuo campo di inserimento dell'indirizzo email nel form è giusta la prima assegnazione.
Hai disabilitato la "Notifica email" come detto al punto 2 del primo post ?
Saluti Vales
-
probabilmente mi manca qualcosa.
allora.
Parli di allegato ma cosa intendi? io non ho un file o altro da allegare.
Ho capito o sono fuori?
Per essere ancora più esplicito, desidererei che l'email inviata all'amministratore si recapitata anche all'indirizzo di posta di chi compila il form.
Un'altra cosa. Il messaggio di conferma di invio è in inglese. dove si agisce per modificarlo?
Grazie
-
Il codice sopra descritto fa diverse cose. Quindi per prima cosa occorre stabilire che tipo di form stai preparando.
Quali campi hai predisposto? Ci sono campi in cui inserisci indirizzi email o percorsi di allegati ?
Per quanto riguarda l'inglese quale versione di facile form hai?
Vales
-
Il codice funziona e a me tanto bastava ;D
Per quanto riguarda la versione ho la 1.4.7
-
Mi accodo al post..
vales, funziona bene, ma vorrei chiederti 2 cose:
1- Nella mail che arriva ci sono anche queste informazioni:
Record saved to database with ID: 9
Form ID: 11
Form title: newsletter
Form name: newsletter
Submitted at: 2008-05-22 21:41:32
Submitter IP: 151.49.121.77
Submitter provider: Unknown
Submitter browser: Mozilla Firefox 2.0.0.14
Submitter operating system: Windows XP
come faccio ad eliminarle?
2- per la mail che arriva all'utente che compila il form invece di farli arrivare tutto il form, come posso scrivergli solo (Es: Grazie per averci scelto)nella mail che riceve?
grazie
Ciao
-
Mi accodo al post..
vales, funziona bene, ma vorrei chiederti 2 cose:
1- Nella mail che arriva ci sono anche queste informazioni:
Record saved to database with ID: 9
Form ID: 11
Form title: newsletter
Form name: newsletter
Submitted at: 2008-05-22 21:41:32
Submitter IP: 151.49.121.77
Submitter provider: Unknown
Submitter browser: Mozilla Firefox 2.0.0.14
Submitter operating system: Windows XP
come faccio ad eliminarle?
2- per la mail che arriva all'utente che compila il form invece di farli arrivare tutto il form, come posso scrivergli solo (Es: Grazie per averci scelto)nella mail che riceve?
grazie
Ciao
Per risolvere i problemi devi tenere per riferimento il codice commentato nel primo post
1) per non visualizzare le informazioni generali devi togliere le seguenti righe dalla variabile $body :
$body .= _FACILEFORMS_PROCESS_RECORDSAVEDID." ".$this->record_id.nl().nl();
$body .=
_FACILEFORMS_PROCESS_FORMID.": ".$this->form.nl().
_FACILEFORMS_PROCESS_FORMTITLE.": ".$this->formrow->title.nl().
_FACILEFORMS_PROCESS_FORMNAME.": ".$this->formrow->name.nl().nl().
_FACILEFORMS_PROCESS_SUBMITTEDAT.": ".$this->submitted.nl().
_FACILEFORMS_PROCESS_SUBMITTERIP.": ".$this->ip.nl().
_FACILEFORMS_PROCESS_PROVIDER.": ".$this->provider.nl().
_FACILEFORMS_PROCESS_BROWSER.": ".$this->browser.nl().
_FACILEFORMS_PROCESS_OPSYS.": ".$this->opsys.nl().nl();
commentandole, o sostituendo i contenuti delle assegnazioni, oppure facendo $body.="";
2)per personalizzare il testo della email del mittente devi definire una nuova variabile es. $body2, riempirla con i testi che ti interessano e utilizzarla al posto della variabile $body nella seguente seconda chiamata della funzione sendmail()
$this->sendMail($from, $fromname, $recipient2, $subject, $body2, $attachment);
Attenzione all'assegnazione dei valori alle variabili. E tutto dovrebbe funzionare.
Saluti Vales
-
mmmm... forse è troppo complicato per me...
inoltre ho visto, fingendomi io un utente che compila il form, che non ricevo alcuna mail di notifica. (questo prima di fare queste ultime modifiche)..
Dove sbaglio, che devo controllare?
Grazie ancora
ciao
-
mmmm... forse è troppo complicato per me...
inoltre ho visto, fingendomi io un utente che compila il form, che non ricevo alcuna mail di notifica. (questo prima di fare queste ultime modifiche)..
Dove sbaglio, che devo controllare?
Grazie ancora
ciao
Forse c'è qualche problema nell'assegnazione dei valori alle variabili. Se posti il codice che stai usando provo a darti un aiuto.
Non dimenticare il nome del campo email del mittente
Vales