<?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>Davide Gullo, Consulente web &#187; PHP</title>
	<atom:link href="http://www.m4ss.net/tag/php/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.m4ss.net</link>
	<description>&#34;E il mare il web concederà ad ogni uomo nuove speranze, come il sonno i sogni...&#34; Cristoforo Colombo</description>
	<lastBuildDate>Sat, 28 Jan 2012 18:05:48 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3.1</generator>
<xhtml:meta xmlns:xhtml="http://www.w3.org/1999/xhtml" name="robots" content="noindex" />
		<item>
		<title>Cerca errori di sintassi in un progetto PHP</title>
		<link>http://www.m4ss.net/2010/09/13/errori-sintassi-progetto-php/</link>
		<comments>http://www.m4ss.net/2010/09/13/errori-sintassi-progetto-php/#comments</comments>
		<pubDate>Mon, 13 Sep 2010 13:46:10 +0000</pubDate>
		<dc:creator>Jazzo</dc:creator>
				<category><![CDATA[Development]]></category>
		<category><![CDATA[PHP]]></category>

		<guid isPermaLink="false">http://www.m4ss.net/?p=990</guid>
		<description><![CDATA[<a href="http://www.m4ss.net/2010/09/13/errori-sintassi-progetto-php/"><img align="left" hspace="5" width="150" src="http://static.php.net/www.php.net/images/php.gif" class="alignleft wp-post-image tfe" alt="" title="PHP" /></a>Ho trovato questo simpatico snippet per verificare eventuali errori di sintassi del codice PHP. Lanciate questo comando da riga di comando posizionandovi nella root del vostro progetto: find . \&#40; -name &#34;*.php&#34; -o -name &#34;*.phtml&#34; \&#41; -exec php -l &#123;&#125; \; [via hackix.com] Articoli correlati:svn: Cannot rename file &#8230; entriesGMail: Backup incrementale e Time Machine [...]]]></description>
			<content:encoded><![CDATA[<p><img class="alignnone" title="PHP" src="http://static.php.net/www.php.net/images/php.gif" alt="" width="120" height="67" /></p>
<p>Ho trovato questo simpatico snippet per verificare <strong>eventuali errori di sintassi del codice PHP</strong>.<br />
Lanciate questo comando da riga di comando posizionandovi nella root del vostro progetto:</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;"><span style="color: #c20cb9; font-weight: bold;">find</span> . \<span style="color: #7a0874; font-weight: bold;">&#40;</span> <span style="color: #660033;">-name</span> <span style="color: #ff0000;">&quot;*.php&quot;</span> <span style="color: #660033;">-o</span> <span style="color: #660033;">-name</span> <span style="color: #ff0000;">&quot;*.phtml&quot;</span> \<span style="color: #7a0874; font-weight: bold;">&#41;</span> <span style="color: #660033;">-exec</span> php <span style="color: #660033;">-l</span> <span style="color: #7a0874; font-weight: bold;">&#123;</span><span style="color: #7a0874; font-weight: bold;">&#125;</span> \;</pre></div></div>

<p>[via <a title="finding syntax errors in php project files" href="http://blog.hackix.com/2010/08/finding-syntax-errors-in-your-php-project-files/">hackix.com</a>]</p>
<div id="crp_related"><h2>Articoli correlati:</h2><ul><li><a href="http://www.m4ss.net/2010/05/17/svn-cannot-rename-file-entries-error/" rel="bookmark" class="crp_title">svn: Cannot rename file &#8230; entries</a></li><li><a href="http://www.m4ss.net/2011/02/03/gmail-backup-incrementale-osx-time-machine/" rel="bookmark" class="crp_title">GMail: Backup incrementale e Time Machine su OSX</a></li><li><a href="http://www.m4ss.net/2010/01/30/iphone-developer-program-certificati-sviluppo-distribuzione-app/" rel="bookmark" class="crp_title">iPhone Developer Program, certificati di sviluppo e distribuzione App</a></li><li><a href="http://www.m4ss.net/2011/11/14/connessione-imap-gmail-via-shell-osx/" rel="bookmark" class="crp_title">Connessione IMAP a GMail via shell (OSX)</a></li><li><a href="http://www.m4ss.net/2009/11/03/modbus-e-php/" rel="bookmark" class="crp_title">Modbus e PHP</a></li></ul></div>  ]]></content:encoded>
			<wfw:commentRss>http://www.m4ss.net/2010/09/13/errori-sintassi-progetto-php/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Zend_Validate, traduzione messaggi di errore</title>
		<link>http://www.m4ss.net/2010/05/28/zend_validate-traduzione-messaggi-di-errore/</link>
		<comments>http://www.m4ss.net/2010/05/28/zend_validate-traduzione-messaggi-di-errore/#comments</comments>
		<pubDate>Fri, 28 May 2010 13:41:44 +0000</pubDate>
		<dc:creator>Jazzo</dc:creator>
				<category><![CDATA[Development]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[Zend framework]]></category>

		<guid isPermaLink="false">http://www.m4ss.net/?p=958</guid>
		<description><![CDATA[<a href="http://www.m4ss.net/2010/05/28/zend_validate-traduzione-messaggi-di-errore/"><img align="left" hspace="5" width="150" src="http://www.m4ss.net/wp-content/uploads/2009/08/zend_framework_Logo-150x150.jpg" class="alignleft wp-post-image tfe" alt="" title="Zend Framework Logo" /></a>Come Adapter per Zend_Translate prediligo gettext, con Poedit si lavora molto bene! In fase di deploy di un&#8217;applicazione, dopo aver tradotto i miei file, mi sono accorto che mancavano le traduzioni dei messaggi di errore di Zend_Validate (Alpha, EmailAddress, StringLength, ecc.). Dopo un po&#8217; di ricerche ho scoperto che esiste una directory resources/languages (solo nella [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://www.m4ss.net/wp-content/uploads/2009/08/zend_framework_Logo.jpg"><img class="alignnone size-thumbnail wp-image-594" title="Zend Framework Logo" src="http://www.m4ss.net/wp-content/uploads/2009/08/zend_framework_Logo-150x150.jpg" alt="" width="150" height="150" /></a></p>
<p>Come <a href="http://framework.zend.com/manual/en/zend.translate.adapter.html">Adapter  per Zend_Translate</a> prediligo <a title="gettext" href="http://www.gnu.org/software/gettext/">gettext</a>, con <strong><a title="Poedit" href="http://www.poedit.net/">Poedit</a></strong> si lavora molto bene!</p>
<p>In fase di deploy di un&#8217;applicazione, dopo aver tradotto i miei file, mi sono accorto che mancavano le <strong>traduzioni dei messaggi di errore</strong> di <strong><a title="Zend_Validate" href="http://framework.zend.com/manual/en/zend.validate.html">Zend_Validate</a></strong> (Alpha, EmailAddress, StringLength, ecc.). Dopo un po&#8217; di ricerche ho scoperto che esiste una directory <em>resources/languages</em> (solo nella versione full di ZF) in cui risiedono tutti i file con le traduzioni dei suddetti messaggi di errore.</p>
<p>Il file però presenta le traduzioni in un array e quindi ho dovuto generare un testo da integrare nel file .po<br />
Per fare ciò ho utilizzato queste semplici 2 righe di codice:</p>
<blockquote><p>foreach($myAr AS $en =&gt; $it)<br />
{<br />
echo &#8216;msgid &#8220;&#8216; . $en . &#8220;\&#8221;\n&#8221;;<br />
echo &#8216;msgstr &#8220;&#8216; . $it . &#8220;\&#8221;\n&#8221;;<br />
echo &#8220;\n&#8221;;<br />
}</p></blockquote>
<p>Dove ovviamente $myAr è l&#8217;array che trovate nei vari file di traduzioni (i file si chiamano Zend_Validate.php).<br />
Ho creato così un nuovo Catalogo di Poedit, poi l&#8217;ho aperto con un Editor di testo e ho incollato dentro il risultato visualizzato nel browser dalla suddetta procedura. Aprendolo con Poedit e salvando il gioco è fatto!</p>
<p>Potreste incontrare problemi (a seconda del SO e dell&#8217;Editor che usate) sulla <strong>codifica dei file</strong>. A me, ad esempio, Poedit è andato in errore perchè il file, una volta salvato con l&#8217;Editor, aveva perso la <a title="UTF-8 by Wikipedia" href="http://it.wikipedia.org/wiki/UTF-8">codifica <strong>UTF-8</strong></a>. Per fortuna l&#8217;editor del Mac (TextEdit) permette di scegliere la codifica in fase di salvataggio. Ripristinato l&#8217;UTF-8 tutto è filato liscio.</p>
<p>Esistono diversi metodi comunque per <strong><a title="converting to UTF-8" href="http://docs.moodle.org/en/Converting_files_to_UTF-8#.2Anix_like_computers_.28including_Mac_OS_X.29">convertire la codifica dei file di testo (UTF-8)</a></strong>.</p>
<div id="crp_related"><h2>Articoli correlati:</h2><ul><li><a href="http://www.m4ss.net/2010/02/23/impostare-mysql-sock-in-zend-framework-tramite-file-ini/" rel="bookmark" class="crp_title">Impostare mysql.sock in Zend Framework tramite file .ini</a></li><li><a href="http://www.m4ss.net/2009/08/27/zend-framework-teoria-di-base/" rel="bookmark" class="crp_title">Zend Framework, teoria di base (Componenti)</a></li><li><a href="http://www.m4ss.net/2009/08/26/zend-application-bootstrap/" rel="bookmark" class="crp_title">Zend_Application, bootstrap semplice e flessibile</a></li><li><a href="http://www.m4ss.net/2010/05/26/zend_form-e-problema-col-quote-magic_quotes_gpc/" rel="bookmark" class="crp_title">Zend_Form e problema col quote (magic_quotes_gpc)</a></li><li><a href="http://www.m4ss.net/2010/02/04/caratteri-in-cinese-russo-e-arabo-nel-codice-php-con-eclipse/" rel="bookmark" class="crp_title">Caratteri in cinese, russo e arabo nel codice PHP con Eclipse</a></li></ul></div>  ]]></content:encoded>
			<wfw:commentRss>http://www.m4ss.net/2010/05/28/zend_validate-traduzione-messaggi-di-errore/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Zend_Form e problema col quote (magic_quotes_gpc)</title>
		<link>http://www.m4ss.net/2010/05/26/zend_form-e-problema-col-quote-magic_quotes_gpc/</link>
		<comments>http://www.m4ss.net/2010/05/26/zend_form-e-problema-col-quote-magic_quotes_gpc/#comments</comments>
		<pubDate>Wed, 26 May 2010 09:15:14 +0000</pubDate>
		<dc:creator>Jazzo</dc:creator>
				<category><![CDATA[Development]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[Zend framework]]></category>
		<category><![CDATA[Zend_Form]]></category>

		<guid isPermaLink="false">http://www.m4ss.net/?p=956</guid>
		<description><![CDATA[<a href="http://www.m4ss.net/2010/05/26/zend_form-e-problema-col-quote-magic_quotes_gpc/"><img align="left" hspace="5" width="150" src="http://au.php.net/images/php.gif" class="alignleft wp-post-image tfe" alt="" title="PHP" /></a>E&#8217; da ieri che sbatto la testa su questo problema! Sul mio server di sviluppo tutto ok, nessun problema. In ambiente di produzione invece riscontro un problema col quoting dei campi passati dalle form create con Zend_Form. Appena aggiungo le virgolette (&#8220;) la procedura di salvataggio dati me li quota (\&#8221;) e non capivo il [...]]]></description>
			<content:encoded><![CDATA[<p><img class="alignnone" title="PHP" src="http://au.php.net/images/php.gif" alt="" width="120" height="67" /></p>
<p>E&#8217; da ieri che sbatto la testa su questo problema!<br />
Sul mio server di sviluppo tutto ok, nessun problema. In ambiente di produzione invece riscontro un problema col quoting dei campi passati dalle form create con <a title="Zend_Form ZF" href="http://framework.zend.com/manual/en/zend.form.html">Zend_Form</a>. Appena aggiungo le <strong>virgolette (&#8220;)</strong> la procedura di salvataggio dati me li quota (\&#8221;) e non capivo il perchè!</p>
<p>Il problema sta nell&#8217;impostazione <strong><a title="magic-quotes-gpc PHP" href="http://au.php.net/manual/en/info.configuration.php#ini.magic-quotes-gpc">magic_quotes_gpc</a></strong> del PHP.<br />
Sul server in produzione infatti questo è settato a <strong>On</strong>. Ecco la differenza tra l&#8217;ambiente di sviluppo (su cui è Off, infatti monta PHP 5.3.x) e quello in produzione (PHP 5.2.x). A questo punto le alternative per risolvere il problema sono diverse.</p>
<p>Una soluzione è <a title="Magic Quotes disabling PHP" href="http://php.net/manual/en/security.magicquotes.disabling.php">disabilitare tale impostazione via file .htaccess</a> inserendo in questo file la riga:</p>
<p><strong>php_flag magic_quotes_gpc Off</strong></p>
<p>In alternativa, ove questo non sia possibile, consiglio l&#8217;utilizzo dell&#8217;ottimo <a title="Zend Framework Forms and magic_quotes_gpc" href="http://blog.philipbrown.id.au/2008/10/zend-framework-forms-and-magic_quotes_gpc/">Filter_StripSlashes creato e descritto da Phil Brown</a>.</p>
<div id="crp_related"><h2>Articoli correlati:</h2><ul><li><a href="http://www.m4ss.net/2010/02/23/impostare-mysql-sock-in-zend-framework-tramite-file-ini/" rel="bookmark" class="crp_title">Impostare mysql.sock in Zend Framework tramite file .ini</a></li><li><a href="http://www.m4ss.net/2011/03/31/wordpress-problema-installazione-informazioni-connessioni-ftp/" rel="bookmark" class="crp_title">WordPress, risolvere problema Informazioni Connessioni FTP</a></li><li><a href="http://www.m4ss.net/2010/12/17/zendx-jquery-addonload-layout-disabilitato/" rel="bookmark" class="crp_title">ZendX_JQuery e metodo addOnLoad con layout disabilitato</a></li><li><a href="http://www.m4ss.net/2009/08/27/zend-framework-teoria-di-base/" rel="bookmark" class="crp_title">Zend Framework, teoria di base (Componenti)</a></li><li><a href="http://www.m4ss.net/2010/09/07/ottimizzazione-url-seo-con-zend-framework/" rel="bookmark" class="crp_title">Ottimizzazione URL (SEO) con Zend Framework</a></li></ul></div>  ]]></content:encoded>
			<wfw:commentRss>http://www.m4ss.net/2010/05/26/zend_form-e-problema-col-quote-magic_quotes_gpc/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Caratteri in cinese, russo e arabo nel codice PHP con Eclipse</title>
		<link>http://www.m4ss.net/2010/02/04/caratteri-in-cinese-russo-e-arabo-nel-codice-php-con-eclipse/</link>
		<comments>http://www.m4ss.net/2010/02/04/caratteri-in-cinese-russo-e-arabo-nel-codice-php-con-eclipse/#comments</comments>
		<pubDate>Thu, 04 Feb 2010 16:08:09 +0000</pubDate>
		<dc:creator>Jazzo</dc:creator>
				<category><![CDATA[Development]]></category>
		<category><![CDATA[html]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[utf8]]></category>

		<guid isPermaLink="false">http://www.m4ss.net/?p=878</guid>
		<description><![CDATA[<a href="http://www.m4ss.net/2010/02/04/caratteri-in-cinese-russo-e-arabo-nel-codice-php-con-eclipse/"><img align="left" hspace="5" width="150" height="150" src="http://www.m4ss.net/wp-content/uploads/2010/02/eclipse-error_charset-utf8-150x150.png" class="alignleft wp-post-image tfe" alt="" title="eclipse-error_charset-utf8" /></a>Che oggi la codifica Unicode (UTF8) risolva una marea di problemi sull&#8217;utilizzo delle diverse lingue è risaputo. Se impostate un sito con questa codifica è tutto più semplice. Oggi però avevo necessità di scrivere alcuni caratteri direttamente nel codice tramite l&#8217;editor Eclipse. Scriverlo lo scriveva ma quando provavo a salvare mi dava questo errore: Per [...]]]></description>
			<content:encoded><![CDATA[<p>Che oggi la <strong>codifica</strong> <a title="Unicode by Wikipedia" href="http://it.wikipedia.org/wiki/Unicode"><strong>Unicode</strong> (UTF8)</a> risolva una marea di problemi sull&#8217;<strong>utilizzo delle diverse lingue</strong> è risaputo. Se impostate un sito con questa codifica è tutto più semplice.</p>
<p>Oggi però avevo necessità di scrivere alcuni caratteri direttamente nel codice tramite l&#8217;editor <strong><a title="Eclipse IDE" href="http://www.eclipse.org/">Eclipse</a></strong>. Scriverlo lo scriveva ma quando provavo a salvare mi dava questo errore:</p>
<p><img class="alignnone size-full wp-image-879" title="eclipse-error_charset-utf8" src="http://www.m4ss.net/wp-content/uploads/2010/02/eclipse-error_charset-utf8.png" alt="" width="544" height="194" /></p>
<p>Per risolvere basta cambiare la codifica del file in uso.<br />
Dal menù <strong>Edit -&gt; Set Encoding&#8230;</strong><br />
Si apre questa finestra (vedi sotto), selezionate Other e poi <strong>UTF-8</strong>.</p>
<p><img class="alignnone size-full wp-image-880" title="eclipse-set-encoding-utf8" src="http://www.m4ss.net/wp-content/uploads/2010/02/eclipse-set-encoding-utf8.png" alt="" width="359" height="181" /></p>
<p><strong>Il &#8220;problema&#8221; è risolto!</strong></p>
<div id="crp_related"><h2>Articoli correlati:</h2><ul><li><a href="http://www.m4ss.net/2010/05/17/svn-cannot-rename-file-entries-error/" rel="bookmark" class="crp_title">svn: Cannot rename file &#8230; entries</a></li><li><a href="http://www.m4ss.net/2010/05/28/zend_validate-traduzione-messaggi-di-errore/" rel="bookmark" class="crp_title">Zend_Validate, traduzione messaggi di errore</a></li><li><a href="http://www.m4ss.net/2011/04/05/caldaie-immergas-ottimo-servizio-di-assistenza-tecnica-ricambi/" rel="bookmark" class="crp_title">Caldaie Immergas, ottimo servizio di Assistenza tecnica</a></li><li><a href="http://www.m4ss.net/2010/05/12/payment-gateway-del-consorzio-triveneto-aggiornamento-1-3/" rel="bookmark" class="crp_title">Payment Gateway del Consorzio Triveneto (Aggiornamento 1.3)</a></li><li><a href="http://www.m4ss.net/2011/03/31/wordpress-problema-installazione-informazioni-connessioni-ftp/" rel="bookmark" class="crp_title">WordPress, risolvere problema Informazioni Connessioni FTP</a></li></ul></div>  ]]></content:encoded>
			<wfw:commentRss>http://www.m4ss.net/2010/02/04/caratteri-in-cinese-russo-e-arabo-nel-codice-php-con-eclipse/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Conversione da Binary 32 bit a Float IEEE754 in PHP</title>
		<link>http://www.m4ss.net/2009/11/19/conversione-binary-32-bit-float-ieee754-php/</link>
		<comments>http://www.m4ss.net/2009/11/19/conversione-binary-32-bit-float-ieee754-php/#comments</comments>
		<pubDate>Thu, 19 Nov 2009 15:59:28 +0000</pubDate>
		<dc:creator>Jazzo</dc:creator>
				<category><![CDATA[Development]]></category>
		<category><![CDATA[PHP]]></category>

		<guid isPermaLink="false">http://www.m4ss.net/?p=801</guid>
		<description><![CDATA[<a href="http://www.m4ss.net/2009/11/19/conversione-binary-32-bit-float-ieee754-php/"><img align="left" hspace="5" width="150" src="http://www.m4ss.net/wp-content/uploads/2009/11/bit_byte.JPG" class="alignleft wp-post-image tfe" alt="bit byte" title="" /></a>Non è stato semplice saltarci fuori, per una serie di motivi. La conversione di un numero binario (o esadecimale) ad un numero in virgola mobile non l&#8217;avevo mai affrontato perchè in PHP, solitamente, si lavora con numeri &#8220;definitivi&#8221; (integer, float, ecc). Tale conversione può dipendere da diversi fattori. Per prima cosa ho dovuto studiarmi un [...]]]></description>
			<content:encoded><![CDATA[<p><img class="alignnone size-full wp-image-802" src="http://www.m4ss.net/wp-content/uploads/2009/11/bit_byte.JPG" alt="bit byte" width="319" height="182" /></p>
<p>Non è stato semplice saltarci fuori, per una serie di motivi. La conversione di un numero <strong>binario</strong> (o <strong>esadecimale</strong>) ad un numero in <strong>virgola mobile</strong> non l&#8217;avevo mai affrontato perchè in PHP, solitamente, si lavora con numeri &#8220;definitivi&#8221; (integer, float, ecc). Tale conversione può dipendere da diversi fattori.</p>
<p>Per prima cosa ho dovuto studiarmi un pò lo standard <strong><a title="Standard IEEE 754 by Wikipedia" href="http://it.wikipedia.org/wiki/IEEE_754">IEEE 754</a></strong>, in particolare i <strong>numeri a precisione singola</strong> (32 bit). Su Wikipedia è <a title="Numeri a precisione singola 32 bit - Wikipedia" href="http://it.wikipedia.org/wiki/IEEE_754#Numeri_a_precisione_singola_.2832_bit.29">spiegato molto bene</a> il metodo con cui effettuare la trasformazione (esponente, mantissa, ecc). Devo ammettere che prima di trovare il codice &#8220;giusto&#8221; mi sono imbattuto in diverse librerie che non davano l&#8217;esito atteso. Alla fine ho trovato una semplice funzione sul sito PHP nella pagina dedicata al <a href="http://www.php.net/manual/en/language.types.float.php">Floating point numbers</a>. Leggendo un po&#8217; di commenti ho trovato l&#8217;ottimo <a title="Floating point numbers - PHP Comment" href="http://www.php.net/manual/en/language.types.float.php#88849">intervento di <strong>info at forrest79 dot net</strong></a>.</p>
<p>Riporto qui di seguito la <strong>funzione</strong> completa:</p>
<p><code>function binToFloat($bin) {<br />
if(strlen($bin) &gt; 32) {<br />
return false;<br />
} else if(strlen($bin) &lt; 32) {<br />
$bin = str_repeat('0', (32 - strlen($bin))) . $bin;<br />
}<br />
$sign = 1;<br />
if(intval($bin[0]) == 1) {<br />
$sign = -1;<br />
}<br />
$binExponent = substr($bin, 1, 8);<br />
$exponent = -127;<br />
for($i = 0; $i &lt; 8; $i++) {<br />
$exponent += (intval($binExponent[7 - $i]) * pow(2, $i));<br />
}<br />
$binBase = substr($bin, 9);<br />
$base = 1.0;<br />
for($x = 0; $x &lt; 23; $x++) {<br />
$base += (intval($binBase[$x]) * pow(0.5, ($x + 1)));<br />
}<br />
$float = (float) $sign * pow(2, $exponent) * $base;<br />
return $float;<br />
}</code></p>
<p>Per testare il tutto dovreste poter effettuare la seguente conversione:</p>
<p><strong>Bin</strong>: 1000011100010111110001111010101<br />
(Bin Corretto: 01000011100010111110001111010101)<br />
<strong>Float</strong>: 279.77993774414</p>
<blockquote><p><strong>N.B.:</strong> Come potete vedere la funzione aggiunge il primo bit (0) nel caso in cui l&#8217;intero binario sia composto da 31 bit e non 32.</p></blockquote>
<div id="crp_related"><h2>Articoli correlati:</h2><ul><li><a href="http://www.m4ss.net/2009/11/17/tutorial-multilingua-consorzio-triveneto-payment-gateway-tutorial/" rel="bookmark" class="crp_title">Tutorial per uso multilingua del Payment Gateway del Consorzio Triveneto</a></li><li><a href="http://www.m4ss.net/2006/09/02/ajax-xajax-smarty-e-php/" rel="bookmark" class="crp_title">Ajax (xAjax), Smarty e PHP</a></li><li><a href="http://www.m4ss.net/2010/09/07/ottimizzazione-url-seo-con-zend-framework/" rel="bookmark" class="crp_title">Ottimizzazione URL (SEO) con Zend Framework</a></li><li><a href="http://www.m4ss.net/2004/12/30/oracle-da-php/" rel="bookmark" class="crp_title">Oracle da PHP</a></li><li><a href="http://www.m4ss.net/2007/03/07/wordpress-21-qualche-problema-sullaggiornamento/" rel="bookmark" class="crp_title">WordPress 2.1 : qualche problema sull&#8217;aggiornamento</a></li></ul></div>  ]]></content:encoded>
			<wfw:commentRss>http://www.m4ss.net/2009/11/19/conversione-binary-32-bit-float-ieee754-php/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Modbus e PHP</title>
		<link>http://www.m4ss.net/2009/11/03/modbus-e-php/</link>
		<comments>http://www.m4ss.net/2009/11/03/modbus-e-php/#comments</comments>
		<pubDate>Tue, 03 Nov 2009 17:15:48 +0000</pubDate>
		<dc:creator>Jazzo</dc:creator>
				<category><![CDATA[Development]]></category>
		<category><![CDATA[modbus]]></category>
		<category><![CDATA[PHP]]></category>

		<guid isPermaLink="false">http://www.m4ss.net/?p=759</guid>
		<description><![CDATA[<a href="http://www.m4ss.net/2009/11/03/modbus-e-php/"><img align="left" hspace="5" width="150" height="150" src="http://www.m4ss.net/wp-content/plugins/thumbnail-for-excerpts/tfe_no_thumb.png" class="alignleft wp-post-image tfe" alt="" title="" /></a>Sono alle prese da diversi giorni con un problema da risolvere per un nuovo progetto che porterò avanti nei prossimi mesi. Dopo aver sbattuto un po&#8217; la testa sul Modbus, il protocollo di comunicazione dei PLC, sono alla ricerca di una soluzione che mi permetta di effettuare chiamate ad uno slave da ambiente PHP. Il [...]]]></description>
			<content:encoded><![CDATA[<p>Sono alle prese da diversi giorni con un problema da risolvere per un nuovo progetto che porterò avanti nei prossimi mesi. Dopo aver sbattuto un po&#8217; la testa sul <a title="Modbus by Wikipedia" href="http://it.wikipedia.org/wiki/Modbus">Modbus</a>, il protocollo di comunicazione dei <a title="PLC by Wikipedia" href="http://it.wikipedia.org/wiki/Programmable_logic_controller">PLC</a>, sono alla ricerca di una soluzione che mi permetta di <strong>effettuare chiamate ad uno slave</strong> da <strong>ambiente PHP</strong>. Il risultato della chiamata Modbus quindi deve essere disponibile direttamente nel codice PHP.</p>
<p>Le <a title="Modbus software by SourceForge" href="http://sourceforge.net/search/?words=modbus&amp;type_of_search=soft&amp;pmode=0&amp;limit=50">diverse soluzioni</a> che sto analizzando sono:</p>
<ol>
<li>Scrivere un&#8217;<strong><a title="Scrivere un estensione PHP - HTML.it" href="http://php.html.it/guide/lezione/2312/extskel-generare-lo-scheletro-dellestensione/">estensione per PHP</a></strong> che, grazie ad una libreria <a title="Libmodbus - Project Sourceforge" href="http://sourceforge.net/projects/libmodbus/">Libmodbus</a>, possa effettuare chiamate direttamente dal codice PHP</li>
<li>Utilizzare un <a title="MODBUS/TCP to MODBUS/RTU gateway - Sourceforge" href="http://sourceforge.net/projects/mbus/"><strong>Gateway Modbus</strong> TCP/IP- RTU</a>. In pratica dal codice PHP potrei effettuare una chiamata al gateway tramite socket. Il gateway a sua volta gestirebbe la chiamata al device via Modbus e restituirebbe i dati alla mia procedura PHP.</li>
<li>Utilizzare un software open source tipo <strong><a title="SCADA by Wikipedia" href="http://it.wikipedia.org/wiki/SCADA">SCADA</a></strong>. Ad esempio <a title="likindoy - Scada system" href="http://www.likindoy.org/">Likindoy</a> o <a title="OpenSCADA" href="http://www.oscada.org/">OpenSCADA</a>.</li>
</ol>
<p>La soluzione migliore, in termini di sviluppo, come sempre deve essere la più semplice da implementare e manutenere. Al momento sono orientato sulla 1, la 2 ho problemi a compilarla e la 3 l&#8217;ho parcheggiata in attesa di testarla.<br />
Vi farò sapere&#8230;</p>
<h2>Aggiornamento del 03/01/2011</h2>
<p>Avendo ricevuto richieste di maggiori dettagli sull&#8217;estensione ho deciso di rilasciarla sotto <a href="http://www.gnu.org/licenses/gpl-2.0.html">licenza GPL v2</a>, si sa mai che qualche altro sviluppatore si unisca al progetto per migliorarla.</p>
<p>Al momento l&#8217;estensione PHP implementa solo una parte delle funzioni Modbus esistenti:</p>
<ul>
<li><strong>Read holding registers</strong> (func. 03)</li>
<li><strong>Read input registers</strong> (func. 04)</li>
<li><strong>Write</strong> (func. 16, sviluppo terminato ma non testato)</li>
</ul>
<p>Il tutto è implementato secondo il formato RTU.</p>
<p>Link al progetto: <a href="https://code.google.com/p/php-extension-modbus/"><strong>Estensione PHP per Modbus</strong></a></p>
<div id="crp_related"><h2>Articoli correlati:</h2><ul><li><a href="http://www.m4ss.net/2010/05/12/payment-gateway-del-consorzio-triveneto-aggiornamento-1-3/" rel="bookmark" class="crp_title">Payment Gateway del Consorzio Triveneto (Aggiornamento 1.3)</a></li><li><a href="http://www.m4ss.net/2011/11/02/xt-commerce-plugin-payment-gateway-consorzio-triveneto/" rel="bookmark" class="crp_title">XT:Commerce, plugin Payment Gateway Consorzio Triveneto</a></li><li><a href="http://www.m4ss.net/2009/03/17/jaiku-micro-blogging-diventa-open-source-google-app/" rel="bookmark" class="crp_title">Jaiku (micro-blogging) diventa Open Source (Google App)</a></li><li><a href="http://www.m4ss.net/2009/10/01/consorzio-triveneto-payment-gateway-tutorial/" rel="bookmark" class="crp_title">Tutorial per il Payment Gateway del Consorzio Triveneto SpA</a></li><li><a href="http://www.m4ss.net/2004/12/30/oracle-da-php/" rel="bookmark" class="crp_title">Oracle da PHP</a></li></ul></div>  ]]></content:encoded>
			<wfw:commentRss>http://www.m4ss.net/2009/11/03/modbus-e-php/feed/</wfw:commentRss>
		<slash:comments>12</slash:comments>
		</item>
		<item>
		<title>Tutorial per il Payment Gateway del Consorzio Triveneto SpA</title>
		<link>http://www.m4ss.net/2009/10/01/consorzio-triveneto-payment-gateway-tutorial/</link>
		<comments>http://www.m4ss.net/2009/10/01/consorzio-triveneto-payment-gateway-tutorial/#comments</comments>
		<pubDate>Thu, 01 Oct 2009 13:37:58 +0000</pubDate>
		<dc:creator>Jazzo</dc:creator>
				<category><![CDATA[Development]]></category>
		<category><![CDATA[payment gateway]]></category>
		<category><![CDATA[PHP]]></category>

		<guid isPermaLink="false">http://www.m4ss.net/?p=716</guid>
		<description><![CDATA[<a href="http://www.m4ss.net/2009/10/01/consorzio-triveneto-payment-gateway-tutorial/"><img align="left" hspace="5" width="150" src="http://www.m4ss.net/wp-content/uploads/2009/09/e-commerce-payment-gateway.jpg" class="alignleft wp-post-image tfe" alt="e-commerce payment gateway" title="" /></a>Lo sviluppo di un&#8217;applicativo e-commerce B2B per un cliente mi ha portato ad analizzare a fondo il Payment Gateway del Consorzio Triveneto S.p.A. Prima di iniziare mi complimento con il consorzio per aver redatto una documentazione molto precisa. Lo stesso gateway lo trovo veramente ben fatto ma su questo potrò darvi maggiori dettagli tra qualche [...]]]></description>
			<content:encoded><![CDATA[<p><img class="alignnone size-full wp-image-717" src="http://www.m4ss.net/wp-content/uploads/2009/09/e-commerce-payment-gateway.jpg" alt="e-commerce payment gateway" width="233" height="122" /></p>
<p>Lo sviluppo di un&#8217;<strong>applicativo e-commerce B2B</strong> per un cliente mi ha portato ad analizzare a fondo il <a title="Payment Gateway del Consorzio Triveneto SpA" href="http://www.constriv.it/index.php?option=com_content&amp;task=view&amp;id=68&amp;Itemid=114"><strong>Payment Gateway</strong> del Consorzio Triveneto S.p.A.</a> Prima di iniziare mi complimento con il consorzio per aver redatto una documentazione molto precisa. Lo stesso gateway lo trovo veramente ben fatto ma su questo potrò darvi maggiori dettagli tra qualche mese, quando il cliente sarà in produzione.</p>
<h2>Introduzione</h2>
<p>In un&#8217;applicativo web-based di <strong>e-commerce</strong> solitamente le figure (sarebbe meglio parlare di macchine, PC, server, ecc.) con cui abbiamo a che fare sono tre:</p>
<ol>
<li>L&#8217;utente che acquista e che naviga il sito (definito <strong>Cardholder</strong>)</li>
<li>Il negozio online: il server del sito di e-commerce (definito <strong>Merchant</strong>)</li>
<li>Il Gateway per i pagamenti, in parole povere: il server che si occupa delle transazioni con carta di credito (denifito <strong>Payment Gateway</strong>, qui di seguito <strong>Gateway</strong>)</li>
</ol>
<p>Dal punto di vista pratico quindi avremo il Cardholder che naviga il sito del Merchant ed esegue le sue operazioni di acquisto (ordini, carrello, ecc.). Una volta terminata la sessione di acquisti si dirige alla pagina del pagamento e qui entra in azione tutto quello che vedremo in questo <strong>Tutorial</strong>.</p>
<p>L&#8217;intero processo prevede comunicazioni tra le tre figure sopra elencate. Le comunicazioni tra Merchant e Gateway possono essere definite <strong>server-to-server</strong>, l&#8217;utente infatti non sempre interagisce con esse. I server si scambiano messaggi tra loro per ovvi <strong>motivi di sicurezza</strong>.</p>
<p>Sulla pagina del Merchant quindi deve essere predisposta una pagina che si occupa di inviare i dati (codice identificativo, importo da pagare, numero ordine, ecc.) al Gateway. Quando il Cardholder clicca sul famoso &#8220;<em>Paga ora!</em>&#8221; tali dati vengono inviati al server del Gateway che, dopo averli elaborati e controllati, restituisce una risposta al server del Merchant. In questo frangente il Cardholder resta in attesa davanti al pc!<br />
Una volta ricevuta la risposta dal Gateway la nostra procedura (Merchant) elabora i dati ricevuti e decide se proseguire o meno. In caso di errori potrebbe visualizzare una pagina al Cardholder perchè qualcosa è andato storto, in caso sia tutto ok invece potrebbe direttamente <strong>redirezionare il Cardholder</strong> verso la <strong>HPP</strong> (<strong>pagina del Gateway</strong> su cui l&#8217;utente inserisce i dati della sua carta di credito).<br />
Questa prima transazione (e relativo scambio di messaggi), nel modello predisposto dal Consorzio Triveneto, prende il nome di <strong>PaymentInit</strong>.</p>
<p>Il nostro utente (Cardholder) quindi, se i dati passati al Gateway sono congrui, viene redirezionato sulla HPP dove potrà <strong>inserire i dati della sua carta di credito</strong>. L&#8217;utente effettua quindi l&#8217;operazione compilando tutti i campi e poi dà l&#8217;invio.<br />
Qui scattano nuovamente diverse comunicazioni prima di restituire l&#8217;esito al Cardholder.<br />
Per prima cosa il Gateway deve interfacciarsi a sua volta ad altri server, quelli del <strong>Centro autorizzativo</strong>, e verificare la validità della carta, la disponibilità e quant&#8217;altro. Eseguita questa operazione ricontatta il Merchant riportando l&#8217;esito dell&#8217;operazione che, anche questa volta, può essere positivo o negativo. In base all&#8217;esito il server del Merchant restituisce un <strong>URL verso cui redirezionare il Cardholder</strong>. Il Gateway quindi si occupa poi di redirezionare il Cardholder sulla pagina dell&#8217;esito.<br />
Questa seconda transazione (e relativo scambio di messaggi), nel modello predisposto dal Consorzio Triveneto, prende il nome di <strong>NotificationMessage</strong>.</p>
<p>Ora passiamo alla pratica, successivamente vedremo perchè il NotificationMessage è così importante dal punto di vista della sicurezza.</p>
<h2>La Classe PgConsTriv</h2>
<p>Ho implementato questa classe e l&#8217;ho rilasciata sotto licenza <strong>GNU Lesser General Public License</strong> su <a title="Payment Gateway del Consorzio Triveneto PHP Class - SourceForge" href="https://sourceforge.net/projects/pg-constriv">SourceForge</a>.<br />
Questa la pagina che ho predisposto per la <a title="Consorzio Triveneto Payment Gateway (php Class)" href="http://www.m4ss.net/os-open-source/payment-gateway-consorzio-triveneto-php-class/">documentazione tecnica per la classe <strong>PgConsTriv</strong></a> e qui link per il <a title="Payment Gateway del Consorzio Triveneto PHP Class - SourceForge" href="http://sourceforge.net/projects/pg-constriv/"><strong>download</strong></a> dell&#8217;<strong>ultima release</strong> (PgConsTriv.zip).<br />
Insieme alla classe trovate una cartella <em>example</em>, in cui risiedono i file di esempio che vedremo insieme in questo <strong>Tutorial</strong>, e il file di configurazione. In dettaglio:</p>
<ul>
<li><em>PgConsTriv.php</em> (classe)</li>
<li><em>PgConsTriv.inc.php</em> (file di configurazione)</li>
<li>example/
<ul>
<li><em>paynow.php</em><br />
Pagina per predisposizione e invio del <strong>PaymentInit</strong></li>
<li><em>responseURL.php</em><br />
Pagina per ricezione ed elaborazione del <strong>NotificationMessage</strong></li>
<li><em>errorURL.php</em><br />
Pagina per esito negativo</li>
<li><em>goodURL.php</em><br />
Pagina per esito positivo</li>
<li><em>test_PG.php</em><br />
Form che invia POST per testare la pagina del Response URL</li>
</ul>
</li>
</ul>
<p>Prima di iniziare dovete <a title="Consorzio Triveneto Payment Gateway (php Class) - Configurazione parametri" href="http://www.m4ss.net/os-open-source/payment-gateway-consorzio-triveneto-php-class/#classe_documentazione"><strong>configurare</strong> i parametri della classe</a> presenti nel file <em>PgConsTriv.inc.php</em></p>
<h2>Il PaymentInit e l&#8217;inizio della transazione</h2>
<p>Come dicevamo sopra, tutto ha inizio con l&#8217;invio da parte del Merchant del PaymentInit. Da questo riceveremo una prima risposta che ci fornirà:</p>
<ul>
<li>In caso di <strong>esito positivo</strong>: l&#8217;indirizzo verso cui redirezionare il Cardholder e il <strong>PaymentID</strong></li>
<li>In caso di <strong>esito negativo</strong>: una stringa con <strong>!ERROR!</strong> e relativa descrizione</li>
</ul>
<p>Analizziamo ora il file <strong><em>paynow.php</em></strong> in dettaglio.</p>
<blockquote><p><strong>N.B.:</strong> Preferisco creare una pagina separata alla quale passo via GET l&#8217;id dell&#8217;ordine. Tramite questo recupero dal database tutti i dati necessari dell&#8217;ordine e avvio la procedura. In questo modo si ha una <strong>maggiore sicurezza</strong> perchè se, ad esempio, invio tutti i dati via POST o GET direttamente alla pagina l&#8217;utente &#8220;furbetto&#8221; potrebbe intercettarli e variarli.</p></blockquote>
<p>Al <em>paynow.php</em> quindi arriva il mio id ordine ($idp), poi recupero i dati dal database e li sistemo in un array ($arRp).<br />
A questo punto verifico i dati e decido se procedere o meno:</p>
<p><code>// VERIFICO se può accedere all'ordine<br />
if( count($arRp) &gt; 0 &amp;&amp;<br />
$idp &gt; 0 &amp;&amp;<br />
isset($arRp["stato"]) &amp;&amp;<br />
($arRp["stato"] == "NEW" || $arRp["stato"] == "PAYMENT_INIT" )<br />
) {</code></p>
<blockquote><p><strong>N.B.:</strong> Nel mio ordine gestisco un campo <strong>stato</strong>. E&#8217; lo stesso che poi andrò ad aggiornare tramite risposte del server del Gateway in base ai vari esiti e passaggi. In questo modo avrò sempre sotto controllo l&#8217;andamento dell&#8217;ordine.<br />
Qui sopra, infatti, verifico che lo stato sia consono a ciò che sto per effettuare: il PaymentInit. Il mio ordine quindi deve essere o in stato Nuovo (NEW) o in PaymentInit. Questo secondo caso lo lascio passare perchè ipotizzo la situazione in cui l&#8217;utente clicca su &#8220;Paga ora!&#8221; e, dopo aver visualizzato la HPP del Gateway, chiude il browser.</p></blockquote>
<p>A questo punto siamo pronti per inviare il PaymentInit che altro non è che l&#8217;invio di una serie di <strong>dati via POST</strong> ad un indirizzo specifico. Creando un&#8217;istanza della classe andremo ad inserire i soli dati che potranno variare da ordine ad ordine mentre tutti gli altri dati saranno gestiti dalla classe stessa.<br />
Vediamo ora l&#8217;istanza della classe e la preparazione del PaymentInit con l&#8217;invio dei dati al Gateway.</p>
<p><code>// init </code><code>PgConsTriv </code><code>Class<br />
$pg = new <strong>PgConsTriv</strong>($lng);<br />
$pg-&gt;setAction('Purchase');<br />
$pg-&gt;<strong>setSecurityCode_PI</strong>( $secCode );<br />
$pg-&gt;<strong>sendVal_PI</strong>($importo, $idp);</code></p>
<p>Per istanziare la classe devo passare il parametro della <strong>lingua</strong> ($lng). Tale parametro è opzionale e nel caso non venga passato la classe utilizzerà la lingua di default settata nel file di configurazione. Per maggiori dettagli leggi il <a title="PgConsTriv Class multi lingua" href="http://www.m4ss.net/2009/11/17/tutorial-multilingua-consorzio-triveneto-payment-gateway-tutorial/">Tutorial multi lingua</a>.<br />
Il metodo <em>setAction</em> imposta l&#8217;Action. <strong>Purchase</strong> si occupa di eseguire direttamente l&#8217;accredito dell&#8217;importo (vedi documentazione del Gateway, Appendice A).</p>
<p>Veniamo ora al discorso sicurezza e il parametro <strong>SecurityCode</strong>.</p>
<blockquote><p>N.B.: Nella documentazione del Consorzio (pag. 23) si raccomanda di verificare sempre l&#8217;autenticità del NotificationMessage. Una delle soluzioni proposte è quella di inviare via PaymentInit un valore che il Cardholder non vede e non può conoscere. Lo stesso valore verrà poi restituito al Merchant successivamente attraverso il NotificationMessage. In questo modo potremo verificare il dato ricostruendolo e confrontandolo con quello passato dal NotificationMessage.</p></blockquote>
<p>Impostiamo quindi il nostro SecurityCode (<em>$secCode</em>). Per generare un codice univoco potreste crearvi una stringa criptando in md5 alcuni dati presenti nel database (es: data ordine, idordine, importo, ecc.). In questo modo, successivamente, all&#8217;arrivo del NotificationMessage sarete in grado di ricostruirla con la stessa logica e verificarla con quella che vi verrà passata dal Gateway.</p>
<p>A questo punto punto siamo pronti per <strong>inviare il PaymentInit</strong>. Il metodo <em>sendVal_PI</em> riceve 2 valori:</p>
<ul>
<li>$importo &#8211; Importo della transazione</li>
<li>$idp &#8211; Denominato trackid nella Documentazione del Gateway e deve essere un id univoco dell&#8217;ordine</li>
</ul>
<p>Il metodo <em>sendVal_PI</em> invia i dati al Gateway e ne elabora la risposta.<br />
Ora vediamo come gestire tale risposta:</p>
<p><code>// Verifico esito del PaymentInit<br />
if( $pg-&gt;<strong>hasError_PI</strong>() )<br />
{<br />
// SEGNALAZIONE ERRORE!<br />
echo "&lt;h1&gt;ERRORE: ".$pg-&gt;getError_PI()."&lt;/h1&gt;";<br />
} else {<br />
// Registro il PaymentID nel database e invio l'utente alla HPP del Gateway<br />
mysql_query("UPDATE ordini SET .... ....");<br />
header("Location: " . $pg-&gt;getPaymentURL_PI() );<br />
}</code></p>
<p>Il metodo <em>hasError_PI</em> ci restituisce true se si sono verificati errori, in tal caso l&#8217;errore lo possiamo recuperare con il metodo <em>getError_PI</em>.<br />
In caso di <strong>esito positivo</strong> recuperiamo i dati con:</p>
<ul>
<li><strong>getID_PI</strong> &#8211; PaymentID generato dal Gateway</li>
<li><strong>getPaymentURL_PI</strong> &#8211; URL della HPP</li>
</ul>
<p>Redirezionando l&#8217;utente <strong>verso la HPP del Gateway</strong> abbiamo concluso le operazioni del PaymentInit. Il Cardholder (utente) caricherà tale pagina e potrà inserire i dati della sua carta di credito. Solo dopo che avrà dato l&#8217;invio sulla HPP il Gateway ci contatterà per inviarci il <strong>NotificationMessage</strong>.</p>
<h2>Il NotificationMessage e la chiusura della transazione</h2>
<p>Nel momento in cui l&#8217;utente invia i dati della sua carta di credito al Gateway questo, dopo averli controllati presso il Centro Autorizzativo, contatta il server del Merchant inviando il NotificationMessage. Il Merchant risponde con un stringa che include l&#8217;indirizzo verso cui redirezionare il Cardholder.<br />
La pagina di esempio che si occupa di tutto ciò è <em>responseURL.php</em>.</p>
<p>La prima operazione è creare una nuova istanza della classe per poi passargli i dati ricevuti via POST.</p>
<p><code>// init </code><code>PgConsTriv </code><code>Class<br />
$pg = new PgConsTriv($lng);<br />
$pg-&gt;setAction('Purchase');<br />
$pg-&gt;<strong>setVal_NM</strong>($_POST);</code></p>
<p><em>setVal_NM</em> si occupa appunto di registrare tutti i dati nella classe.<br />
A questo punto iniziamo i nostri controlli per verificare la validità dei dati ricevuti.</p>
<p><code>// get paymentid<br />
$paymentid = $pg-&gt;<strong>getPaymentID_NM</strong>();<br />
// Verifico se esiste il PaymentID<br />
if( $paymentid !== false ){<br />
// Recupero Ordine dal database in base al PaymentID settato in fase di PaymentInit</code></p>
<p>Nel caso in cui qualcosa fosse andato storto o il PaymentID non risulta correttamente impostato il valore restituito da <em>getPaymentID_NM</em> è <strong>false</strong>. Lo verifichiamo e proseguiamo.<br />
A questo punto posso recuperare i dati dell&#8217;ordine agganciando il PaymentID che mi ero registrato nel database in fase di PaymentInit. Recuperando i dati dal DB posso generare nuovamente il SecurityCode e verificarlo:</p>
<p><code>// set Security Code per verifica validità del Notification Message<br />
$pg-&gt;setSecurityCode_PI( $secCode );<br />
// Verifico autenticità del NotificationMessage<br />
if( $pg-&gt;<strong>isValid_NM</strong>() ) {</code></p>
<p>Il metodo <em>isValid_NM</em> si occupa della verifica del <em>SecurityCode</em>. Controlla quello passato dal metodo <em>setSecurityCode_PI</em> con quello appena ricevuto dai dati POST.<br />
Una volta superata questa verifica i nostri dati sono stati validati e possiamo ora procedere alla verifica dell&#8217;esito della transazione.<br />
Nel caso abbia avuto <strong>esisto positivo</strong> avremo:</p>
<p><code> # Transazione Elaborata<br />
if( $pg-&gt;isTransGood_NM() &amp;&amp;<br />
$arRp["stato"] == "PAYMENT_INIT" &amp;&amp;<br />
$pg-&gt;getVal_NM("trackid") == $idp		// Verifico idp<br />
) {<br />
// OK, Registro STATO e dati TRANSAZIONE nel DB<br />
$stato = $pg-&gt;getVal_NM("result");<br />
$TranID = $pg-&gt;getVal_NM("tranid");<br />
$Auth = $pg-&gt;getVal_NM("auth");<br />
mysql_query("UPDATE .... SET ....");<br />
// Verifico se elaborare l'ordine o meno a seconda del campo result</code></p>
<p>Per prima cosa verifichiamo con <strong>isTransGood_NM</strong> l&#8217;esito positivo della transazione. Poi (vedi documentazione del Gateway a pag.18) controlliamo che effettivamente sia il primo NotificationMessage che riceviamo. Potrebbero verificarsi dei casi in cui ne vengono inviati anche più di uno. La documentazione a riguardo dice di <strong>considerare attendibile sempre e solo il primo.</strong> Noi quindi, verificando lo stato, ci assicuriamo di ciò (lo stato infatti viene poi modificato e il secondo eventuale NotificationMessage non passa). Superati questi controlli possiamo prelevare i dati con il metodo <strong>getVal_NM</strong> (vedi documentazione del Gateway per elenco dei campi disponibili).</p>
<p><strong>Attenzione</strong>: fino ad ora abbiamo parlato di <strong>esito della transazione</strong>. Parliamo in termini di <strong>elaborazione effettuata</strong> e non di effettivo accredito dell&#8217;importo prelevato dalla carta di credito (esito dell&#8217;acquisto). Per questo esistono altri metodi che controllano il <strong>campo result</strong> dei dati inviati tramite NotificationMessage.<br />
I metodi sono diversi in base al valore che il campo result può assumere:</p>
<ul>
<li><strong>isCaptured_NM</strong>()</li>
<li><strong>isNotCaptured_NM</strong>()</li>
<li><strong>isApproved_NM</strong>()</li>
<li><strong>isNotApproved_NM</strong>()</li>
<li><strong>isDeniedByRisk_NM</strong>()</li>
<li><strong>isHostTimeout_NM</strong>()</li>
</ul>
<p>Nel nostro caso (Action = <strong>Purchase</strong>) il valore che corrisponde all&#8217;effettivo accredito dell&#8217;importo è “<strong>CAPTURED</strong>”.</p>
<p>Nel caso in cui la transazione invece dovesse avere esito negativo la funzione <strong>isTransError_NM</strong> restituisce true e noi possiamo procedere alla registrazione dell&#8217;errore nel DB:</p>
<p><code># Transazione NON Elaborata a causa di errori tecnici<br />
if( $pg-&gt;isTransError_NM() ) {<br />
// ERROR, Registro Errore nel DB</code></p>
<p>Anche in questo caso registro comunque lo <strong>stato ERROR</strong> nel campo del mio ordine (questo per quanto spiegato sopra sul discorso di un eventuale doppio NotificationMessage) e anche l&#8217;eventuale errore recuperato con <em>getVal_NM(&#8220;ErrorText&#8221;)</em>.<br />
A questo punto non resta che comunicare al Gateway l&#8217;URL verso cui deve redirezionare il Cardholder:</p>
<p><code>// Restituisco al Gateway l'URL su cui redirezionare il Cardholder<br />
echo "REDIRECT=". $pg-&gt;getURL_NM();</code></p>
<p>Il metodo <strong>getURL_NM</strong> restituisce il <em>goodURL</em> o <em>errorURL</em> a seconda che l&#8217;esito della transazione sia positivo o negativo. Esso considera inoltre, <strong>in base all&#8217;action impostato</strong>, anche l&#8217;esito dell&#8217;acquisto (accredito importo).</p>
<p>A questo punto si concludono anche le operazioni del NotificationMessage.<br />
Resta un&#8217;ultima considerazione da fare come ben rappresentanto nella documentazione del Gateway (pag. 23).</p>
<h4>Se il NotificationMessage non viene eseguito regolarmente</h4>
<p>Cosa accade se, ad esempio, il Gateway invia il messaggio ma per qualsiasi motivo<strong> il server del Merchant non lo riceve?</strong><br />
In questo caso, sia che la transazione abbia esito positivo, sia negativo, <strong>il Gateway reindirizza il Cardholder verso la pagina ErrorURL</strong>. In questo caso l&#8217;utente vede esisto negativo mentre la transazione magari è andata a buon fine e, ad esempio, anche l&#8217;esito dell&#8217;acquisto è positivo (con tanto di accredito dell&#8217;importo).<br />
Come da documentazione:</p>
<blockquote><p>E’ quindi importante che <strong>il Merchant prepari l’ErrorURL</strong> in modo tale da <strong>ricavare informazioni utili</strong> per poter investigare l’accaduto e <strong>informare successivamente il Cardholder</strong> sull’esito dell’acquisto.</p></blockquote>
<p>- -</p>
<p>Bene, siamo giunti alla fine del Tutorial.<br />
Spero di implementare presto anche la tipologia di messaggio Payment (per operazioni in differita tra Merchant e Gateway, es: storno, riaccredito, ecc.).</p>
<p>Nel frattempo spero che questo <strong>Tutorial</strong> sia risultato chiaro e utile.<br />
Buon lavoro! <img src='http://www.m4ss.net/wp-includes/images/smilies/icon_smile.gif' alt=':-)' class='wp-smiley' /> </p>
<div id="crp_related"><h2>Articoli correlati:</h2><ul><li><a href="http://www.m4ss.net/2010/05/12/payment-gateway-del-consorzio-triveneto-aggiornamento-1-3/" rel="bookmark" class="crp_title">Payment Gateway del Consorzio Triveneto (Aggiornamento 1.3)</a></li><li><a href="http://www.m4ss.net/2011/11/02/xt-commerce-plugin-payment-gateway-consorzio-triveneto/" rel="bookmark" class="crp_title">XT:Commerce, plugin Payment Gateway Consorzio Triveneto</a></li><li><a href="http://www.m4ss.net/2009/11/17/tutorial-multilingua-consorzio-triveneto-payment-gateway-tutorial/" rel="bookmark" class="crp_title">Tutorial per uso multilingua del Payment Gateway del Consorzio Triveneto</a></li><li><a href="http://www.m4ss.net/2009/11/03/modbus-e-php/" rel="bookmark" class="crp_title">Modbus e PHP</a></li><li><a href="http://www.m4ss.net/2009/08/31/zend-framework-teoria-di-base-front-controller-action/" rel="bookmark" class="crp_title">Zend Framework, teoria di base (Controller)</a></li></ul></div>  ]]></content:encoded>
			<wfw:commentRss>http://www.m4ss.net/2009/10/01/consorzio-triveneto-payment-gateway-tutorial/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Zend_Application, bootstrap semplice e flessibile</title>
		<link>http://www.m4ss.net/2009/08/26/zend-application-bootstrap/</link>
		<comments>http://www.m4ss.net/2009/08/26/zend-application-bootstrap/#comments</comments>
		<pubDate>Wed, 26 Aug 2009 16:54:23 +0000</pubDate>
		<dc:creator>Jazzo</dc:creator>
				<category><![CDATA[Development]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[Zend framework]]></category>

		<guid isPermaLink="false">http://www.m4ss.net/?p=591</guid>
		<description><![CDATA[<a href="http://www.m4ss.net/2009/08/26/zend-application-bootstrap/"><img align="left" hspace="5" width="150" height="150" src="http://www.m4ss.net/wp-content/uploads/2009/08/zend_framework_Logo-150x150.jpg" class="alignleft wp-post-image tfe" alt="Zend Framework Logo" title="Zend Framework Logo" /></a>E&#8217; sempre dura abbandonare la vecchia strada per la nuova. Per un annetto buono ci siamo abituati a configurare il Bootstrap a seconda delle esigenze, ognuno secondo i propri criteri (chi tutto in index.php, chi inizializzava una classe denominata Bootstrap, chi la stessa classe la registrava con registerPlugin nel frontController, ecc.). Ora Zend ha ufficializzato [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://www.m4ss.net/wp-content/uploads/2009/08/zend_framework_Logo.jpg"><img class="alignnone size-medium wp-image-594" title="Zend Framework Logo" src="http://www.m4ss.net/wp-content/uploads/2009/08/zend_framework_Logo-300x162.jpg" alt="Zend Framework Logo" width="300" height="162" /></a></p>
<p>E&#8217; sempre dura abbandonare la vecchia strada per la nuova. Per un annetto buono ci siamo abituati a <strong>configurare il Bootstrap</strong> a seconda delle esigenze, ognuno secondo i propri criteri (chi tutto in <em>index.php</em>, chi inizializzava una classe denominata <em>Bootstrap</em>, chi la stessa classe la registrava con <em>registerPlugin</em> nel <em>frontController</em>, ecc.). Ora <strong><a title="Zend PHP" href="http://www.zend.com/">Zend</a> ha ufficializzato la &#8220;strada da percorrere&#8221;</strong> basandosi proprio sulle tante soluzioni &#8220;escogitate&#8221; dalla <a title="DevZone Zend PHP" href="http://devzone.zend.com">community degli sviluppatori</a>. Il nuovo componente <strong><a title="Zend_Application" href="http://framework.zend.com/manual/en/zend.application.html">Zend_Application</a></strong> è ciò che Zend ha sviluppato come <strong>soluzione migliore</strong>.<br />
A primo impatto (sto sbattendo la testa contro il muro da diversi giorni) il tutto è un po&#8217; ostico ma ora, studiando con calma la documentazione, inizio a vedere la luce.</p>
<p>In un&#8217;applicazione configurata con pattern MVC spesso ci ritroviamo ad eseguire diverse operazioni: setup del database, configurare viste e view helpers, configurare uno o più layout, registrare plug-in, registrare action helpers e tanto altro. Allo stesso tempo potremmo avere un&#8217;applicazione complessa che richiama diverse procedure, ma magari non tutte richiedono MVC. Un cronjob per aggiornare giornalmente i dati, ad esempio, non richiede MVC. Lo stesso vale nel caso di eventuali servizi esterni, API, ecc.</p>
<p><a title="Zend_Application" href="http://framework.zend.com/manual/en/zend.application.html">Zend_Application</a> ci aiuta a gestire al meglio tutta la fase iniziale di Bootstrap dell&#8217;applicativo in modo che questa risulti semplice da gestire, flessibile e quanto più riusabile in altri progetti.<br />
Per iniziare ad utilizzare Zend_Application basta inizializzarlo nel nostro <em>index.php</em>:</p>
<pre>/** Zend_Application */
require_once 'Zend/Application.php';
// Create application, bootstrap, and run
$application = new <strong>Zend_Application</strong>(
<strong>APPLICATION_ENV</strong>,
<strong>APPLICATION_PATH . '/configs/application.ini'</strong>
);
$application-&gt;bootstrap();
$application-&gt;run();</pre>
<p>Nel creare una nuova istanza di Zend_Application passiamo 2 parametri:</p>
<ul>
<li><strong>APPLICATION_ENV</strong> &#8211; (es: production)</li>
<li>Path del <strong>file di configurazione</strong> (può anche essere un array o uno Zend_Config object)</li>
</ul>
<p>Io, per i file di configurazione, ho sempre utilizzato i <em>.ini</em> e, per ora, continuo su questa strada. <img src='http://www.m4ss.net/wp-includes/images/smilies/icon_wink.gif' alt=';-)' class='wp-smiley' /><br />
Nel file<em> application.ini</em> possiamo configurare diversi paramentri tra cui quelli relativi al bootstrap stesso. La novità sta nel fatto che ora possiamo richiamare alcune risorse che Zend_Application caricherà automaticamente.</p>
<pre>includePaths.library = APPLICATION_PATH "/../library"
bootstrap.path = APPLICATION_PATH "/bootstrap.php"
bootstrap.class = "Bootstrap"
resources.frontController.controllerDirectory = APPLICATION_PATH "/controllers"
resources.db.adapter = "PDO_MYSQL"
resources.db.params.host = "localhost"
resources.db.params.username = "root"
resources.db.params.password = "xxxxxxxx"
resources.db.params.dbname = "myDb"</pre>
<p>Con il prefisso <em>resources</em> infatti richiamiamo il <em>FrontController</em> (configurando la <em>controllerDirectory</em>) e il DB con relativi parametri. Tali componenti saranno quindi <strong>disponibili nell&#8217;istanza di Zend_Application</strong> e potranno essere richiamati facilmente in altri &#8220;luoghi&#8221; dell&#8217;applicativo (come lo devo ancora capire bene!).<br />
Vediamo ora come costruire la nostra classe Bootstrap che sarà posizionata in /application/bootstrap.php</p>
<pre>class Bootstrap extends Zend_Application_Bootstrap_Bootstrap
{
}</pre>
<p>In questo modo avremo un bootstrap che, dopo esser stato inizializzato in index.php, caricherà il <strong>frontController</strong> e il <strong>Database Adapter</strong> così come configurati nel file di configurazione (vedi sopra <em>application.ini</em>).<br />
Nel caso volessimo avviare altri componenti (Layout, Auth, Acl, ecc.), classi e quant&#8217;altro, Zend_Application può essere sviluppata in questo modo:</p>
<pre>class Bootstrap extends Zend_Application_Bootstrap_Bootstrap
{
    protected function _initFoo()
    {
        // ...
    }
    protected function _initBar()
    {
        // ...
    }
    protected function _initBaz()
    {
        // ...
    }
}</pre>
<p>La classe Bootstrap, estendendo la <strong>Zend_Application_Bootstrap_Bootstrap</strong>, ci permette di sfruttare una serie di metodi e convenzioni prestabilite. Prima tra tutte, ad esempio, quella che definisce che tutti i metodi <strong>protected</strong> che iniziano con <strong>_init</strong> vengono considerate risorse (&#8220;<em>resource method</em>&#8220;).<br />
Qui viene il bello. Se desideriamo inizializzare una risorsa singola basta passare il nome come parametro del metodo <strong>bootstrap()</strong> nel file index.php, per due o più risorse basterà passarli con un array, per tutte non passiamo alcun parametro.</p>
<pre>$bootstrap-&gt;bootstrap('foo'); // solo foo resource
$bootstrap-&gt;bootstrap(array('foo', 'bar')); // solo foo e bar resource
$bootstrap-&gt;bootstrap(); // TUTTE</pre>
<p>In questo modo potremo attivare in modo molto semplice <strong>solo le risorse necessarie</strong>. Tornando agli esempi iniziali (vedi sopra), nel caso di accesso da parte di cronjob, possiamo far partire un bootstrap ridotto che carica i soli componenti necessari all&#8217;esecuzione delle operazioni schedulate.</p>
<p>Torno a studiare&#8230; <img src='http://www.m4ss.net/wp-includes/images/smilies/icon_wink.gif' alt=';-)' class='wp-smiley' /> </p>
<div id="crp_related"><h2>Articoli correlati:</h2><ul><li><a href="http://www.m4ss.net/2010/02/23/impostare-mysql-sock-in-zend-framework-tramite-file-ini/" rel="bookmark" class="crp_title">Impostare mysql.sock in Zend Framework tramite file .ini</a></li><li><a href="http://www.m4ss.net/2009/03/27/zend-framework-view-helpers-1/" rel="bookmark" class="crp_title">Zend framework, View Helpers (1)</a></li><li><a href="http://www.m4ss.net/2010/09/07/ottimizzazione-url-seo-con-zend-framework/" rel="bookmark" class="crp_title">Ottimizzazione URL (SEO) con Zend Framework</a></li><li><a href="http://www.m4ss.net/2009/08/27/zend-framework-teoria-di-base/" rel="bookmark" class="crp_title">Zend Framework, teoria di base (Componenti)</a></li><li><a href="http://www.m4ss.net/2010/05/28/zend_validate-traduzione-messaggi-di-errore/" rel="bookmark" class="crp_title">Zend_Validate, traduzione messaggi di errore</a></li></ul></div>  ]]></content:encoded>
			<wfw:commentRss>http://www.m4ss.net/2009/08/26/zend-application-bootstrap/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>PHP Excel, la classe migliora notevolmente le performance</title>
		<link>http://www.m4ss.net/2009/08/25/php-excel-migliora-performance/</link>
		<comments>http://www.m4ss.net/2009/08/25/php-excel-migliora-performance/#comments</comments>
		<pubDate>Tue, 25 Aug 2009 15:45:18 +0000</pubDate>
		<dc:creator>Jazzo</dc:creator>
				<category><![CDATA[Development]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[phpexcel]]></category>

		<guid isPermaLink="false">http://www.m4ss.net/?p=584</guid>
		<description><![CDATA[<a href="http://www.m4ss.net/2009/08/25/php-excel-migliora-performance/"><img align="left" hspace="5" width="150" src="http://www.m4ss.net/wp-content/uploads/2009/08/phpexcel_logo.jpg" class="alignleft wp-post-image tfe" alt="phpexcel (codeplex) logo" title="phpexcel (codeplex) logo" /></a>Utilizzo la classe PHPExcel da un oltre un anno in un progetto sviluppato per Energika. L&#8217;anno scorso, dopo aver anche dato il mio piccolo contributo alla classe, il progetto è andato in produzione con la vecchia release 1.6.3 Come spesso accade, quando le cose funzionano, difficilmente si aggiorna una libreria. Si dovrebbe, certo, ma non [...]]]></description>
			<content:encoded><![CDATA[<p><img class="alignnone size-full wp-image-585" title="phpexcel (codeplex) logo" src="http://www.m4ss.net/wp-content/uploads/2009/08/phpexcel_logo.jpg" alt="phpexcel (codeplex) logo" width="349" height="80" /></p>
<p>Utilizzo la classe <a title="PHPExcel - Excel PHP" href="http://www.codeplex.com/PHPExcel/">PHPExcel</a> da un oltre un anno in un progetto sviluppato per <a title="Energika, risparmiare sul prezzo finale dell’energia (costi energetici)" href="http://www.energika.it">Energika</a>. L&#8217;anno scorso, dopo aver anche dato il mio <a title="davide gullo - This developer has been contributing to this project " href="https://www.ohloh.net/p/phpexcel/contributors/68957847495199">piccolo contributo</a> alla classe, il progetto è andato in produzione con la vecchia release 1.6.3</p>
<p>Come spesso accade, <strong>quando le cose funzionano</strong>, difficilmente si aggiorna una libreria. Si dovrebbe, certo, ma non è sempre così. Se l&#8217;aggiornamento richiede modifiche al codice lasci tutto come sta. Se l&#8217;aggiornamento rischia di fermare l&#8217;azienda non tocchi nulla. Poi mettici il tempo che è sempre meno&#8230;<br />
Se invece la richiesta di ottimizzazione del codice arriva direttamente da parte del cliente (sono veramente pochi!) lo fai, eccome!<br />
Ho passato quindi una settimana a rivedermelo per filo e per segno. Tra aggiornamenti, qualche dritta di <a title="Maarten Balliauw" href="https://www.ohloh.net/p/phpexcel/contributors/68957847493396"><span>Maarten</span></a> e modifiche al codice originario siamo arrivati ad un ottimo risultato: <span style="text-decoration: underline;"><strong>un abbattimento dei tempi del 70% circa!</strong></span></p>
<p>Come evidenziato nel changelog la nuova classe <a title="PHPExcel 1.7.0" href="http://phpexcel.codeplex.com/Release/ProjectReleases.aspx?ReleaseId=10717">PHPExcel ultima versione (<strong>1.7.0</strong>)</a>, rilasciata proprio in questi giorni (il <strong>10/08/09</strong>), migliora le performance nelle operazione di <strong>formattazione delle celle</strong>, nello <strong>sviluppo delle formule</strong> e altre utilissime funzioni.</p>
<blockquote><p>Dal file changelog <strong>1.7.0</strong>:<br />
- Feature:  (MBaker) &#8211; New RPN and stack-based calculation engine for <strong>improved performance of formula calculation</strong><br />
-   <strong>Faster</strong> (anything between 2 and 12 times faster than the old parser, depending on the complexity and nature of the formula)<br />
-   Significantly more <strong>memory efficient</strong> when formulae reference cells across worksheets<br />
&#8230;.<br />
-   Better trapping/handling of NaN and infinity results (return #NUM! error)<br />
-   Improved handling of empty parameters for Excel functions<br />
- Feature:  (MBaker) &#8211; <strong>New calculation engine</strong> can be accessed independently of workbooks (for use as a standalone calculator)<br />
&#8230;.<br />
- Feature:  (ET) Work item  9794 &#8211; Support arbitrary fixed number of decimals in PHPExcel_Style_NumberFormat::toFormattedString()<br />
- Feature:  (ET) Work item  6857 &#8211; <strong>Improving performance and memory</strong> on data dumps<br />
-    <strong>Various style optimizations</strong> (merging from branch wi6857-memory)</p></blockquote>
<div id="crp_related"><h2>Articoli correlati:</h2><ul><li><a href="http://www.m4ss.net/2007/03/21/energika-risparmiare-prezzo-finale-energia-costi/" rel="bookmark" class="crp_title">Energika, risparmiare sul prezzo finale dell&#8217;energia (costi energetici)</a></li><li><a href="http://www.m4ss.net/2007/10/10/risparmio-energetico-energika-lancia-la-sua-campagna-promozionale/" rel="bookmark" class="crp_title">Risparmio energetico: Energika lancia la sua campagna promozionale</a></li><li><a href="http://www.m4ss.net/2007/09/25/alta-formazione-a-reggio-emilia-quadir-srl/" rel="bookmark" class="crp_title">Alta formazione a Reggio Emilia: QuaDir S.r.l.</a></li><li><a href="http://www.m4ss.net/2007/03/28/e4-computer-engineering-e-lo-sponsor-della-gdm-community/" rel="bookmark" class="crp_title">E4 Computer Engineering è lo sponsor della GDM Community</a></li><li><a href="http://www.m4ss.net/2009/03/12/cory-doctorow-boing-boing-free-blogger/" rel="bookmark" class="crp_title">Cory Doctorow (Boing Boing) support Free Blogger</a></li></ul></div>  ]]></content:encoded>
			<wfw:commentRss>http://www.m4ss.net/2009/08/25/php-excel-migliora-performance/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>PHPMailer multi lingua</title>
		<link>http://www.m4ss.net/2009/08/18/phpmailer-multi-language-class/</link>
		<comments>http://www.m4ss.net/2009/08/18/phpmailer-multi-language-class/#comments</comments>
		<pubDate>Tue, 18 Aug 2009 13:53:59 +0000</pubDate>
		<dc:creator>Jazzo</dc:creator>
				<category><![CDATA[Development]]></category>
		<category><![CDATA[PHP]]></category>

		<guid isPermaLink="false">http://www.m4ss.net/?p=557</guid>
		<description><![CDATA[<a href="http://www.m4ss.net/2009/08/18/phpmailer-multi-language-class/"><img align="left" hspace="5" width="150" src="http://phpmailer.worxware.com/_skins/jithin/tplimgs/logo.jpg" class="alignleft wp-post-image tfe" alt="" title="phpmailer logo" /></a>Finalmente, prima di partire per le ferie, sono riuscito a mettere insieme un pò di &#8220;pezzi&#8221; di codice utilizzati nei diversi siti in lingua che ho realizzato. Ne è saltata fuori una classe PHP che pubblico sotto licenza GNU License. La classe estende l&#8217;ultra famosa ed utilizzata PHPMailer class. Lo scopo è quello di poter [...]]]></description>
			<content:encoded><![CDATA[<p><img title="phpmailer logo" src="http://phpmailer.worxware.com/_skins/jithin/tplimgs/logo.jpg" alt="" width="360" height="83" /></p>
<p>Finalmente, prima di partire per le ferie, sono riuscito a mettere insieme un pò di &#8220;pezzi&#8221; di codice utilizzati nei diversi siti in lingua che ho realizzato. Ne è saltata fuori una <strong>classe PHP</strong> che pubblico sotto licenza <a title="GNU License" href="http://www.gnu.org/licenses/licenses.html"><strong>GNU License</strong></a>.</p>
<p>La classe estende l&#8217;ultra famosa ed utilizzata <a title="PHPMailer class (worxware)" href="http://phpmailer.worxware.com/"><strong>PHPMailer</strong> class</a>.<br />
Lo scopo è quello di poter configurare rapidamente l&#8217;<strong>invio di email in lingua</strong> (<strong>Subject</strong> e <strong>Body</strong>). Attraverso l&#8217;utilizzo di questa classe infatti basteranno poche chiamate per poter inviare i messaggi a seconda della lingua selezionata. Ho implementato infatti un metodo dinamico (tramite <a title="Overloading PHP" href="http://it2.php.net/__callstatic"><strong>overloading</strong> __call</a>) per la selezione del testo (body) da inviare.</p>
<p>Per maggiori dettagli visita la pagina dedicata (English) alla <a title="myphpmailer multi language body class" href="/os-open-source/myphpmailer-multi-language-body-class/">MyPHPMailer <strong>multi Language Body</strong> Class</a>.</p>
<div id="crp_related"><h2>Articoli correlati:</h2><ul><li><a href="http://www.m4ss.net/2007/02/20/phpmailer-non-invia/" rel="bookmark" class="crp_title">PHPMailer non invia</a></li><li><a href="http://www.m4ss.net/2009/11/17/tutorial-multilingua-consorzio-triveneto-payment-gateway-tutorial/" rel="bookmark" class="crp_title">Tutorial per uso multilingua del Payment Gateway del Consorzio Triveneto</a></li><li><a href="http://www.m4ss.net/2010/05/12/payment-gateway-del-consorzio-triveneto-aggiornamento-1-3/" rel="bookmark" class="crp_title">Payment Gateway del Consorzio Triveneto (Aggiornamento 1.3)</a></li><li><a href="http://www.m4ss.net/2009/07/07/twitter-iran-e-il-silenzio-rumoroso-del-14-luglio/" rel="bookmark" class="crp_title">Twitter, Iran e il &#8220;silenzio rumoroso&#8221; del 14 Luglio</a></li><li><a href="http://www.m4ss.net/2009/03/17/jaiku-micro-blogging-diventa-open-source-google-app/" rel="bookmark" class="crp_title">Jaiku (micro-blogging) diventa Open Source (Google App)</a></li></ul></div>  ]]></content:encoded>
			<wfw:commentRss>http://www.m4ss.net/2009/08/18/phpmailer-multi-language-class/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

