In questa pillola vediamo come realizzare un semplice componente che invia una email ad un indirizzo a partire dalla compilazione di un form.
Anche se piuttosto semplice, questo componente può essere adattato, ad esempio, ad inviare messaggi adeguatamente formattati ad un web service di un CRM, aggiungendo così al proprio sito istituzionale un potente sistema di lead incoming che spesso manca in organizzazioni aziendali meio-piccole.
Il componente in questione non ha un back-end in quanto diamo per scontato che le email verranno inviate dall’inidirizzo email inserito in fase di installazione del CMS (o modificabile dalle impostazioni di Joomla!) ad un indirizzo info@miodominio.it
Il componente che andiamo a creare si chiamerà com_contatti e sarà strutturato in questo modo:
- controller contenente due task: compila ed invia per effettuare le operazioni di input dei dati ed invio della mail
- 2 view per le azioni dei task di compilazione ed invio del form
NB: Di seguito, notate i parametri passati dal form: ce ne sono due nascosti che indicano quale option (=componente) e quale task richiamare.
Il componente sarà pertanto composto dai file:
/com_contatti/contatti.xml contenente la definizione dei file e i dati del componente
/com_contatti/contatti.php che istanzia il controller e definisce l’azione di default
/com_contatti/controller.php contenete le azioni relative ai due task che intendiamo sviluppare
/com_contatti/views/index.html
/com_contatti/views/compila/view.html.php contenente la definizione di una classe che eredita JView e richiama il metodo parent::display()
/com_contatti/views/compila/tmpl/index.html
/com_contatti/views/compila/tmpl/default.php contenete il codice del form e la relativa azione cui passare il controllo
/com_contatti/views/invia/view.html.php contenente la definizione di una classe che eredita JView e richiama il metodo parent::display()
/com_contatti/views/invia/tmpl/index.html
/com_contatti/views/invia/tmpl/default.php contenete il codice di invio della mail con i dati prelevati dal form
Diamo un’occhiata al codice dei file:
contatti.xml
<?xml version="1.0" encoding="utf-8"?>
<install type="component" version="1.5.0">
<name>Contatti</name>
<description>Componenti per invio di un form di contatti</description>
<files>
<filename>controller.php</filename>
<filename>contatti.php</filename>
<filename>index.html</filename>
<filename>views/index.html</filename>
<filename>views/contatti/index.html</filename>
<filename>views/contatti/view.html.php</filename>
<filename>views/contatti/tmpl/default.php</filename>
<filename>views/contatti/tmpl/index.html</filename>
</files>
</install>
Ricordiamo che i file index.html non contengono altro che: <html><body bgcolor="#FFFFFF"></body></html>
dopodiché creiamo contatti.php:
<?php
// Evito accesso diretto al file
defined( '_JEXEC' ) or die( 'Restricted access' );
// Requiedo il controller base
require_once( JPATH_COMPONENT.DS.'controller.php' );
// Rechiedo all'occorrenza il controller specifico
if($controller = JRequest::getWord('controller')) {
$path = JPATH_COMPONENT.DS.'controllers'.DS.$controller.'.php';
if (file_exists($path)) {
require_once $path;
} else {
$controller = '';
}
}
// Creo un'istanza del controller
$classname = 'ContattiController'.$controller;
$controller = new $classname( );
// notifichiamo che il task di default non è "view" (convenzione in Joomla!) bensì "compila-form"
$controller->registerDefaultTask('compila-form');
// Eseguo il task richiesto
$controller->execute(JRequest::getCmd('task'));
Il file controller.php, invece, conterrà il codice dei due task:
<?php
// Check to ensure this file is included in Joomla!
defined('_JEXEC') or die( 'Restricted access' );
jimport('joomla.application.component.controller');
class ContattiController extends JController
{
function compila()
{
$session =& JFactory::getSession();
JRequest::setVar( 'view', 'compila' );
$this->display();
}
function invia()
{
global $mainframe;
// Check for request forgeries
JRequest::checkToken() or jexit( 'Invalid Token' );
$session =& JFactory::getSession();
jimport( 'joomla.mail.helper' );
$to = 'info@miodominio.it';
$mailfrom = $mainframe->getCfg('mailfrom');
$sender = JRequest::getString('sender', '', 'post');
$from = JRequest::getString('from', '', 'post');
$subject = JRequest::getString('subject', $subject_default, 'post');
$body = JRequest::getString('body','','post');
// Invio l'email
if ( JUtility::sendMail($from, $sender, $to, $subject, $body) !== true )
{
print_r($mailer);
JError::raiseNotice( 500, JText:: _ ('EMAIL_NOT_SENT' ));
return $this->compila();
}
JRequest::setVar( 'view', 'invia' );
$this->display();
}
}
Infine, i file contenenti le classi che ereditano JView:
/com_contatti/views/compila/view.html.php
<?php
defined('_JEXEC') or die( 'Restricted access' );
jimport('joomla.application.component.view');
class ContattiViewCompila extends JView
{
function display($tpl = null)
{
parent::display($tpl);
}
}
/com_contatti/views/invia/view.html.php
<?php
defined('_JEXEC') or die( 'Restricted access' );
jimport('joomla.application.component.view');
class ContattiViewInvia extends JView
{
function display($tpl = null)
{
parent::display($tpl);
}
}
E infine, i file delle view: il primo con il form:
/com_contatti/views/compila/tmpl/default.php
<?php // no direct access
defined('_JEXEC') or die('Restricted access'); ?>
<form action="<?php echo JURI::base() ?>index.php" name="contattiForm" method="post">
<div style="padding: 10px;">
<p>
<?php echo JText::_('SENDER'); ?>:
<br />
<input type="text" name="sender" class="inputbox" value="nome mittente" size="25" />
</p>
<p>
<?php echo JText::_('YOUR_EMAIL'); ?>:
<br />
<input type="text" name="from" class="inputbox" value="email" size="25" />
</p>
<p>
<?php echo JText::_('SUBJECT'); ?>:
<br />
<input type="text" name="subject" class="inputbox" value="oggetto" size="25" />
</p>
<p>
<?php echo JText::_('BODY'); ?>:
<br />
<input type="text" name="body" class="inputbox" value="oggetto" size="25" />
</p>
<p>
<button class="button" onclick="return submitbutton('send');">
<?php echo JText::_('SEND'); ?>
</button>
<button class="button" onclick="window.close();return false;">
<?php echo JText::_('CANCEL'); ?>
</button>
</p>
</div>
<input type="hidden" name="layout" value="<?php echo $this->getLayout();?>" />
<input type="hidden" name="option" value="com_contatti" />
<input type="hidden" name="task" value="invia" />
<input type="hidden" name="link" value="<?php echo $data->link; ?>" />
<?php echo JHTML::_( 'form.token' ); ?>
</form>
e il file di invio che verrà presentato solo in caso di esito positivo dell’invio:
<?php
defined('_JEXEC') or die('Restricted access'); ?>
<div style="padding: 10px;">
<div class="componentheading">
<?php echo 'Grazie per averci contattato!' ?>
</div>
</div>










