<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Hello World: &#187; applicazione con zend framework</title>
	<atom:link href="http://razorblade.netsons.org/tag/applicazione-con-zend-framework/feed/" rel="self" type="application/rss+xml" />
	<link>http://razorblade.netsons.org</link>
	<description>Programmazione web e oltre: php5, Zend Framework, jQuery, Actionscript 3.0, Sandy 3D Engine e altro</description>
	<lastBuildDate>Fri, 28 Aug 2009 18:23:41 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.8.4</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>Un bootstrap object oriented per Zend Framework ( applicazione reale Zend Framework p.12 )</title>
		<link>http://razorblade.netsons.org/2008/11/19/un-bootstrap-object-oriented-per-zend-framework-applicazione-reale-zend-framework-p12/</link>
		<comments>http://razorblade.netsons.org/2008/11/19/un-bootstrap-object-oriented-per-zend-framework-applicazione-reale-zend-framework-p12/#comments</comments>
		<pubDate>Wed, 19 Nov 2008 14:24:18 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Php]]></category>
		<category><![CDATA[Zend Framework]]></category>
		<category><![CDATA[applicazione con zend framework]]></category>
		<category><![CDATA[bootstrap]]></category>
		<category><![CDATA[OOP]]></category>
		<category><![CDATA[SET NAMES]]></category>
		<category><![CDATA[UTF-8]]></category>
		<category><![CDATA[zend framework]]></category>
		<category><![CDATA[ZF]]></category>

		<guid isPermaLink="false">http://razorblade.netsons.org/?p=55</guid>
		<description><![CDATA[<h2>Trasformiamo il nostro bootstrap in una classe php</h2>

<p>Il codice del nostro bootstrap attualmente è contenuto all'interno del file index.php, che di fatto è il nostro bootstrap. In questo articolo vedremo come realizzare una classe Bootstrap dove ogni metodo si occupera di inizializzare qualcosa di specifico sullo Zend Framework, donando all'applicazione un pizzico di leggibilità e organizzazione in più.</p>


<p>Attualmente il file index.php, nostro attuale bootstrap, è organizzato in<a href="http://razorblade.netsons.org/2008/11/19/un-bootstrap-object-oriented-per-zend-framework-applicazione-reale-zend-framework-p12/">[...] Continua</a></p>


Related posts:<ol><li><a href='http://razorblade.netsons.org/2009/02/02/zend-framework-gestione-dei-moduli-ed-esempio-modulo-di-amministrazione/' rel='bookmark' title='Permanent Link: Zend Framework: gestione dei moduli ed esempio modulo di amministrazione'>Zend Framework: gestione dei moduli ed esempio modulo di amministrazione</a> <small>Come usare Zend_Layout per la gestione dei moduli In quest'articolo...</small></li><li><a href='http://razorblade.netsons.org/2008/12/05/zend-framework-zend_form-con-recaptcha/' rel='bookmark' title='Permanent Link: Zend Framework: Zend_Form con ReCaptcha'>Zend Framework: Zend_Form con ReCaptcha</a> <small>Utilizzare il webservice ReCaptcha per validare i form ReCaptcha è...</small></li></ol>

Related posts brought to you by <a href='http://mitcho.com/code/yarpp/'>Yet Another Related Posts Plugin</a>.]]></description>
			<content:encoded><![CDATA[<h2>Trasformiamo il nostro bootstrap in una classe php</h2>
<p>Il codice del nostro bootstrap attualmente è contenuto all&#8217;interno del file index.php, che di fatto è il nostro bootstrap. In questo articolo vedremo come realizzare una classe Bootstrap dove ogni metodo si occuperà di inizializzare qualcosa di specifico sullo Zend Framework, donando all&#8217;applicazione un pizzico di leggibilità e organizzazione in più.</p>
<p>Attualmente il file index.php, nostro attuale bootstrap, è organizzato in questo modo, come potete anche vedere in alcuni altri articoli della categoria Php -> Zend Framework</p>
<p><b>index.php</b></p>
<pre name="code" class="php">
  // Blocco 1
  error_reporting(E_ALL|E_STRICT);
  ini_set('display_errors', true);
  date_default_timezone_set('Europe/Rome');
  $rootDir = dirname(dirname(__FILE__));
  $rootDir = dirname(dirname(dirname(__FILE__)));
  define( 'CONTAINER', 'paesidelmondo/' );
  define( 'ZEND_ROOT', $rootDir.'/'.CONTAINER );
  set_include_path(ZEND_ROOT.'library'.PATH_SEPARATOR.get_include_path());

  // Blocco 1b
  set_include_path(ZEND_ROOT.'application/models'.PATH_SEPARATOR.get_include_path());

  // Blocco 2
  require_once('Zend/Loader.php');
  Zend_Loader::registerAutoload();

  // Blocco 2b
  Zend_Layout::startMvc(array('layoutPath' => ZEND_ROOT.'/application/views/layouts'));

  // Blocco 3
  $front = Zend_Controller_Front::getInstance();
  $front->registerPlugin(new Zend_Controller_Plugin_ErrorHandler());
  //$front->throwExceptions(true);
  //$frontController->setParam('useDefaultControllerAlways', true);
  $front->setControllerDirectory(ZEND_ROOT.'application/controllers');

  // Blocco 3b
  $config = new Zend_Config_Ini(ZEND_ROOT.'config.ini', 'prova');  

  // Blocco 3c
  $db = Zend_Db::factory($config->db->adapter, $config->db->config->toArray());
  Zend_Db_Table::setDefaultAdapter($db);
  Zend_Registry::set('db', $db);
  Zend_Registry::set('config', $config);

  $acl = new Paesidelmondo_Acl();
  $aclHelper = new Paesidelmondo_Controller_Action_Helper_Acl(null, array('acl'=> $acl));
  Zend_Controller_Action_HelperBroker::addHelper($aclHelper);

  Zend_Search_Lucene_Search_QueryParser::setDefaultEncoding('UTF-8');
  Zend_Search_Lucene_Analysis_Analyzer::setDefault(new Zend_Search_Lucene_Analysis_Analyzer_Common_Utf8());
  SearchIndexer::setIndexDirectory(ZEND_ROOT.'/var/search_index');
  Paesidelmondo_Db_Table_Row_Observerable::attachObserver('SearchIndexer'); 

  Zend_Controller_Action_HelperBroker::addPrefix('Paesidelmondo_Controller_Action_Helper_');

  // Blocco 4
  try {
    $front->dispatch();
  } catch(Exception $e) {
      echo nl2br($e->__toString());
  }
</pre>
<p>D&#8217;ora in poi invece il seguente sarà il nostro file index.php</p>
<pre name="code" class="php">
  $rootDir = dirname(__FILE__);
  define( 'CONTAINER', 'paesidelmondo/' );
  define( 'ROOT_DIR', $rootDir.'/'.CONTAINER );
  set_include_path(ROOT_DIR.'library'.PATH_SEPARATOR.get_include_path());
  set_include_path(ROOT_DIR.'application/models'.PATH_SEPARATOR.get_include_path());
  //echo get_include_path();
  require(ROOT_DIR.'\application\bootstrap.php');
  require_once('Zend/Loader.php');
  Bootstrap::run('prova');
</pre>
<p>Come potete vedere tutte inizializzazioni dei vari componenti sono state rimosse, lasciando tutto il lavoro al metodo statico run della classe Bootstrap. Siccome non ho visto la necessità di creare una istanza della classe, per ora ho deciso di trattarla staticamente, infatti anche tutti gli altri metodi della classe sono statici. Il metodo run accetta un argomento che determina con quali configurazioni l&#8217;applicazione sarà avviata. Come potete vedere voi stessi, il Bootstrap.php sarà salvato all&#8217;interno della directory &#8216;application&#8217; ( la stessa che contiene le dir Models/Views/Controllers ).</p>
<pre name="code" class="php">
  class Bootstrap {
    public static $config = null;
    public static $configSection = null;
    public static $frontController = null;
    public static $registry = null;

    public static function run($configSection = 'generale'){
      self::$configSection = $configSection;
      self::prepare();
      $response = self::$frontController->dispatch();
      self::sendResponse($response);
    }

    public static function prepare(){
      Zend_Loader::registerAutoload();
      self::setupRegistry();
      self::setupConfiguration();
      self::setupEnvironment();
      self::setupFrontController();
      self::setupView();
      self::setupDatabase();
      self::setupACL();
      self::setupLucene();
    }

    public static function setupRegistry(){
      self::$registry = new Zend_Registry(array(), ArrayObject::ARRAY_AS_PROPS);
      Zend_Registry::setInstance(self::$registry);
    }

    public static function setupConfiguration(){
      $config = new Zend_Config_Ini(ROOT_DIR.'configuration/config.ini', self::$configSection);
      self::$registry->config = $config;
    }

    public static function setupEnvironment(){
      error_reporting(E_ALL|E_STRICT);
      ini_set('display_errors', (bool)self::$registry->config->ini->display_errors);
      date_default_timezone_set(self::$registry->config->date_default_timezone);
    }

    public static function setupFrontController(){
      self::$frontController = Zend_Controller_Front::getInstance();
      self::$frontController->throwExceptions((bool)self::$registry->config->front->throwExceptions);
      self::$frontController->returnResponse((bool)self::$registry->config->front->returnResponse);
      self::$frontController->registerPlugin(new Zend_Controller_Plugin_ErrorHandler());
      self::$frontController->setControllerDirectory(ROOT_DIR.'/application/controllers');
    }

    public static function setupView(){
      $view = new Zend_View;
      $view->setEncoding('UTF-8');
      $viewRenderer = new Zend_Controller_Action_Helper_ViewRenderer($view);
      Zend_Controller_Action_HelperBroker::addHelper($viewRenderer);
      Zend_Layout::startMvc(array('layoutPath' => ROOT_DIR.'/application/views/layouts'));
    }

    public static function setupDatabase(){
      $db = Zend_Db::factory(self::$registry->config->db->adapter, self::$registry->config->db->config->toArray());
      $db->query("SET NAMES 'utf8'");
      Zend_Db_Table::setDefaultAdapter($db);
      self::$registry->db = $db;
    }

    public static function setupACL(){
      $acl = new Paesidelmondo_Acl();
      $aclHelper = new Paesidelmondo_Controller_Action_Helper_Acl(null, array('acl'=> $acl));
      Zend_Controller_Action_HelperBroker::addHelper($aclHelper);
    }

    public static function setupLucene(){
      Zend_Search_Lucene_Search_QueryParser::setDefaultEncoding('UTF-8');
      Zend_Search_Lucene_Analysis_Analyzer::setDefault(new Zend_Search_Lucene_Analysis_Analyzer_Common_Utf8());
      SearchIndexer::setIndexDirectory(ROOT_DIR.'/var/search_index');
      Paesidelmondo_Db_Table_Row_Observerable::attachObserver('SearchIndexer');
    }

    public static function sendResponse(Zend_Controller_Response_Http $response){
      $response->setHeader('Content-Type', 'text/html; charset=UTF-8', true);
      $response->sendResponse();
    }
  }
</pre>
<p>Il codice, se avete seguito tutti gli altri articoli non merita particolari spiegazioni, ma c&#8217;è una cosa importante da notare: subito dopo aver istanziato l&#8217;oggetto $db effettuiamo una query, <b>SET NAMES &#8216;utf8&#8242;</b>.  Questa query è utile perchè imposta il charset utf8 per la gestione dell&#8217;interazione con il database. Purtroppo questa modifica, ci obbliga a eliminare alcune modifiche delle quali vi avevo parlato in <a href="http://razorblade.netsons.org/2008/10/27/zend-search-lucene-e-utf-8-unicode-con-zend-framework/">questo articolo</a>: sto parlando dell&#8217;aggiunta delle funzioni utf8_encode e utf8_decode. Queste, utilizzando la query <b>SET NAMES &#8216;utf8&#8242;</b> nel bootstrap, non sono più necessarie, anzi, effettuano una codifica/decodifica non necessaria causando un malfunzionamento nella visualizzazione dei testi. Il vantaggio di questo approccio è anche la visione corretta dei testi usando PhpMyAdmin: i testi contenenti caratteri unicode saranno perfettamente visibilie e modificabili direttamente da li senza dover subire nessun encoding.</p>
<p>Per quanto riguarda Lucene, una volta effettuate le modifiche sopra descritte vi è la necessità di reindicizzare tutti i documenti per farlo funzionare correttamente.</p>
<p>Si conclude qui questo articolo sulla gestione del Bootstrap Object Oriented.</p>
<div class="ratings">Note: There is a rating embedded within this post, please visit this post to rate it.</div>


<p>Related posts:<ol><li><a href='http://razorblade.netsons.org/2009/02/02/zend-framework-gestione-dei-moduli-ed-esempio-modulo-di-amministrazione/' rel='bookmark' title='Permanent Link: Zend Framework: gestione dei moduli ed esempio modulo di amministrazione'>Zend Framework: gestione dei moduli ed esempio modulo di amministrazione</a> <small>Come usare Zend_Layout per la gestione dei moduli In quest'articolo...</small></li><li><a href='http://razorblade.netsons.org/2008/12/05/zend-framework-zend_form-con-recaptcha/' rel='bookmark' title='Permanent Link: Zend Framework: Zend_Form con ReCaptcha'>Zend Framework: Zend_Form con ReCaptcha</a> <small>Utilizzare il webservice ReCaptcha per validare i form ReCaptcha è...</small></li></ol></p>
<p>Related posts brought to you by <a href='http://mitcho.com/code/yarpp/'>Yet Another Related Posts Plugin</a>.</p>]]></content:encoded>
			<wfw:commentRss>http://razorblade.netsons.org/2008/11/19/un-bootstrap-object-oriented-per-zend-framework-applicazione-reale-zend-framework-p12/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>Zend Framework: gestione degli errori e 404 con Zend_Log</title>
		<link>http://razorblade.netsons.org/2008/10/31/zend-framework-gestione-degli-errori-e-404-con-zend_log/</link>
		<comments>http://razorblade.netsons.org/2008/10/31/zend-framework-gestione-degli-errori-e-404-con-zend_log/#comments</comments>
		<pubDate>Fri, 31 Oct 2008 04:30:14 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Php]]></category>
		<category><![CDATA[Zend Framework]]></category>
		<category><![CDATA[404]]></category>
		<category><![CDATA[applicazione con zend framework]]></category>
		<category><![CDATA[EXCEPTION_NO_ACTION]]></category>
		<category><![CDATA[EXCEPTION_NO_CONTROLLER]]></category>
		<category><![CDATA[Zend_Controller_Plugin_ErrorHandler]]></category>
		<category><![CDATA[Zend_Log]]></category>
		<category><![CDATA[Zend_Log_Writer_Stream]]></category>
		<category><![CDATA[ZF]]></category>

		<guid isPermaLink="false">http://razorblade.netsons.org/?p=44</guid>
		<description><![CDATA[<h2>Errori dell'applicazione e pagina non trovata</h2>
<p>In ogni applicazione possono avvenire dei bug più o meno gravi e quando questo avviene dobbiamo avere qualcosa che tenga nota che l'errore è avvenuto o perchè no, che ci avverta tramite email o sms. In questo articolo vedremo come gestire con Zend Framework un file di log dell'applicazione in modo che qualsiasi comportamento imprevisto sia loggato in modo tale da poter essere successivamente risolto. Inoltre, vedremo come gestire l'errore 404 pagina non trovata, in modo tale che la nostra applicazione restituisca <a href="http://razorblade.netsons.org/2008/10/31/zend-framework-gestione-degli-errori-e-404-con-zend_log/">[...] Continua</a></p>


Related posts:<ol><li><a href='http://razorblade.netsons.org/2009/02/02/zend-framework-gestione-dei-moduli-ed-esempio-modulo-di-amministrazione/' rel='bookmark' title='Permanent Link: Zend Framework: gestione dei moduli ed esempio modulo di amministrazione'>Zend Framework: gestione dei moduli ed esempio modulo di amministrazione</a> <small>Come usare Zend_Layout per la gestione dei moduli In quest'articolo...</small></li><li><a href='http://razorblade.netsons.org/2008/11/30/zend-framework-introduzione-al-componente-zend_form/' rel='bookmark' title='Permanent Link: Zend Framework: introduzione al componente Zend_Form'>Zend Framework: introduzione al componente Zend_Form</a> <small>Creare form web con Zend Form Con Zend Framework possiamo...</small></li><li><a href='http://razorblade.netsons.org/2008/12/05/zend-framework-zend_form-con-recaptcha/' rel='bookmark' title='Permanent Link: Zend Framework: Zend_Form con ReCaptcha'>Zend Framework: Zend_Form con ReCaptcha</a> <small>Utilizzare il webservice ReCaptcha per validare i form ReCaptcha è...</small></li></ol>

Related posts brought to you by <a href='http://mitcho.com/code/yarpp/'>Yet Another Related Posts Plugin</a>.]]></description>
			<content:encoded><![CDATA[<h2>Errori dell&#8217;applicazione e pagina non trovata</h2>
<p>In ogni applicazione possono avvenire dei bug più o meno gravi e quando questo avviene dobbiamo avere qualcosa che tenga nota che l&#8217;errore è avvenuto o perchè no, che ci avverta tramite email o sms. In questo articolo vedremo come gestire con Zend Framework un file di log dell&#8217;applicazione in modo che qualsiasi comportamento imprevisto sia loggato in modo tale da poter essere successivamente risolto. Inoltre, vedremo come gestire l&#8217;errore 404 pagina non trovata, in modo tale che la nostra applicazione restituisca delle pagine formattate con il layout del sito alla richiesta di una qualsiasi url non esistente piuttosto che ricevere un errore del server.</p>
<h2>L&#8217;applicazione</h2>
<p>L&#8217;applicazione dell agestione degli errori è relativamente semplice. Prendiamo il nostro file di bootstrap, index.php e commentiamo o eliminiamo, se presente, la linea </p>
<pre name="code" class="php">
$front->throwExceptions(true);
</pre>
<p>ed aggiungiamo</p>
<pre name="code" class="php">
$front->registerPlugin(new Zend_Controller_Plugin_ErrorHandler());
</pre>
<p>dove $front è ovviamente l&#8217;instanza di Zend_Controller_Front. Così facendo, allo scatenarsi di uno degli eventi citati, l&#8217;output sarà redirezionato all&#8217;ErrorController.</p>
<h2>L&#8217;ErrorController</h2>
<p>Nell&#8217;ErrorController, al metodo errorAction, inseriremo un codice di controllo in modo tale da gestire le due casistiche ( ripeto: errore 404 ed errore dell&#8217;applicazione ) e inserire un contenuto differente all&#8217;interno delle proprietà $content dipendentemente dall&#8217;evento scatenante. Infine, tramite l&#8217;utilizzo del componente Zend_Log, registreremo in un file chiamato applicationException.log il contenuto dell&#8217;eccezione.</p>
<p><b>ErrorController.php</b></p>
<p><pre name="code" class="php">
  class ErrorController extends Zend_Controller_Action
  {
    public function init(){
      $response = $this->getResponse();
      $response->insert('header', $this->view->render('header.phtml'));
      $response->insert('menu', $this->view->render('menu.phtml'));
      $response->insert('columnLeft', $this->view->render('columnLeft.phtml'));
      $response->insert('columnRight', $this->view->render('columnRight.phtml'));
      $response->insert('footer', $this->view->render('footer.phtml'));
    }

    public function indexAction(){
      $this->_forward('error');
    }

    public function errorAction(){
      $errors = $this->_getParam('error_handler');

      switch ($errors->type) {
        case Zend_Controller_Plugin_ErrorHandler::EXCEPTION_NO_CONTROLLER:
        case Zend_Controller_Plugin_ErrorHandler::EXCEPTION_NO_ACTION:
          // 404 error -- controller or action not found
            $this->getResponse()->setRawHeader('HTTP/1.1 404 Not Found');
            $content = "
<div class='errorHandler'>\n";
            $content.= "
<h1>404</h1>

\n";
            $content.= "

La pagina ricercata non esiste!

\n";
            $content.= "</div>

\n";
        break;

        default:
          // application error
          $content = "
<div class='errorHandler'>\n";
          $content.= "
<h1>Errore!</h1>

\n";
          $content.= "

".utf8_encode("E' avvenuto un errore interno dell'applicazione, si prega di riprovare più tardi.")."

\n";
          $content.= "</div>

\n";
        break;
      }

      // Log the exception:
      $exception = $errors->exception;
      $log = new Zend_Log(new Zend_Log_Writer_Stream(ZEND_ROOT.'/tmp/applicationException.log'));
      $log->debug($exception->getMessage()."\n".$exception->getTraceAsString());

      // Clear previous content
      //$this->getResponse()->clearBody();
      $this->view->content = $content;
    }
  }
</pre>
</p>
<p><b>error.phtml</b></p>
<p><pre name="code" class="php">
&lt;?php print $this->content; ?&gt;
</pre>
</p>
<p>Si conclude qui questa breve guida alla gestione degli errori e 404, per domande o suggerimenti postate un commento.</p>
<div class="ratings">Note: There is a rating embedded within this post, please visit this post to rate it.</div>


<p>Related posts:<ol><li><a href='http://razorblade.netsons.org/2009/02/02/zend-framework-gestione-dei-moduli-ed-esempio-modulo-di-amministrazione/' rel='bookmark' title='Permanent Link: Zend Framework: gestione dei moduli ed esempio modulo di amministrazione'>Zend Framework: gestione dei moduli ed esempio modulo di amministrazione</a> <small>Come usare Zend_Layout per la gestione dei moduli In quest'articolo...</small></li><li><a href='http://razorblade.netsons.org/2008/11/30/zend-framework-introduzione-al-componente-zend_form/' rel='bookmark' title='Permanent Link: Zend Framework: introduzione al componente Zend_Form'>Zend Framework: introduzione al componente Zend_Form</a> <small>Creare form web con Zend Form Con Zend Framework possiamo...</small></li><li><a href='http://razorblade.netsons.org/2008/12/05/zend-framework-zend_form-con-recaptcha/' rel='bookmark' title='Permanent Link: Zend Framework: Zend_Form con ReCaptcha'>Zend Framework: Zend_Form con ReCaptcha</a> <small>Utilizzare il webservice ReCaptcha per validare i form ReCaptcha è...</small></li></ol></p>
<p>Related posts brought to you by <a href='http://mitcho.com/code/yarpp/'>Yet Another Related Posts Plugin</a>.</p>]]></content:encoded>
			<wfw:commentRss>http://razorblade.netsons.org/2008/10/31/zend-framework-gestione-degli-errori-e-404-con-zend_log/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>Componente Zend_Mail ( applicazione reale Zend Framework p.11 )</title>
		<link>http://razorblade.netsons.org/2008/10/07/componente-zend_mail-applicazione-reale-zend-framework-p11/</link>
		<comments>http://razorblade.netsons.org/2008/10/07/componente-zend_mail-applicazione-reale-zend-framework-p11/#comments</comments>
		<pubDate>Tue, 07 Oct 2008 04:29:32 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Php]]></category>
		<category><![CDATA[Zend Framework]]></category>
		<category><![CDATA[applicazione con zend framework]]></category>
		<category><![CDATA[Zend_Mail]]></category>
		<category><![CDATA[Zend_Mail_Transport_Smtp]]></category>
		<category><![CDATA[ZF]]></category>

		<guid isPermaLink="false">http://razorblade.netsons.org/?p=41</guid>
		<description><![CDATA[<h2>Inviare email con Zend_Mail</h2>
<p>In questo articolo parleremo del componente Zend_Mail, illustrando alcune delle sue peculiarità ed implementando nella nostra applicazione di prova un semplicissimo form dei contatti.</p>

<p>Zend_Mail per molti aspetti ricorda molto <b>Php Mailer</b> ( chi non l'ha usato? ) e come questo ci semplifica molto il lavoro quando abbiamo a che vedere con l'invio di email. Con Zend_Mail possiamo scegliere di inviare usando sendmail e il mailserver locale ( che a sua volta utilizza la funzione mail() di Php ) o utilizzando un account SMTP. Se lavorate in locale il mio consiglio è <a href="http://razorblade.netsons.org/2008/10/07/componente-zend_mail-applicazione-reale-zend-framework-p11">[...] Continua</a></p>


Related posts:<ol><li><a href='http://razorblade.netsons.org/2008/11/30/zend-framework-introduzione-al-componente-zend_form/' rel='bookmark' title='Permanent Link: Zend Framework: introduzione al componente Zend_Form'>Zend Framework: introduzione al componente Zend_Form</a> <small>Creare form web con Zend Form Con Zend Framework possiamo...</small></li><li><a href='http://razorblade.netsons.org/2009/02/02/zend-framework-gestione-dei-moduli-ed-esempio-modulo-di-amministrazione/' rel='bookmark' title='Permanent Link: Zend Framework: gestione dei moduli ed esempio modulo di amministrazione'>Zend Framework: gestione dei moduli ed esempio modulo di amministrazione</a> <small>Come usare Zend_Layout per la gestione dei moduli In quest'articolo...</small></li><li><a href='http://razorblade.netsons.org/2008/12/05/zend-framework-zend_form-con-recaptcha/' rel='bookmark' title='Permanent Link: Zend Framework: Zend_Form con ReCaptcha'>Zend Framework: Zend_Form con ReCaptcha</a> <small>Utilizzare il webservice ReCaptcha per validare i form ReCaptcha è...</small></li></ol>

Related posts brought to you by <a href='http://mitcho.com/code/yarpp/'>Yet Another Related Posts Plugin</a>.]]></description>
			<content:encoded><![CDATA[<h2>Inviare email con Zend_Mail</h2>
<p>In questo articolo parleremo del componente Zend_Mail, illustrando alcune delle sue peculiarità ed implementando nella nostra applicazione di prova un semplicissimo form dei contatti.</p>
<p>Zend_Mail per molti aspetti ricorda molto <b>Php Mailer</b> ( chi non l&#8217;ha usato? ) e come questo ci semplifica molto il lavoro quando abbiamo a che vedere con l&#8217;invio di email. Con Zend_Mail possiamo scegliere di inviare usando sendmail e il mailserver locale ( che a sua volta utilizza la funzione mail() di Php ) o utilizzando un account SMTP. Se lavorate in locale il mio consiglio è di utilizzare un account SMTP, personalmente sono riuscito ad inviare in locale utilizzando il mio account su libero.it. Ma vediamo il codice da utilizzarsi per entrambe questi metodi:</p>
<p>Sendmail</p>
<pre name="code" class="php">
  $mail = new Zend_Mail();
  $mail->setFrom('supporto@somewebsite.com', 'Sender');
  $mail->addTo('somename@someothersite.com', 'Receiver');
  $mail->setSubject('Oggetto della email');
  $mail->setBodyText('Corpo della mail.');
  $mail->send();
</pre>
<p>SMTP</p>
<pre name="code" class="php">
  $dati = array(
    'username' => 'myusername',
    'password' => 'mypassword'
  );
  $transport = new Zend_Mail_Transport_Smtp('mail.our-smtp-server.com', $dati);
  Zend_Mail::setDefaultTransport($transport);    

  // Segue stesso codice di sendmail
</pre>
<h2>Implementazione</h2>
<p>Ciò che andremo ad implementare potrebbe essere una buona base per la creazione di un ticket system, creeremo un form con il quale gli utenti potranno contattare il team di supporto. Ogni richiesta sarà salvata sul database, e la tabella che conterrà questi dati è la seguente:</p>
<pre name="code" class="php">
CREATE TABLE `supporto` (
  `id` int(11) unsigned NOT NULL auto_increment,
  `tipo` enum('generale','errore') collate utf8_unicode_ci NOT NULL default 'generale',
  `priorita` smallint(3) NOT NULL,
  `stato` enum('aperto','elaborazione','chiuso') collate utf8_unicode_ci NOT NULL default 'aperto',
  `titolo` varchar(99) collate utf8_unicode_ci NOT NULL,
  `corpo` text collate utf8_unicode_ci NOT NULL,
  `corpo_formattato` text collate utf8_unicode_ci NOT NULL,
  `inserimento_data` datetime NOT NULL,
  `inserimento_user_id` int(11) NOT NULL,
  `inserimento_ip` varchar(15) collate utf8_unicode_ci NOT NULL,
  `modifica_data` timestamp NULL default NULL on update CURRENT_TIMESTAMP,
  `modifica_user_id` int(11) default NULL,
  `modifica_ip` varchar(15) collate utf8_unicode_ci default NULL,
  PRIMARY KEY  (`id`)
) ENGINE=InnoDB  DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci AUTO_INCREMENT=1 ;
</pre>
<p>Un nuovo controller gestirà le richieste di supporto, il controller Supporto:</p>
<pre name="code" class="php">
  class SupportoController extends Zend_Controller_Action
  {
    public function init(){
      // codice per la gestione layout e controllo acl
    }

    public function indexAction(){}

    public function createAction(){
      $filterInt = new Zend_Filter_Int;
      $filterStripTags = new Zend_Filter_StripTags;
      $filterFormat = new Zend_Filter;
      $filterFormat->addFilter(new Zend_Filter_StripTags)
                  ->addFilter(new ThirdParty_Filter_Markdown);

      $support = new Supporto;
      $newSupport = $support->createRow();
      $newSupport->inserimento_user_id = Zend_Auth::getInstance()->getIdentity() !== null ? Zend_Auth::getInstance()->getIdentity()->id : 0;
      $newSupport->tipo = $filterStripTags->filter($this->_getParam('tipo'));
      $newSupport->priorita = $filterInt->filter($this->_getParam('priorita'));
      $newSupport->stato  = $filterStripTags->filter($this->_getParam('stato'));
      $newSupport->titolo = $filterStripTags->filter($this->_getParam('titolo'));
      $newSupport->inserimento_data = date('Y-m-d H:i:s');
      $newSupport->corpo = $filterStripTags->filter($this->_getParam('corpo'));
      $newSupport->corpo_formattato = $filterFormat->filter($this->_getParam('corpo'));
      $id = $newSupport->save();
      $this->_redirect('supporto');
    }
  }
</pre>
<p>La action &#8216;create&#8217; istanzia tutti i filtri necessari al filtraggio dei dati inviati dal form. Uno di questi filtri è <b>Php Markdown</b>, una classe open source che potete scaricare <a href="http://michelf.com/projects/php-markdown/" title="Php Markdown">cliccando qui</a>. Per includere questa classe in Zend Framework creiamo la classe ThirdParty_Filter_Markdown, locata in library/ThirdParty/Filter, dove includeremo anche la classe Markdown, rinominandola MarkdownExtra.php.</p>
<pre name="code" class="php">
  class ThirdParty_Filter_Markdown implements Zend_Filter_Interface
  {
    public function filter($string){
      $parser = new MarkdownExtra_Parser;
      return $parser->transform($string);
    }
  }
</pre>
<p>I dati vengono inseriti nel database dal metodo &#8217;save&#8217; chiamato da una istanza di Zend_Db_Table_Row_Abstract, nel nostra caso il modello Ticket, la classe row level del modello Supporto ( che tra poco vedremo ), istanziata tramite la chiamata del metodo createRow di Supporto. La indexAction non fa nulla, tranne che renderizzare il contenuto del relativo file della vista, index.phtml, ovvero il form che invierà i dati.</p>
<p>script/supporto/<b>index.phtml</b></p>
<pre name="code" class="php">
&lt;div id="supporto"&gt;
  &lt;form action="&lt;?php echo $this-&gt;baseUrl;?&gt;/supporto/create" method="post"&gt;
    &lt;fieldset&gt;
      &lt;legend&gt;Richiesta di supporto&lt;/legend&gt;
      &lt;label for="tipo"&gt;Tipo [*]&lt;/label&gt;&lt;select name="tipo"&gt;&lt;option value="generale"&gt;Generale&lt;/option&gt;&lt;option value="errore"&gt;Errore&lt;/option&gt;&lt;/select&gt;&lt;br /&gt;
      &lt;label for="priorita"&gt;Priorità [*]&lt;/label&gt;&lt;select name="priorita"&gt;&lt;option value="1"&gt;Highest&lt;/option&gt;&lt;option value="2"&gt;High&lt;/option&gt;&lt;option value="3"&gt;Normal&lt;/option&gt;&lt;option value="4"&gt;Low&lt;/option&gt;&lt;option value="5"&gt;Lowest&lt;/option&gt;&lt;/select&gt;&lt;br /&gt;
      &lt;label for="titolo"&gt;Titolo [*]&lt;/label&gt;&lt;input type="text" name="titolo" value="" /&gt;&lt;br /&gt;
      &lt;textarea name="corpo" rows="12" cols="12"&gt;&lt;/textarea&gt;
      &lt;input type="submit" value="Invia" /&gt;
    &lt;/fieldset&gt;
  &lt;/form&gt;
&lt;/div&gt;
</pre>
<h2>I Modelli</h2>
<p>L&#8217;omonimo modello Supporto conterrà la reference map relativa alla tabella utenti e, come già detto, avrà una classe row level chiamata Ticket, dove effettueremo un overload del metodo save in modo tale che, oltre che salvare i dati nel database, si occupi anche di inviare la email.</p>
<p>models/<b>Supporto.php</b></p>
<pre name="code" class="php">
  class Supporto extends Zend_Db_Table_Abstract
  {
    protected $_name = 'supporto';
    protected $_rowClass = 'Ticket';
    protected $_referenceMap = array(
      'Supporto' => array(
        'columns'        => array('inserimento_user_id'),
        'refTableClass'  => 'Utenti',
        'refColumns'     => array('id')
      )
    );
  }
</pre>
<p>models/<b>Ticket.php</b></p>
<pre name="code" class="php">
  class Ticket extends Zend_Db_Table_Row_Abstract
  {
    public function save(){
      parent::save();
      SupportoMailer::send($this);
    }
  }
</pre>
<p>Il metodo save() effettuerà il salvataggio dei dati inviati dal form ed invierà le email, ma il codice di invio sarà incluso in una nuova classe modello che chiameremo SupportoMailer, questo più che altro per agevolare l&#8217;eventuale modifica futura del codice di invio email. L&#8217;argomento passato, $this, è una istanza di Zend_Db_Table_Row_Abstract e conterrà tutti i dati inviati dal form.</p>
<p>models/<b>SupportoMailer.php</b></p>
<pre name="code" class="php">
  class SupportoMailer
  {
    public static function send(Zend_Db_Table_Row_Abstract $Ticket){
      if(Zend_Auth::getInstance()->getIdentity() !== null){
        $utenti = new Utenti();
        $utenti->find(Zend_Auth::getInstance()->getIdentity()->id);
        $submitter = $utenti->current();
      }
      $view = Zend_Layout::getMvcInstance()->getView();
      $authDetails = array(
        'port' => 25,
        'username' => 'myusername',
        'password' => 'mypassword'
      );
      $view->ticket_id = $Ticket->id;
      $view->user_name = isset($submitter) ? $submitter->username : 'Unknown';
      $view->mail_body = $Ticket->corpo_formattato;
      $transport = new Zend_Mail_Transport_Smtp('some.smtp.com',$authDetails);
      Zend_Mail::setDefaultTransport($transport);
      $mail = new Zend_Mail();
      $mail->addHeader('X-Priority', $Ticket->priorita, false);
      //$mail->setBodyText(Zend_Layout::getMvcInstance()->getView()->render('supporto/text-email.phtml'));
      $mail->setBodyHtml($view->render('supporto/html-email.phtml'));
      $mail->setFrom('supporto@somewebsite.com', 'Sender');
      $mail->addTo('somename@someothersite.com', 'Receiver');
      if(isset($submitter)){
        $mail->addCC($submitter->email, $submitter->username);
      }
      $mail->setSubject(strtoupper($Ticket->tipo).': '.$Ticket->titolo);
      $mail->send();
    }
  }
</pre>
<p>SupportoMailer, in questo caso, utilizzerà un account smtp per inviare la mail al destinatario. Già, ma il destinatario una volta ricevuta la mail, cosa visualizzerà? A questa problematica ci viene incontro Zend_View: infatti, come layout della email possiamo utilizzare un view file passandolo come argomento al metodo setBody di Zend_Mail. Possiamo creare diversi layout, per esempio uno che utilizzi la formattazione html ed uno solamente testuale, questa funzionalità che sarebbe utile nel caso della creazione di una newsletter che dia all&#8217;utente la possibilità di scegliere tra l&#8217;una e l&#8217;altra. </p>
<p>script/supporto/<b>html-email.phtml</b></p>
<pre name="code" class="php">
&lt;p&gt;Ciao  &lt;b&gt;&lt;?php echo $this-&gt;user_name; ?&gt;&lt;/b&gt;,&lt;/p&gt; 

&lt;p&gt;Il tuo ticket è il numero &lt;b&gt;&lt;?php echo $this-&gt;ticket_id; ?&gt;&lt;/b&gt;&lt;/p&gt; 

&lt;p&gt;La tua richiesta: &lt;/p&gt; 

&lt;i&gt;&lt;?php echo $this-&gt;mail_body; ?&gt; &lt;/i&gt;

&lt;p&gt;Prenderemo in esame la tua richiesta il prima possibile.&lt;/p&gt; 

&lt;p&gt;Grazie, &lt;/p&gt; 

&lt;p&gt;&lt;b&gt;lo Staff. &lt;/b&gt;&lt;/p&gt;
</pre>
<p>script/supporto/<b>text-email.phtml</b></p>
<pre name="code" class="php">
Ciao &lt;?php echo $this-&gt;user_name; ?&gt;, 

Il tuo ticket è il numero &lt;?php echo $this-&gt;ticket_id; ?&gt;
La tua richiesta: 

&lt;?php echo $this-&gt;mail_body; ?&gt; 

Prenderemo in esame la tua richiesta il prima possibile.

Grazie, 

lo Staff.
</pre>
<p>Tralasciamo volontariamente la creazione del css per la visualizzazione del form che credo nn sia un problema.</p>
<p>Si conclude qui l&#8217;articolo relativo all&#8217;invio di email con Zend_Mail, non tutte le funzionalità sono state viste ( come del resto Sempre succede ), come per esempio l&#8217;aggiunta di allegati. Per ulteriori informazone vi rimando alla <a href="http://framework.zend.com/manual/en/zend.mail.html">documentazione ufficiale</a>.</p>
<div class="ratings">Note: There is a rating embedded within this post, please visit this post to rate it.</div>


<p>Related posts:<ol><li><a href='http://razorblade.netsons.org/2008/11/30/zend-framework-introduzione-al-componente-zend_form/' rel='bookmark' title='Permanent Link: Zend Framework: introduzione al componente Zend_Form'>Zend Framework: introduzione al componente Zend_Form</a> <small>Creare form web con Zend Form Con Zend Framework possiamo...</small></li><li><a href='http://razorblade.netsons.org/2009/02/02/zend-framework-gestione-dei-moduli-ed-esempio-modulo-di-amministrazione/' rel='bookmark' title='Permanent Link: Zend Framework: gestione dei moduli ed esempio modulo di amministrazione'>Zend Framework: gestione dei moduli ed esempio modulo di amministrazione</a> <small>Come usare Zend_Layout per la gestione dei moduli In quest'articolo...</small></li><li><a href='http://razorblade.netsons.org/2008/12/05/zend-framework-zend_form-con-recaptcha/' rel='bookmark' title='Permanent Link: Zend Framework: Zend_Form con ReCaptcha'>Zend Framework: Zend_Form con ReCaptcha</a> <small>Utilizzare il webservice ReCaptcha per validare i form ReCaptcha è...</small></li></ol></p>
<p>Related posts brought to you by <a href='http://mitcho.com/code/yarpp/'>Yet Another Related Posts Plugin</a>.</p>]]></content:encoded>
			<wfw:commentRss>http://razorblade.netsons.org/2008/10/07/componente-zend_mail-applicazione-reale-zend-framework-p11/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Costruire un’applicazione reale con Zend Framework ( parte 8 )</title>
		<link>http://razorblade.netsons.org/2008/09/13/costruire-un%e2%80%99applicazione-reale-con-zend-framework-parte-8/</link>
		<comments>http://razorblade.netsons.org/2008/09/13/costruire-un%e2%80%99applicazione-reale-con-zend-framework-parte-8/#comments</comments>
		<pubDate>Sat, 13 Sep 2008 13:59:11 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Php]]></category>
		<category><![CDATA[Zend Framework]]></category>
		<category><![CDATA[applicazione con zend framework]]></category>
		<category><![CDATA[autenticazione]]></category>
		<category><![CDATA[authAdapter]]></category>
		<category><![CDATA[AuthController]]></category>
		<category><![CDATA[identifyAction]]></category>
		<category><![CDATA[linkTo view helper]]></category>
		<category><![CDATA[LoggedInUser view helper]]></category>
		<category><![CDATA[loginAction]]></category>
		<category><![CDATA[Zend FlashMessenger]]></category>
		<category><![CDATA[zend login]]></category>
		<category><![CDATA[Zend_Filter]]></category>
		<category><![CDATA[Zend_Filter_StringTrim]]></category>
		<category><![CDATA[Zend_Filter_StripTags]]></category>
		<category><![CDATA[ZF]]></category>

		<guid isPermaLink="false">http://razorblade.netsons.org/?p=31</guid>
		<description><![CDATA[<h2>Autenticazione</h2>
<p>L'autenticazione è il processo in cui bisogna capire se qualcuno è realmente chi dice di essere. Per identificare l'individuo, solitamente si usa l'accoppiata username e password. Altri metodi di autenticazione sono esistenti, ad esempio, quando si paga in un negozio con la carta di credito, l'username è sostituito dal possesso materiale della carta di credito, altri metodi potrebbero essere la lettura delle impronte digitali ecc..</p>

<p>In <b>Zend Framework</b> il processo di autenticazione è gestito da un oggetto <a href="http://razorblade.netsons.org/2008/09/13/costruire-un%e2%80%99applicazione-reale-con-zend-framework-parte-8/">[...] Continua</a></p>


Related posts:<ol><li><a href='http://razorblade.netsons.org/2008/11/30/zend-framework-introduzione-al-componente-zend_form/' rel='bookmark' title='Permanent Link: Zend Framework: introduzione al componente Zend_Form'>Zend Framework: introduzione al componente Zend_Form</a> <small>Creare form web con Zend Form Con Zend Framework possiamo...</small></li><li><a href='http://razorblade.netsons.org/2009/02/02/zend-framework-gestione-dei-moduli-ed-esempio-modulo-di-amministrazione/' rel='bookmark' title='Permanent Link: Zend Framework: gestione dei moduli ed esempio modulo di amministrazione'>Zend Framework: gestione dei moduli ed esempio modulo di amministrazione</a> <small>Come usare Zend_Layout per la gestione dei moduli In quest'articolo...</small></li></ol>

Related posts brought to you by <a href='http://mitcho.com/code/yarpp/'>Yet Another Related Posts Plugin</a>.]]></description>
			<content:encoded><![CDATA[<h2>Autenticazione</h2>
<p>L&#8217;autenticazione è il processo in cui bisogna capire se qualcuno è realmente chi dice di essere. Per identificare l&#8217;individuo, solitamente si usa l&#8217;accoppiata username e password. Altri metodi di autenticazione sono esistenti, ad esempio, quando si paga in un negozio con la carta di credito, l&#8217;username è sostituito dal possesso materiale della carta di credito, altri metodi potrebbero essere la lettura delle impronte digitali ecc..</p>
<p>In <b>Zend Framework</b> il processo di autenticazione è gestito da un oggetto, <b>Zend_Auth</b>. In questo articolo, procederemo a creare un nuovo controller, <b>AuthController</b> e la sua rispettiva view, che visualizzerà il form per l&#8217;inserimento di username e password ed eventualmente dei messaggi di errore.</p>
</p>
<p><b>AuthController.php</b></p>
<pre name='code' class='php'>
< ?php

  class AuthController extends Zend_Controller_Action
  {
    public function init(){
      $response = $this->getResponse();
      $response->insert('header', $this->view->render('header.phtml'));
      $response->insert('menu', $this->view->render('menu.phtml'));
      $response->insert('columnLeft', $this->view->render('columnLeft.phtml'));
      $response->insert('columnRight', $this->view->render('columnRight.phtml'));
      $response->insert('footer', $this->view->render('footer.phtml'));
    }

    public function indexAction() {
      $this->_forward('login');
    } 

    public function loginAction() {
      $auth = Zend_Auth::getInstance();
      if ($auth->hasIdentity()) {
        $this->_redirect('/');
      }
      $flashMessenger = $this->_helper->FlashMessenger;
      $flashMessenger->setNamespace('actionErrors');
      $this->view->actionErrors = $flashMessenger->getMessages();
    }

    public function identifyAction(){
      $success = false;
      $message = '';
      if ($this->_request->isPost()){
        $formData = $this->_getFormData();

        if (empty($formData['username']) || empty($formData['password'])){
          $message = 'Please provide a username and password.';
        }else{
          $authAdapter = $this->_getAuthAdapter($formData);
          $auth = Zend_Auth::getInstance();
          $result = $auth->authenticate($authAdapter);
          if($result->isValid()) {
            $data = $authAdapter->getResultRowObject(null,'password');
            $auth->getStorage()->write($data);
            $success = true;
            $redirectUrl = $this->_redirectUrl;
          }else{
            $message = 'Login failed';
          }
        }
      }

      if(!$success){
        $flashMessenger = $this->_helper->FlashMessenger;
        $flashMessenger->setNamespace('actionErrors');
        $flashMessenger->addMessage($message);
        $redirectUrl = '/auth/login';
      }
      $this->_redirect($redirectUrl);
    }

    protected function _getAuthAdapter($formData){
      $dbAdapter = Zend_Registry::get('db');
      $authAdapter = new Zend_Auth_Adapter_DbTable($dbAdapter);
      $authAdapter->setTableName('utenti')
                  ->setIdentityColumn('username')
                  ->setCredentialColumn('password');     

      $config = Zend_Registry::get('config');
      $salt = $config->auth->salt;
      $password = sha1($salt.$formData['password']);   

      $authAdapter->setIdentity($formData['username']);
      $authAdapter->setCredential($password);         

      return $authAdapter;
    }

    protected function _getFormData(){
      $data = array();
      $filterChain = new Zend_Filter;
      $filterChain->addFilter(new Zend_Filter_StripTags);
      $filterChain->addFilter(new Zend_Filter_StringTrim);

      $data['username'] = $filterChain->filter($this->_request->getPost('username'));
      $data['password'] = $filterChain->filter($this->_request->getPost('password'));
      return $data;
    }

    public function logoutAction() {
      $auth = Zend_Auth::getInstance();
      $auth->clearIdentity();
      $this->_redirect('/');
    }
  }
</pre>
<p>Come per l&#8217;<b>IndexController</b> anche questo <b>AuthController</b> contiene il metodo init() utile all&#8217;inserimento nell&#8217;output delle parti comuni del layout (header, footer ecc.. ).</p>
<p>L&#8217;indexAction altro non contiene che una redirezione alla loginAction, in modo tale che entrando nella pagina di autorizzazione senza specificare una action, login venga eseguita. La LoginAction redireziona l&#8217;output nell&#8217;IndexController ( quindi nella homepage ) del sito nel caso in cui l&#8217;utente sia già autorizzato, ovvero nel caso in cui $auth->hasIdentity() ritorni true. Inoltre viene recuperato l&#8217;helper <b>FlashMessenger</b>, che contiene eventuali messaggi salvati da una precedente azione, salvati nella proprietà $this->view->actionErrors, in modo tale da poterli visualizzare nella vista.<br />
Alla loginAction è legata la view login.phtml, il seguente è il codice:</p>
<p><b>login.phtml</b></p>
<pre name="code" class="php">
&lt;h1&gt;Log in&lt;/h1&gt;
&lt;p&gt;Please log in here&lt;/p&gt;
&lt;?php echo isset($this-&gt;actionErrors[0]) &#038;&#038; !empty($this-&gt;actionErrors[0]) ? "&lt;p class='error'&gt;" . $this-&gt;escape($this-&gt;actionErrors[0]) . "&lt;/p&gt;" : ""; ?&gt;

&lt;form method="POST"
        action="&lt;?php echo $this-&gt;LinkTo('auth/identify'); ?&gt;"&gt;
    &lt;div&gt;
        &lt;label&gt;Username&lt;/label&gt;
        &lt;input type="text" name="username" value="" /&gt;
    &lt;/div&gt;
    &lt;div&gt;
        &lt;label&gt;Password&lt;/label&gt;
        &lt;input type="password" name="password" value="" /&gt;
    &lt;/div&gt;
    &lt;div&gt;
        &lt;input type="submit" name="login" value="Login" /&gt;
    &lt;/div&gt;
&lt;/form&gt;
</pre>
<p>L&#8217;unico particolare degno di nota di questo file è l&#8217;attributo action del form. Questo è generato da un view helper, <b>LinkTo</b> che si occupa di creare la corretta url per la identifyAction, recuperando il valore corretto di $baseUrl.</p>
<p><b>LinkTo.php</b></p>
<pre name="code" class="php">
< ?php

  class Zend_View_Helper_LinkTo
  {
    protected static $baseUrl = null; 

    public function linkTo($path){
      if(self::$baseUrl === null){
        $request = Zend_Controller_Front::getInstance()->getRequest();
        $root = '/' . trim($request->getBaseUrl(), '/');
        if ($root == '/'){
          $root = '';
        }
        self::$baseUrl = $root . '/';
      }
      return self::$baseUrl . ltrim($path, '/');
    }
  }
</pre>
<p>Procedendo con le action dell&#8217;AuthController troviamo l&#8217;<b>identifyAction</b>, che controlla l&#8217;esistenza di una richiesta POST, quindi filtra il contenuto dell&#8217;array POST passandolo al metodo <b>_getFormData</b></p>
<p>, che filtra il suo contenuto utilizzando l&#8217;oggetto <b>Zend_Filter</b> e aggiungendo come filtri gli oggetti <b>Zend_Filter_StripTags</b> e <b>Zend_Filter_StringTrim</b>, il cui compito è il medesimo delle funzioni built in del linguaggio <a href="http://it.php.net/manual/it/function.trim.php" target="_blank" title="trim php.net">trim() e </a><a href="http://it.php.net/manual/it/function.strip-tags.php" target="_blank" title="strip_tags php.net">strip_tags</a>.</p>
<p>I dati inviati vengono quindi passati al metodo <b>_getAuthAdapter</b> che si occupa di istanziare  la classe <b>Zend_Auth_Adapter_DbTable</b> a quale passeremo l&#8217;oggetto $db recuperato dal registro ed indicheremo la tabella e i campi in cui dovranno essere verificati l&#8217;username e la password inviate. Per rendere il tutto più sicuro la password, oltre ad essere salvata criptata sul database tramite l&#8217;algoritmo SHA1, è unita ad un salt, una stringa casuale salvata nel nostro file di configurazione, il che rende estremamente difficile, se non impossibile, recuperare il valore della password conoscendo il suo valore criptato e cercando di effettuare un reverse engineering.</p>
</p>
<p>L&#8217;oggetto <b>Zend_Auth_Adapter_DbTable</b> ritornato dal nostro metodo <b>_getAuthAdapter</b> sarà quindi passato a <b>Zend_Auth</b>, che ci confermerà o meno l&#8217;esistenza dell&#8217;utente tramite la chiamata del metodo <b>sValid()</b>. In caso di fallimento l&#8217;output sarà redirezionato alla medesima pagina di autenticazione accompagnata dal messaggio indicante la non riuscita dell&#8217;operazione. In caso di successo, i dati utente recuperati saranno salvati nella sessione, fatta eccezione che per la password.</p>
<h2>Messaggio di benvenuto</h2>
</p>
<p>In ogni sito che si rispetti, una volta autenticati il sistema ci da un messaggio di benvenuto, indicante il nostro nome. Ebbene, anche il nostro sistema godrà di questa caratteristica, utilizzando un nuovo view helper,  <b>LoggedInUser</b>.</p>
<p><b>LoggedInUser</b></p>
<pre name="code" class="php">
< ?php
  class Zend_View_Helper_LoggedInUser {
    protected $_view; 

    function setView($view) {
      $this->_view = $view;
    }

    function loggedInUser(){
      $auth = Zend_Auth::getInstance();
      if($auth->hasIdentity()){
        $logoutUrl = $this->_view->linkTo('auth/logout');
        $user = $auth->getIdentity();
        $username = $this->_view->escape(ucfirst($user->username));
        $string = 'Loggato come ' . $username . ' | <a href="' . $logoutUrl . '">Log out</a>';
      }else{
        $loginUrl = $this->_view->linkTo('auth/login');
        $string = '<a href="'. $loginUrl . '">Log in</a>';
      }
      return $string;
    }
  }
</pre>
<p>La stringa ritornata sarà visualizzata, per esempio, nell&#8217;header.</p>
<p><b>header.phtml</b></p>
<pre name="code" class="php">
<h1>Paesidelmondo Header</h1>
<form action="#">
 <fieldset>
  <legend>Registratione</legend>
  <label for="name">Nome Utente:</label>
<input id="name" name="name" type="text" autocomplete="off" />
 </fieldset>
</form>
<div id="message"></div>

< ?php echo $this->LoggedInUser();?>
</pre>
<p>Con questo si conclude il tutorial all&#8217;<b>autenticazione con Zend Framework</b>. I commenti, aggiunte, correzioni o altro sono sempre graditi.</p>
<div class="ratings">Note: There is a rating embedded within this post, please visit this post to rate it.</div>


<p>Related posts:<ol><li><a href='http://razorblade.netsons.org/2008/11/30/zend-framework-introduzione-al-componente-zend_form/' rel='bookmark' title='Permanent Link: Zend Framework: introduzione al componente Zend_Form'>Zend Framework: introduzione al componente Zend_Form</a> <small>Creare form web con Zend Form Con Zend Framework possiamo...</small></li><li><a href='http://razorblade.netsons.org/2009/02/02/zend-framework-gestione-dei-moduli-ed-esempio-modulo-di-amministrazione/' rel='bookmark' title='Permanent Link: Zend Framework: gestione dei moduli ed esempio modulo di amministrazione'>Zend Framework: gestione dei moduli ed esempio modulo di amministrazione</a> <small>Come usare Zend_Layout per la gestione dei moduli In quest'articolo...</small></li></ol></p>
<p>Related posts brought to you by <a href='http://mitcho.com/code/yarpp/'>Yet Another Related Posts Plugin</a>.</p>]]></content:encoded>
			<wfw:commentRss>http://razorblade.netsons.org/2008/09/13/costruire-un%e2%80%99applicazione-reale-con-zend-framework-parte-8/feed/</wfw:commentRss>
		<slash:comments>13</slash:comments>
		</item>
	</channel>
</rss>
