<?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/"
	xmlns:georss="http://www.georss.org/georss" xmlns:geo="http://www.w3.org/2003/01/geo/wgs84_pos#" xmlns:media="http://search.yahoo.com/mrss/"
	>

<channel>
	<title>WebFrameWorker</title>
	<atom:link href="http://webframeworker.wordpress.com/feed/" rel="self" type="application/rss+xml" />
	<link>http://webframeworker.wordpress.com</link>
	<description>framework, gestione database, patterns, programmazione...</description>
	<lastBuildDate>Sun, 21 Jan 2007 15:10:29 +0000</lastBuildDate>
	<language>it</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.com/</generator>
<cloud domain='webframeworker.wordpress.com' port='80' path='/?rsscloud=notify' registerProcedure='' protocol='http-post' />
<image>
		<url>http://s2.wp.com/i/buttonw-com.png</url>
		<title>WebFrameWorker</title>
		<link>http://webframeworker.wordpress.com</link>
	</image>
	<atom:link rel="search" type="application/opensearchdescription+xml" href="http://webframeworker.wordpress.com/osd.xml" title="WebFrameWorker" />
	<atom:link rel='hub' href='http://webframeworker.wordpress.com/?pushpress=hub'/>
		<item>
		<title>screzi tra PEAR DataObject e datetime (MySql)</title>
		<link>http://webframeworker.wordpress.com/2007/01/21/screzi-tra-pear-dataobject-e-datetime-mysql/</link>
		<comments>http://webframeworker.wordpress.com/2007/01/21/screzi-tra-pear-dataobject-e-datetime-mysql/#comments</comments>
		<pubDate>Sun, 21 Jan 2007 14:27:12 +0000</pubDate>
		<dc:creator>stablum</dc:creator>
				<category><![CDATA[DataObject]]></category>
		<category><![CDATA[datetime]]></category>
		<category><![CDATA[Pear]]></category>
		<category><![CDATA[PHP]]></category>

		<guid isPermaLink="false">http://webframeworker.wordpress.com/2007/01/21/screzi-tra-pear-dataobject-e-datetime-mysql/</guid>
		<description><![CDATA[Oggi ho potuto sperimentare come il DataObject non abbia in particolare simpatia il tipo datetime mentre tentavo di fare un override del metodo dataobject::insert() per impostare il timestamp di inserimento di un record. Assumento un dataobject $do con un campo data tipo datetime è un impresa impostare la data al giorno attuale. Il primo tentativo [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=webframeworker.wordpress.com&amp;blog=653443&amp;post=7&amp;subd=webframeworker&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>Oggi ho potuto sperimentare come il DataObject non abbia in particolare simpatia il tipo datetime mentre tentavo di fare un override del metodo <code>dataobject::insert()</code> per impostare il timestamp di inserimento di un record.</p>
<p>Assumento un dataobject <code>$do</code> con un campo <code>data</code> tipo <code>datetime</code> è un impresa impostare la data al giorno attuale.</p>
<p>Il primo tentativo <code>$do-&gt;data = now()</code> ovviamente dava problemi, ma sorprendentemente pure <code>$do-&gt;data = date("Y-m-d H:i:s")</code> non inseriva la data nella query generata (visibile con <code>$do-&gt;debugLevel(5)</code>).</p>
<p>Dopo le preliminari imprecazioni sono andato a scartabellare la documentazione scoprendo <a href="http://www.pear.php.net/manual/en/package.database.db-dataobject.intro-casting.php">alcune orrende alchimie, tra le quali DB_DataObject_Cast::date(..)</a></p>
<p>Finalmente sono riuscito a inserire la data con <code>$do-&gt;data = DB_DataObject_Cast::date(date("Y-m-d H:i:s"))</code> ma purtroppo le informazioni riguardanti ora, minuti e secondi venivano ignorate. La documentazione non dice nulla in proposito a &#8220;datetime&#8221;.</p>
<p>Come al solito la documentazione migliore è leggere i sorgenti (<code>pear/DB/DataObject/Cast.php</code>) dai quali ho scoperto la funzione non documentata <code>DB_DataObject_Cast::dateTime(..)</code> che, tralaltro, se non gli si passa nessun parametro utilizza la data e il time corrente:</p>
<p><code>$do-&gt;data = DB_DataObject_Cast::dateTime();<br />
</code></p>
<p>Tutta questa complessità a che pro? Non era meglio incapsulare questi &#8220;dettagli&#8221; all&#8217;interno del dataobject invece che pasticciare con funzioni esterne? Cioè: il dataobject ha tutte le informazioni per capire che il campo &#8220;data&#8221; è un &#8220;datetime&#8221; e, nel caso gli sia passato un array, avrebbe potuto benissimo fare internamente la conversione nella stringa &#8220;Y-m-d H:i:s&#8221; per la query.</p>
<br /><img alt="" border="0" src="http://feeds.wordpress.com/1.0/categories/webframeworker.wordpress.com/7/" /> <img alt="" border="0" src="http://feeds.wordpress.com/1.0/tags/webframeworker.wordpress.com/7/" /> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/webframeworker.wordpress.com/7/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/webframeworker.wordpress.com/7/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/webframeworker.wordpress.com/7/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/webframeworker.wordpress.com/7/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/webframeworker.wordpress.com/7/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/webframeworker.wordpress.com/7/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/webframeworker.wordpress.com/7/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/webframeworker.wordpress.com/7/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/webframeworker.wordpress.com/7/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/webframeworker.wordpress.com/7/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/webframeworker.wordpress.com/7/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/webframeworker.wordpress.com/7/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/webframeworker.wordpress.com/7/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/webframeworker.wordpress.com/7/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=webframeworker.wordpress.com&amp;blog=653443&amp;post=7&amp;subd=webframeworker&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://webframeworker.wordpress.com/2007/01/21/screzi-tra-pear-dataobject-e-datetime-mysql/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/e2f5fba9211d2456ec9eae6550bdb1af?s=96&#38;d=identicon" medium="image">
			<media:title type="html">stablum</media:title>
		</media:content>
	</item>
		<item>
		<title>Seagull: un maturo framework MVC</title>
		<link>http://webframeworker.wordpress.com/2007/01/05/seagull-un-maturo-framework-mvc/</link>
		<comments>http://webframeworker.wordpress.com/2007/01/05/seagull-un-maturo-framework-mvc/#comments</comments>
		<pubDate>Fri, 05 Jan 2007 14:23:39 +0000</pubDate>
		<dc:creator>stablum</dc:creator>
				<category><![CDATA[PHP]]></category>
		<category><![CDATA[seagull]]></category>

		<guid isPermaLink="false">http://webframeworker.wordpress.com/2007/01/05/seagull-un-maturo-framework-mvc/</guid>
		<description><![CDATA[E&#8217; già da un paio di mesi che mi sono interessato a seagull. Si tratta di un framework basato sul pattern Model View Controller e permette di gestire in modo molto elegante concetti come: fitrare le richieste, costruzione dei dati di input sulla richiesta, passaggio dei dati di input alla &#8220;azione&#8221; del &#8220;manager&#8221; richiesto e [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=webframeworker.wordpress.com&amp;blog=653443&amp;post=6&amp;subd=webframeworker&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>E&#8217; già da un paio di mesi che mi sono interessato a <a href="http://seagullproject.org">seagull</a>.<br />
Si tratta di un framework basato sul pattern <a href="http://it.wikipedia.org/wiki/Model-View-Controller">Model View Controller</a> e permette di gestire in modo molto elegante concetti come: fitrare le richieste, costruzione dei dati di input sulla richiesta, passaggio dei dati di input alla &#8220;azione&#8221; del &#8220;manager&#8221; richiesto e quindi costruzione dei dati di output che vengono passati a un template.</p>
<p>Ecco un esempio di una classe &#8220;manager&#8221;:</p>
<pre>
class HelloWorldMgr extends SGL_Manager
{
  function validate($req, &amp;$input){
    $this-&gt;validated = true;
    $input-&gt;action   = ($req-&gt;get('action')) ? $req-&gt;get('action') : 'sayGoodBye';
  }
  function HelloWorldMgr(){
    parent::SGL_Manager();
    $this-&gt;_aActionsMapping =  array(
      'sayGoodBye'   =&gt; array('sayGoodBye'),
      'sayHello'   =&gt; array('sayHello'),
    );
  }
  function display(&amp;$output) {
    $this-&gt;masterTemplate = 'helloWorld.html';
    $this-&gt;pageTitle = "whoa";
    $output-&gt;fooz="include_path:".ini_get("include_path");
  }
  function _cmd_sayHello(&amp;$input, &amp;$output) {
    $output-&gt;word = 'Hello';
  }
  function _cmd_sayGoodBye(&amp;$input, &amp;$output) {
    $output-&gt;word = 'Goodbye';
  }
}</pre>
<p>In  sostanza la richiesta <code>$req</code>viene mandata al metodo <code>validate()</code> che costruisce array <code>$input</code>.<br />
Successivamente il framework analizza l&#8217;array <code>$this-&gt;_aActionsMapping</code> per capire quali metodi (con prefisso <code>_cmd_</code>) sono mappati all&#8217;azione richiesta.</p>
<p>Successivamente vengono eseguiti tutti i metodi mappati dando come argomenti l&#8217;array di input e quello di output (per riferimento, dato che i dati devono essere modificati).</p>
<p>L&#8217;array associativo di output contiene tutte le etichette che verranno macro-espanse nel template (che può essere di tipo <a href="http://pear.php.net/package/HTML_Template_Flexy">flexy</a>, <a href="http://www.google.it/url?sa=t&amp;ct=res&amp;cd=1&amp;url=http%3A%2F%2Fsmarty.php.net%2F&amp;ei=6F6eRfjFKaaK2ALZmeUJ&amp;usg=__itrmPRL3HXCJyxQupW20ocrTjUQ=&amp;sig2=XPVitfKWVkeX-qZS3yHFAA">smarty </a>e altri ancora&#8230;).</p>
<p>Tale array di output viene passato infine al metodo <code>display</code> (una specie di post-filtro) che si occupa di effettuare le ultime operazioni sui dati che verranno visualizzati, come ad esempio settare il nome del file del template.</p>
<p>Inoltre è disponibile un sistema evoluto di gestione dei permessi, molti moduli gia&#8217; fatti pronti per essere utilizzati e un interfaccia web molto comoda per la configurazione del framework e dei moduli.</p>
<p>Questo sistema di gestire le richieste è una vera e propria manna dal cielo e per le sue caratteristiche lo utilizzerò intensivamente nei mei progetti futuri e seguiranno molti post a proposito <img src='http://s1.wp.com/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' /> </p>
<br /><img alt="" border="0" src="http://feeds.wordpress.com/1.0/categories/webframeworker.wordpress.com/6/" /> <img alt="" border="0" src="http://feeds.wordpress.com/1.0/tags/webframeworker.wordpress.com/6/" /> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/webframeworker.wordpress.com/6/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/webframeworker.wordpress.com/6/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/webframeworker.wordpress.com/6/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/webframeworker.wordpress.com/6/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/webframeworker.wordpress.com/6/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/webframeworker.wordpress.com/6/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/webframeworker.wordpress.com/6/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/webframeworker.wordpress.com/6/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/webframeworker.wordpress.com/6/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/webframeworker.wordpress.com/6/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/webframeworker.wordpress.com/6/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/webframeworker.wordpress.com/6/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/webframeworker.wordpress.com/6/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/webframeworker.wordpress.com/6/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=webframeworker.wordpress.com&amp;blog=653443&amp;post=6&amp;subd=webframeworker&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://webframeworker.wordpress.com/2007/01/05/seagull-un-maturo-framework-mvc/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/e2f5fba9211d2456ec9eae6550bdb1af?s=96&#38;d=identicon" medium="image">
			<media:title type="html">stablum</media:title>
		</media:content>
	</item>
		<item>
		<title>PEAR Structures_DataGrid: come mostrare efficacemente dati tabulari</title>
		<link>http://webframeworker.wordpress.com/2007/01/04/pear-structures_datagrid-come-mostrare-efficacemente-dati-tabulari/</link>
		<comments>http://webframeworker.wordpress.com/2007/01/04/pear-structures_datagrid-come-mostrare-efficacemente-dati-tabulari/#comments</comments>
		<pubDate>Thu, 04 Jan 2007 12:22:07 +0000</pubDate>
		<dc:creator>stablum</dc:creator>
				<category><![CDATA[datagrid]]></category>
		<category><![CDATA[Pear]]></category>
		<category><![CDATA[PHP]]></category>

		<guid isPermaLink="false">http://webframeworker.wordpress.com/2007/01/04/pear-structures_datagrid-come-mostrare-efficacemente-dati-tabulari/</guid>
		<description><![CDATA[E&#8217; frequente che un programmatore perda un sacco di tempo nel creare cicli per fare il fetching dei dati e la consecutiva stampa in HTML, magari corredata da un sistema ultra-complicato di paging che da molte frustrazioni. Sembra che una soluzione sia stata trovata grazie a un ottimo sistema di astrazione OO fornitoci da quei [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=webframeworker.wordpress.com&amp;blog=653443&amp;post=4&amp;subd=webframeworker&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>E&#8217; frequente che un programmatore perda un sacco di tempo nel creare cicli per fare il fetching dei dati e la consecutiva stampa in HTML, magari corredata da un sistema ultra-complicato di paging che da molte frustrazioni. Sembra che una soluzione sia stata trovata grazie a un ottimo sistema di astrazione OO fornitoci da quei geniacci di <a href="http://pear.php.net">pear</a>.</p>
<p><a href="http://pear.php.net/package/Structures_DataGrid">DataGrid</a> è un pacchetto <a href="http://pear.php.net/">PEAR</a> che permette di gestire in modo assolutamente modulare flussi di dati tabulari provenienti dalle più svariate sorgenti (DataBase, CSV, XML&#8230;) per mostrarli nei più svariati formati: HTML, XML, MsExcel&#8230;</p>
<p>Le sorgenti dati sono rappresentate dai pacchetti PEAR <code>Structures_DataGrid_DataSource_*</code> e i formati  di output sono nei pacchetti denominati <code>Structures_DataGrid_Renderer_*</code></p>
<p>Dopo la creazione dell&#8217;oggetto DataGrid si usa il metodo <code>bindDataSource()</code> per &#8220;agganciare&#8221; la sorgente dei dati (ad esempio un DB_DataObject) e il metodo <code>setRenderer()</code> per impostare il tipo di output.</p>
<p>Molto interessante è l&#8217;utilizzo di funzioni callback nel <a href="http://pear.php.net/manual/en/package.structures.structures-datagrid.formatter.php">Column Formatter</a> per creare una sorta di post-filtro che va a modificare il dato da visualizzare; ad esempio, in una tabella HTML, invece che mostrare semplicemente un dato, crea un link che conduce al form di modifica di quel dato stesso.</p>
<p>Ecco un esempio che sfrutta la paginazione automatica:<br />
<code>&lt;?php<br />
require 'Structures/DataGrid.php';<br />
// 10 records per page<br />
$datagrid =&amp; new Structures_DataGrid(10);<br />
// Setup your datasource<br />
$options = array('dsn' =&gt; 'mysql://user:password@host/db_name');<br />
$test = $datagrid-&gt;bind("SELECT * FROM my_table", $options);<br />
if (PEAR::isError($test)) {<br />
echo $test-&gt;getMessage();<br />
}<br />
// Print the DataGrid with the default renderer (HTML Table)<br />
$test = $datagrid-&gt;render();<br />
if (PEAR::isError($test)) {<br />
echo $test-&gt;getMessage();<br />
}<br />
// Print the HTML paging links<br />
$test = $datagrid-&gt;render(DATAGRID_RENDER_PAGER);<br />
if (PEAR::isError($test)) {<br />
echo $test-&gt;getMessage();<br />
}<br />
?&gt;</code></p>
<p>per tutto il resto: <a href="http://pear.php.net/manual/en/package.structures.structures-datagrid.php">qui c&#8217;è il manuale</a></p>
<br /><img alt="" border="0" src="http://feeds.wordpress.com/1.0/categories/webframeworker.wordpress.com/4/" /> <img alt="" border="0" src="http://feeds.wordpress.com/1.0/tags/webframeworker.wordpress.com/4/" /> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/webframeworker.wordpress.com/4/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/webframeworker.wordpress.com/4/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/webframeworker.wordpress.com/4/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/webframeworker.wordpress.com/4/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/webframeworker.wordpress.com/4/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/webframeworker.wordpress.com/4/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/webframeworker.wordpress.com/4/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/webframeworker.wordpress.com/4/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/webframeworker.wordpress.com/4/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/webframeworker.wordpress.com/4/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/webframeworker.wordpress.com/4/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/webframeworker.wordpress.com/4/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/webframeworker.wordpress.com/4/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/webframeworker.wordpress.com/4/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=webframeworker.wordpress.com&amp;blog=653443&amp;post=4&amp;subd=webframeworker&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://webframeworker.wordpress.com/2007/01/04/pear-structures_datagrid-come-mostrare-efficacemente-dati-tabulari/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/e2f5fba9211d2456ec9eae6550bdb1af?s=96&#38;d=identicon" medium="image">
			<media:title type="html">stablum</media:title>
		</media:content>
	</item>
		<item>
		<title>Propel: un framework ORM per PHP5</title>
		<link>http://webframeworker.wordpress.com/2007/01/03/propel/</link>
		<comments>http://webframeworker.wordpress.com/2007/01/03/propel/#comments</comments>
		<pubDate>Wed, 03 Jan 2007 11:48:09 +0000</pubDate>
		<dc:creator>stablum</dc:creator>
				<category><![CDATA[ORM]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[propel]]></category>

		<guid isPermaLink="false">http://webframeworker.wordpress.com/2007/01/03/propel/</guid>
		<description><![CDATA[Ieri sera, nell&#8217;articolo di wikipedia Object Relationship Modeling ho trovato, tra i collegamenti esterni un ORM per PHP 5 di nome Propel, rilasciato con licenza LGPL. Propel fa il parsing di file schema scritti in xml per generare Object Model scritti in php, e devo dire che questo mi sembra a naso un anti-pattern La [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=webframeworker.wordpress.com&amp;blog=653443&amp;post=3&amp;subd=webframeworker&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>Ieri sera, nell&#8217;articolo di wikipedia <a href="http://en.wikipedia.org/wiki/Object-relationship_modeling">Object Relationship Modeling</a> ho trovato, tra i collegamenti esterni un ORM per PHP 5 di nome <a href="http://propel.phpdb.org/trac/">Propel</a>, rilasciato con <a href="http://propel.phpdb.org/trac/wiki/Users/Introduction/License">licenza LGPL</a>.</p>
<p>Propel fa il parsing di file schema scritti in xml per generare Object Model scritti in php, e devo dire che questo mi sembra a naso un <a href="http://en.wikipedia.org/wiki/Anti-pattern">anti-pattern</a></p>
<p>La compatibilità è garantita su un gran numero di database, grazie al layer di astrazione <a href="http://creole.phpdb.org/trac/">Creole</a>.</p>
<p>Ecco un assaggio di come può essere una parte di uno schema XML:</p>
<p><code>&lt;table name="book"&gt;<br />
&lt;column name="book_id" type="INTEGER" required="true" primaryKey="true"/&gt;<br />
&lt;column name="title" type="VARCHAR" size="100" required="true"/&gt;<br />
&lt;column name="author_id" type="INTEGER" required="true"/&gt;<br />
&lt;foreign-key foreignTable="author"&gt;<br />
&lt;reference<br />
local="author_id"<br />
foreign="author_id"/&gt;<br />
&lt;/foreign-key&gt;<br />
&lt;/table&gt;<br />
&lt;table name="author"&gt;<br />
&lt;column name="author_id" type="INTEGER" required="true" primaryKey="true"/&gt;<br />
&lt;column name="fullname" type="VARCHAR" size="40" required="true"/&gt;<br />
&lt;/table&gt;<br />
</code></p>
<p>C&#8217;è da dire che come schema sembra molto verboso, soprattutto nella specificazione delle foreign key&#8230; Mi sembra di capire che l&#8217;utilizzo intensivo dell&#8217;xml può essere dettato da una necessità inconscia di non voler programmare in quel linguaggio certo non elegantissimo che è il php.</p>
<p>Il sistema di generazione file mi sembra che ricalchi quello di <a href="http://www.rubyonrails.org/">Ruby on Rails</a> e di <a href="http://www.xisc.com/">PRADO</a>, ovvero mediante tool esterni a riga di comando. Non sopporto quest&#8217;idea di separare lo sviluppo in due fasi, ovvero &#8220;generazione superautomatizza&#8221; e &#8220;customizzazione&#8221; poichè per tornare ad usufruire dei vantaggi della generazione bisogna buttare via le personalizzazioni.</p>
<p>L&#8217;utilizzo finale sembra essere piuttosto comodo e comparabile con altri framework simili (si veda il post su <a href="http://www.phpdoctrine.com">doctrine</a>). Inoltre, contrariamente a DB_DataObject, quando vengono inpostati i campi dei record non si usa l&#8217;accesso diretto alle variabili d&#8217;istanza, ma vengono utilizzati dei setter come si può vedere nel seguente esempio:<br />
<code><br />
$author = new Author();<br />
$author-&gt;setFirstName("Leo");<br />
$author-&gt;setLastName("Tolstoy");<br />
$pub = new Publisher();<br />
$pub-&gt;setName("Viking Press");<br />
$book = new Book();<br />
$book-&gt;setTitle("War &amp; Peace");<br />
$book-&gt;setIsbn("0140444173");<br />
$book-&gt;setPublisher($pub);<br />
$book-&gt;setAuthor($author);<br />
// save (insert, in this case) the new object<br />
$book-&gt;save();<br />
</code><br />
Di particolare interesse è piuttosto la generazione della sezione WHERE delle SELECT: invece di usare un vero e proprio &#8220;pezzo&#8221; di codice SQL come fa DB_DataObject con il metodo whereAdd(), propel usa un sistema più avanzato (ed astratto) tramite <a href="http://propel.phpdb.org/docs/en/user_guide/chapters/FindingObjects.html#FindingRecods.Criteria">i cosiddetti Criteria</a>, p.es:<br />
<code><br />
$c = new Criteria();<br />
// Find all authors with first name Karl but<br />
// last name is _not_ Marx.<br />
$c-&gt;add(AuthorPeer::FIRST_NAME, "Karl");<br />
$c-&gt;add(AuthorPeer::LAST_NAME, "Marx", Criteria::NOT_EQUAL);<br />
// Find all authors with last name of Tolstoy, Dostoevsky, or Bakhtin<br />
$c2 = new Criteria();<br />
$c2-&gt;add(AuthorPeer::LAST_NAME, array("Tolstoy", "Dostoevsky", "Bakhtin"), Criteria::IN);<br />
</code></p>
<p>Piuttosto interessante ma eccessivamente verboso per i miei gusti, nonostante fornisca interessanti spunti di riflessione.</p>
<p>L&#8217;ultima nota importante è l&#8217;emulazione della<code> ON DELETE CASCADE </code>via PHP per tutti i database che non la supportano nativamente, ad esempio MySQL.</p>
<p>Per altre informazioni: <a href="http://propel.phpdb.org/docs/en/user_guide/">qui c&#8217;è la guida</a></p>
<br /><img alt="" border="0" src="http://feeds.wordpress.com/1.0/categories/webframeworker.wordpress.com/3/" /> <img alt="" border="0" src="http://feeds.wordpress.com/1.0/tags/webframeworker.wordpress.com/3/" /> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/webframeworker.wordpress.com/3/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/webframeworker.wordpress.com/3/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/webframeworker.wordpress.com/3/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/webframeworker.wordpress.com/3/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/webframeworker.wordpress.com/3/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/webframeworker.wordpress.com/3/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/webframeworker.wordpress.com/3/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/webframeworker.wordpress.com/3/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/webframeworker.wordpress.com/3/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/webframeworker.wordpress.com/3/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/webframeworker.wordpress.com/3/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/webframeworker.wordpress.com/3/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/webframeworker.wordpress.com/3/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/webframeworker.wordpress.com/3/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=webframeworker.wordpress.com&amp;blog=653443&amp;post=3&amp;subd=webframeworker&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://webframeworker.wordpress.com/2007/01/03/propel/feed/</wfw:commentRss>
		<slash:comments>5</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/e2f5fba9211d2456ec9eae6550bdb1af?s=96&#38;d=identicon" medium="image">
			<media:title type="html">stablum</media:title>
		</media:content>
	</item>
		<item>
		<title>Doctrine: l&#8217;ORM definitivo?</title>
		<link>http://webframeworker.wordpress.com/2007/01/03/hello-world/</link>
		<comments>http://webframeworker.wordpress.com/2007/01/03/hello-world/#comments</comments>
		<pubDate>Wed, 03 Jan 2007 11:43:56 +0000</pubDate>
		<dc:creator>stablum</dc:creator>
				<category><![CDATA[Doctrine]]></category>
		<category><![CDATA[ORM]]></category>
		<category><![CDATA[PHP]]></category>

		<guid isPermaLink="false"></guid>
		<description><![CDATA[Doctrine è un framework di astrazione per le businness class scritto in PHP 5 che permette come tanti altri sistemi, di evitare di scrivere direttamente l&#8217;SQL e di usufruire di sistemi di accesso ai dati tramite entità ad oggetti. Uno dei suoi punti di forza è la facilità di accesso alle entità relazionate, ad esempio: [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=webframeworker.wordpress.com&amp;blog=653443&amp;post=1&amp;subd=webframeworker&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p><a href="http://www.phpdoctrine.com/">Doctrine</a> è un framework di astrazione per le businness class scritto in PHP 5 che permette come tanti altri sistemi, di evitare di scrivere direttamente l&#8217;SQL e di usufruire di sistemi di accesso ai dati tramite entità ad oggetti.</p>
<p>Uno dei suoi punti di forza è la <a href="http://www.phpdoctrine.com/documentation.php?index=5.6">facilità di accesso alle entità relazionate</a>, ad esempio:</p>
<p><code><br />
// NOTE: related record have always the first letter in uppercase<br />
$email = $user-&gt;Email;<br />
$email-&gt;address = "<a href="mailto:jackdaniels@drinkmore.info" class="linkification-ext" title="mailto:jackdaniels@drinkmore.info">jackdaniels@drinkmore.info</a>";<br />
$user-&gt;save();<br />
// alternative:<br />
$user-&gt;Email-&gt;address = "<a href="mailto:jackdaniels@drinkmore.info" class="linkification-ext" title="mailto:jackdaniels@drinkmore.info">jackdaniels@drinkmore.info</a>";<br />
$user-&gt;save();<br />
</code></p>
<p>Doctrine inoltre ha un potente linguaggio di query simile all&#8217;SQL, ma che viene interpretato dal framework: <a href="http://www.phpdoctrine.com/documentation.php?index=8.1">DQL (Doctrine Query Language)</a>.</p>
<p>Devo saperne di più, magari è veramente più potente di <a href="http://pear.php.net/package/DB_DataObject">DB_DataObject</a></p>
<br /><img alt="" border="0" src="http://feeds.wordpress.com/1.0/categories/webframeworker.wordpress.com/1/" /> <img alt="" border="0" src="http://feeds.wordpress.com/1.0/tags/webframeworker.wordpress.com/1/" /> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/webframeworker.wordpress.com/1/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/webframeworker.wordpress.com/1/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/webframeworker.wordpress.com/1/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/webframeworker.wordpress.com/1/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/webframeworker.wordpress.com/1/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/webframeworker.wordpress.com/1/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/webframeworker.wordpress.com/1/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/webframeworker.wordpress.com/1/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/webframeworker.wordpress.com/1/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/webframeworker.wordpress.com/1/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/webframeworker.wordpress.com/1/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/webframeworker.wordpress.com/1/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/webframeworker.wordpress.com/1/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/webframeworker.wordpress.com/1/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=webframeworker.wordpress.com&amp;blog=653443&amp;post=1&amp;subd=webframeworker&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://webframeworker.wordpress.com/2007/01/03/hello-world/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/e2f5fba9211d2456ec9eae6550bdb1af?s=96&#38;d=identicon" medium="image">
			<media:title type="html">stablum</media:title>
		</media:content>
	</item>
	</channel>
</rss>