Ciao Antonio,
sono un Ing. Info. come te con la passione di joomla e poca esperienza con il core di questo. Siccome mi piacerebbe approfondire ma non conosco le API (che servono come il pane) per integrare il sistema, mi sapresti consigliare libri, manuali, free o a pagamento? E di sicurezza quanto ne sai? SqlInjection ecc… anche qui testi da consigliare?
Ciao e grazie!
Ciao Marco,
)
per quanto riguarda i manuali di riferimeno, potresti dare un’occhiata a quelli che ho segnalato proprio nella rubrica manuali.
In generale, però, questi testi non sono molto approfonditi e per apprendere le tecniche di utilizzo delle API di Joomla! il metodo migliore resta quello di installarlo e studiarsi le singole classi per vedere, poi, come vengono utilizzate da moduli, componenti e plug-in.
Sei anche tu un ingegnere, quindi è il caso di dire che mai come in questa circostanza fare reverse engineering è il metodo migliore per studiare questo “sistema” (immagino tu abbia sostenuto l’esame di controlli, giusto!?
Cmq,
riguardo la sicurezza del framework di Joomla!: grossomodo è difficile fare SQL Injection, sicuramente con la versione 1.5…ma ci sono alcune peculiarità del core che rischiano di aprire falle (oggi ne ho scoperta una in merito alla parametrizzazione dei template).
Anche in questo caso, ahimé, puoi solo fare esperienza, prendendo spunto da quello che trovi in questo sito, e magari seguire i rilasci di patch per andare a guardare il codice modificato dagli sviluppatori.
Questo sito, non a caso, nasce con l’intento di dare un’ampia panoramica su tutte le nozioni necessarie a “mettere le mani nel codice” (cit. mio prof di Fondamenti di Inf.2) di Joomla!
….in bocca al lupo e fammi sapere come procede
Antonio
ciao Antonio, veramente un ottima guida!!!! complimenti! Ho installato tutto però ho un problema, con mozilla la mail la manda regolarmente, mentre con explorer mi da errore, da cosa potrebbe dipendere? ancora complimenti
@Donato Ciao Donato, GRAZIE MILLE per i complimenti!
Per quanto riguarda l’invio, premesso che si tratta di una procedura che opera server-side (l’invio avviene richiamando in maniera standard la action del form, quindi niente Ajax et similia), mi viene in mente che l’unica cosa che non possa “piacere” ad Exploer è il pulsante di invio di tipo button all’interno della view /com_contatti/views/compila/tmpl/default.php in quanto, quest’ultimo, utilizza javascript per innescare l’azione.
A questo punto ti suggerirei di provare a sostituire button per il pulsante di invio,
con un input type=”submit” value=”< ?php echo JText::_('SEND'); ?>” />
Fammi sapere
ciao
ok, ora provo subito…un’altra domanda, forse banale… nella function invia() la var $subject_default che vaolero prende??? non e che manchi qualcosa che ne setti il valore o mi sfugge qualcosa??
grazie, intanto cambio il submit
ok, ci ho messo l’input come mi hai detto tu e in più ho aggiunto:
$subjectDefault = JText::sprintf( ‘MAILENQUIRY’, $SiteName );
e ora funziona regolarmente sia con moz che con expl…. ti rinnovo i complimenti antonio, veramente una bella guida, ciao.
Ciao, ho provato a seguire i passi spiegati nell’articolo ma non sono riuscito a cariare il modulo.. Per caso è disponibile il pacchetto dei file “pronti all’uso”? Aggiungo poi una cosa: è possibile inserire nel form un codice captcha antispam? Grazie, un saluto a tutti…