<?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>Blogbonzo: Matteo Magni &#187; Programmazione</title>
	<atom:link href="http://blog.ilbonzo.org/category/programmazione/feed/" rel="self" type="application/rss+xml" />
	<link>http://blog.ilbonzo.org</link>
	<description>Consulente Informatico, Web Developer &#38; System Administrator</description>
	<lastBuildDate>Wed, 09 Dec 2009 13:07:18 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.8.4</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>Rilasciato plugin ilmeteo.it per wordpress</title>
		<link>http://blog.ilbonzo.org/2009/09/21/rilasciato-plugin-ilmeteo-it-per-wordpress/</link>
		<comments>http://blog.ilbonzo.org/2009/09/21/rilasciato-plugin-ilmeteo-it-per-wordpress/#comments</comments>
		<pubDate>Mon, 21 Sep 2009 09:27:58 +0000</pubDate>
		<dc:creator>Bonzo</dc:creator>
				<category><![CDATA[php]]></category>
		<category><![CDATA[wordpress]]></category>

		<guid isPermaLink="false">http://blog.ilbonzo.org/?p=351</guid>
		<description><![CDATA[E&#8217; stato rilasciato da ilmeteo.it un plugin per wordpress per le previsioni meteo.
A questo indirizzo http://imeteo.wordpress.com/ è possibile scaricarlo e vedere le istruzioni per installarlo.
]]></description>
			<content:encoded><![CDATA[<p>E&#8217; stato rilasciato da <a href="http://www.ilmeteo.it">ilmeteo.it</a> un plugin per wordpress per le previsioni meteo.<br />
A questo indirizzo <a href="http://imeteo.wordpress.com/">http://imeteo.wordpress.com/</a> è possibile scaricarlo e vedere le istruzioni per installarlo.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.ilbonzo.org/2009/09/21/rilasciato-plugin-ilmeteo-it-per-wordpress/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Bug di IE con le gif animate</title>
		<link>http://blog.ilbonzo.org/2009/09/01/ie-e-gif-animate/</link>
		<comments>http://blog.ilbonzo.org/2009/09/01/ie-e-gif-animate/#comments</comments>
		<pubDate>Tue, 01 Sep 2009 06:02:56 +0000</pubDate>
		<dc:creator>Bonzo</dc:creator>
				<category><![CDATA[Javascript]]></category>

		<guid isPermaLink="false">http://blog.ilbonzo.org/?p=322</guid>
		<description><![CDATA[Purtroppo su IE ogni volta che inviamo un form le gif animate vengono fermate.
Ecco uno scenario tipico per questo errore: una form per inviare una foto dove si vuole fare attendere l&#8217;utente che finisca l&#8217;upload dandogli la sensazione, tramite una gif animata, che la pagina web stia lavorando.

&#60;form onSubmit="gif()" name="myform" action="#" method="post" enctype="multipart/form-data"&#62;
&#60;p id="wait"&#62;
&#60;img id="WaitImage" [...]]]></description>
			<content:encoded><![CDATA[<p>Purtroppo su IE ogni volta che inviamo un form le gif animate vengono fermate.</p>
<p>Ecco uno scenario tipico per questo errore: una form per inviare una foto dove si vuole fare attendere l&#8217;utente che finisca l&#8217;upload dandogli la sensazione, tramite una gif animata, che la pagina web stia lavorando.<br />
<code><br />
&lt;form onSubmit="gif()" name="myform" action="#" method="post" enctype="multipart/form-data"&gt;<br />
&lt;p id="wait"&gt;<br />
&lt;img id="WaitImage" src="images/loadingAnimation.gif"/&gt;&lt;br /&gt;<br />
&lt;strong&gt;&Egrave; in corso l'invio ...&lt;br /&gt;<br />
L'operazione potrebbe richiedere qualche minuto, attendi senza chiudere questa finestra.<br />
&lt;/strong&gt;<br />
&lt;/p&gt;<br />
&lt;/form&gt;<br />
</code></p>
<p>Visto che su IE la gif che era nascosta, quando invio la form smette di essere animata, bisogna trovare un modo per farla ripartire.</p>
<p>Tutto si può fare dando l&#8217;impressione ad IE di aver modificato l&#8217;immagine con Javascript un tempo successivo all&#8217;invio della form, tramite questa istruzione:<br />
<code><br />
setTimeout('document.getElementById("WaitImage").src = "images/loadingAnimation.gif"', 200);<br />
</code></p>
<p><code><br />
&lt;script type="text/javascript"&gt;<br />
function gif()<br />
{<br />
	if (document.forms["myform"]["file"].value != "")<br />
	{<br />
	  		document.getElementById(\'bottone_carica\').style.display = \'none\';<br />
	  		document.getElementById(\'wait\').style.display = \'block\';<br />
	  		setTimeout(\'document.getElementById("WaitImage").src = "images/loadingAnimation.gif"\', 200);<br />
	}<br />
}<br />
&lt;/script&gt;<br />
</code></p>
<p>Così la gif bloccata ripartirà a eseguire la sua animazione.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.ilbonzo.org/2009/09/01/ie-e-gif-animate/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Evitare Cache di una immagine con PHP</title>
		<link>http://blog.ilbonzo.org/2009/08/31/evitare-cache-di-una-immagine-con-php/</link>
		<comments>http://blog.ilbonzo.org/2009/08/31/evitare-cache-di-una-immagine-con-php/#comments</comments>
		<pubDate>Mon, 31 Aug 2009 14:36:35 +0000</pubDate>
		<dc:creator>Bonzo</dc:creator>
				<category><![CDATA[php]]></category>

		<guid isPermaLink="false">http://blog.ilbonzo.org/?p=331</guid>
		<description><![CDATA[Se volete che una immagine venga ripescata dalla cache in PHP è molto semplice, basta accodare una stringa che varia ogni volta all&#8217;indirizzo dell&#8217;immagine.
Il Browser sarà così ingannato e penserà di dover recuperare una nuova immagine.
Per esempio si potrebbe usare la funzione time che ritorna il timestamp.

'&#60;img src="immagine.jpg?t='.time().'"/&#62;'

]]></description>
			<content:encoded><![CDATA[<p>Se volete che una immagine venga ripescata dalla cache in PHP è molto semplice, basta accodare una stringa che varia ogni volta all&#8217;indirizzo dell&#8217;immagine.<br />
Il Browser sarà così ingannato e penserà di dover recuperare una nuova immagine.<br />
Per esempio si potrebbe usare la funzione time che ritorna il timestamp.</p>
<p><code><br />
'&lt;img src="immagine.jpg?t='.time().'"/&gt;'<br />
</code></p>
]]></content:encoded>
			<wfw:commentRss>http://blog.ilbonzo.org/2009/08/31/evitare-cache-di-una-immagine-con-php/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Modulo Drupal per nuovo tipo di contenuto</title>
		<link>http://blog.ilbonzo.org/2009/06/25/modulo-drupal-per-nuovo-tipo-di-contenuto/</link>
		<comments>http://blog.ilbonzo.org/2009/06/25/modulo-drupal-per-nuovo-tipo-di-contenuto/#comments</comments>
		<pubDate>Thu, 25 Jun 2009 08:02:13 +0000</pubDate>
		<dc:creator>Bonzo</dc:creator>
				<category><![CDATA[drupal]]></category>
		<category><![CDATA[php]]></category>

		<guid isPermaLink="false">http://blog.ilbonzo.org/?p=284</guid>
		<description><![CDATA[In Drupal è molto semplice sviluppare un modulo che permeta di avere a disposizione un nuovo tipo di contenuto che estenda il classico nodo.
Vediamo come sviluppare un modulo che aggiunga il tipo di contenuto libro.
Creiamo la cartella node_book che andremo a mettere nella cartella modules del nostro sito.
Dentro questa cartella mettiamo il file node_book.info con [...]]]></description>
			<content:encoded><![CDATA[<p>In Drupal è molto semplice sviluppare un modulo che permeta di avere a disposizione un nuovo tipo di contenuto che estenda il classico nodo.</p>
<p>Vediamo come sviluppare un modulo che aggiunga il tipo di contenuto libro.</p>
<p>Creiamo la cartella node_book che andremo a mettere nella cartella modules del nostro sito.<br />
Dentro questa cartella mettiamo il file <em>node_book.info</em> con le specifiche del nodo:<br />
<code><br />
; $Id$<br />
name = node book<br />
description = "nodo libro"<br />
core = 6.x<br />
</code></p>
<p>e il file node_book.module con il codice vero e proprio.</p>
<p>Ecco i vari hook che si devono implementare:<br />
<strong>Hook menu</strong><br />
<code><br />
function node_book_menu()<br />
{<br />
	$items[] = array( 'path' => 'node_book', 'callback' => 'node_book_page', 'access' => true, 'type' => MENU_CALLBACK );<br />
      return $items;<br />
}<br />
</code></p>
<p><strong>hook perm</strong><br />
<code><br />
function node_book_perm()<br />
{<br />
  return array('create book node', 'edit own book nodes');<br />
}<br />
</code><br />
<strong>hook access</strong><br />
<code>function node_book_access($op, $node, $account) {<br />
  if ($op == 'create') {<br />
    // Only users with permission to do so may create this node type.<br />
    return user_access('create nameofnodetype', $account);<br />
  }<br />
  // Users who create a node may edit or delete it later, assuming they have the<br />
  // necessary permissions.<br />
  if ($op == 'update' || $op == 'delete') {<br />
    if (user_access('edit own nameofnodetype', $account) &#038;&#038; ($account->uid == $node->uid)) {<br />
      return TRUE;<br />
    }<br />
  }<br />
}</code></p>
<p><strong>hook help</strong><br />
<code>function node_book_help($path, $arg) {<br />
  switch ($path) {<br />
    case 'admin/help#block':<br />
      return '
<p>'. t('Blocks are boxes of content that may be rendered into certain regions of your web pages, for example, into sidebars. Blocks are usually generated automatically by modules (e.g., Recent Forum Topics), but administrators can also define custom blocks.') .'</p>
<p>';</p>
<p>    case 'admin/build/block':<br />
      return t('
<p>Blocks are boxes of content that may be rendered into certain regions of your web pages, for example, into sidebars. They are usually generated automatically by modules, but administrators can create blocks manually.</p>
<p>If you want certain blocks to disable themselves temporarily during high server loads, check the "Throttle" box. You can configure the auto-throttle on the <a href="@throttle">throttle configuration page</a> after having enabled the throttle module.</p>
<p>You can configure the behaviour of each block (for example, specifying on which pages and for what users it will appear) by clicking the "configure" link for each block.</p>
<p>', array('@throttle' => url('admin/settings/throttle')));<br />
  }<br />
}</code><br />
Ora passiamo agli hook che implementano veramente il nostro modulo:<br />
<strong>hook form</strong><br />
<code><br />
function node_book_form(&#038;$node) {<br />
$type = node_get_types('type', $node);<br />
  if ($type->has_title) {<br />
    $form['title'] = array(<br />
      '#type' => 'textfield',<br />
      '#title' => check_plain($type->title_label),<br />
      '#required' => TRUE,<br />
      '#default_value' => $node->title,<br />
      '#weight' => -5<br />
    );<br />
  }<br />
  if ($type->has_body) {<br />
    // In Drupal 6, we can use node_body_field() to get the body and filter<br />
    // elements. This replaces the old textarea + filter_form() method of<br />
    // setting this up. It will also ensure the teaser splitter gets set up<br />
    // properly.<br />
    $form['body_field'] = node_body_field($node, $type->body_label, $type->min_word_count);<br />
  }<br />
  // NOTE in node_example there is some addition code here not needed for this simple node-type<br />
 // Now we define the form elements specific to our node type.<br />
  $form['editor'] = array(<br />
    '#type' => 'textfield',<br />
    '#title' => t('Editore'),<br />
    '#default_value' => isset($node->editor) ? $node->editor : '',<br />
  );<br />
  $form['book_author'] = array(<br />
    '#type' => 'textfield',<br />
    '#title' => t('Autore'),<br />
    '#default_value' => isset($node->book_author) ? $node->book_author : '',<br />
  );<br />
  $form['place'] = array(<br />
    '#type' => 'textfield',<br />
    '#title' => t('Luogo'),<br />
    '#default_value' => isset($node->place) ? $node->place : '',<br />
  );<br />
  $form['year'] = array(<br />
    '#type' => 'textfield',<br />
    '#title' => t('Anno'),<br />
    '#default_value' => isset($node->year) ? $node->year : '',<br />
  );<br />
  $form['book_type'] = array(<br />
    '#type' => 'textfield',<br />
    '#title' => t('Tipo'),<br />
    '#default_value' => isset($node->book_type) ? $node->book_type : '',<br />
  );<br />
  $form['magazine'] = array(<br />
    '#type' => 'textfield',<br />
    '#title' => t('Rivista'),<br />
    '#default_value' => isset($node->magazine) ? $node->magazine : '',<br />
  );<br />
  return $form;<br />
}</code></p>
<p><strong>hook insert</strong><br />
/**<br />
 * Implementation of hook_insert().<br />
 *<br />
 * As a new node is being inserted into the database, we need to do our own<br />
 * database inserts.<br />
 */<br />
<code>function node_book_insert($node) {<br />
  db_query("INSERT INTO {node_book} (vid, nid, editor, book_author, place, year, book_type, magazine) VALUES (%d, %d, '%s', '%s', '%s', '%s', '%s', '%s')", $node->vid, $node->nid,$node->editor,$node->book_author,$node->place,$node->year,$node->book_type,$node->magazine);<br />
}</code></p>
<p><strong>hook update</strong><br />
<code>/**<br />
 * Implementation of hook_update().<br />
 *<br />
 * As an existing node is being updated in the database, we need to do our own<br />
 * database updates.<br />
 */<br />
function node_book_update($node) {<br />
  // if this is a new node or we're adding a new revision,<br />
  if ($node->revision) {<br />
    node_book_insert($node);<br />
  }<br />
  else {<br />
    db_query("UPDATE {node_book} SET editor='%s', book_author='%s', place='%s', year='%s', book_type='%s', magazine='%s' WHERE vid = %d",  $node->editor, $node->book_author, $node->place, $node->year, $node->book_type, $node->magazine, $node->vid);<br />
  }<br />
}<br />
</code></p>
<p><strong>hook nodeapi</strong><br />
<code>/**<br />
 * Implementation of hook_nodeapi().<br />
 *<br />
 * When a node revision is deleted, we need to remove the corresponding record<br />
 * from our table. The only way to handle revision deletion is by implementing<br />
 * hook_nodeapi().<br />
 */<br />
function node_book_nodeapi(&#038;$node, $op, $teaser, $page) {<br />
  switch ($op) {<br />
    case 'delete revision':<br />
      // Notice that we're matching a single revision based on the node's vid.<br />
      db_query('DELETE FROM {node_book} WHERE vid = %d', $node->vid);<br />
      break;<br />
  }<br />
}</code></p>
<p><strong>hook_delete</strong><br />
/**<br />
 * Implementation of hook_delete().<br />
 *<br />
 * When a node is deleted, we need to remove all related records from out table.<br />
 */<br />
function node_book_delete($node) {<br />
  // Notice that we&#8217;re matching all revision, by using the node&#8217;s nid.<br />
  db_query(&#8217;DELETE FROM {node_book} WHERE nid = %d&#8217;, $node->nid);<br />
}</p>
<p><strong>hook load</strong><br />
<code>/**<br />
 * Implementation of hook_load().<br />
 *<br />
 * Now that we've defined how to manage the node data in the database, we<br />
 * need to tell Drupal how to get the node back out. This hook is called<br />
 * every time a node is loaded, and allows us to do some loading of our own.<br />
 */<br />
function node_book_load($node) {<br />
  $additions = db_fetch_object(db_query('SELECT editor,book_author,place,year,book_type,magazine FROM {node_book} WHERE vid = %d', $node->vid));<br />
  return $additions;<br />
}<br />
</code></p>
<p><strong>hook view</strong><br />
<code>/**<br />
 * Implementation of hook_view().<br />
 *<br />
 * This is a typical implementation that simply runs the node text through<br />
 * the output filters.<br />
 */<br />
function node_book_view($node, $teaser = FALSE, $page = FALSE) {<br />
    $node = node_prepare($node, $page);<br />
    $node->content['myfield'] = array(<br />
	'#value' => 'Editore: '.$node->editor.'&lt;br /&gt;'.'Autore: '.$node->book_author.'&lt;br &gt;'.'Luogo: '.$node->place.'&lt;br &gt;'.'Anno: '.$node->year.'&lt;br &gt;'.'Tipologia: '.$node->book_type.'&lt;br &gt;',<br />
    	'#weight' => 1,<br />
  );<br />
  return $node;<br />
}<br />
</code></p>
<p>Ora manca solo il DB, ecco la tabella per i campi in più del nostro nodo<br />
CREATE TABLE node_book (<br />
vid int(10) unsigned NOT NULL default &#8216;0&#8242;,<br />
nid int(10) unsigned NOT NULL default &#8216;0&#8242;,<br />
editor varchar(255) NOT NULL default &#8221;,<br />
book_author varchar(255) NOT NULL default &#8221;,<br />
place varchar(255),<br />
year varchar(255),<br />
book_type varchar(255),<br />
magazine varchar(255),<br />
PRIMARY KEY (vid, nid),<br />
KEY `node_type_book_nid` (nid)<br />
)</p>
<p>Dopo aver creato la tabella e attivato il modulo avrete un nuovo tipo di contenuto disponibile.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.ilbonzo.org/2009/06/25/modulo-drupal-per-nuovo-tipo-di-contenuto/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Eliminare .svn</title>
		<link>http://blog.ilbonzo.org/2009/02/23/eliminare-svn/</link>
		<comments>http://blog.ilbonzo.org/2009/02/23/eliminare-svn/#comments</comments>
		<pubDate>Mon, 23 Feb 2009 16:12:17 +0000</pubDate>
		<dc:creator>Bonzo</dc:creator>
				<category><![CDATA[Programmazione]]></category>
		<category><![CDATA[subversion]]></category>

		<guid isPermaLink="false">http://blog.ilbonzo.org/?p=218</guid>
		<description><![CDATA[Windows:

for /f "tokens=* delims=" %%i in ('dir /s /b /a:d *svn') do (
rd /s /q "%%i"
)

Linux:

find ./ -name .svn -exec rm -rf {} +

]]></description>
			<content:encoded><![CDATA[<p>Windows:<br />
<code><br />
for /f "tokens=* delims=" %%i in ('dir /s /b /a:d *svn') do (<br />
rd /s /q "%%i"<br />
)<br />
</code></p>
<p>Linux:<br />
<code><br />
find ./ -name .svn -exec rm -rf {} +<br />
</code></p>
]]></content:encoded>
			<wfw:commentRss>http://blog.ilbonzo.org/2009/02/23/eliminare-svn/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>PDO, Abstraction Layer</title>
		<link>http://blog.ilbonzo.org/2008/06/16/pdo-abstraction-layer/</link>
		<comments>http://blog.ilbonzo.org/2008/06/16/pdo-abstraction-layer/#comments</comments>
		<pubDate>Mon, 16 Jun 2008 14:19:42 +0000</pubDate>
		<dc:creator>Bonzo</dc:creator>
				<category><![CDATA[LinkedIn]]></category>
		<category><![CDATA[MySQL]]></category>
		<category><![CDATA[Pgsql]]></category>
		<category><![CDATA[Programmazione]]></category>
		<category><![CDATA[php]]></category>

		<guid isPermaLink="false">http://blog.ilbonzo.org/2008/06/16/pdo-abstraction-layer/</guid>
		<description><![CDATA[Finalmente con la versione 5.1 PHP ha un nuovo livello di astrazione per la connettività con i database veramente valido.
PDO, PHP Data Objects
Ho deciso di studiarlo un po&#8217;:
Creo un Database di prova:

DROP TABLE IF EXISTS first_table;


--CREATE TABLE first_table (
--id INT(10) NOT NULL AUTO_INCREMENT,
--name VARCHAR(255) NOT NULL,
--surname VARCHAR(255) NOT NULL,
--PRIMARY KEY (id)
--) TYPE=MyISAM;


CREATE TABLE first_table (
id [...]]]></description>
			<content:encoded><![CDATA[<p>Finalmente con la versione 5.1 PHP ha un nuovo livello di astrazione per la connettività con i database veramente valido.<br />
<strong><a href="http://it2.php.net/pdo">PDO</a>, PHP Data Objects</strong></p>
<p>Ho deciso di studiarlo un po&#8217;:</p>
<p>Creo un Database di prova:<br />
<code><br />
DROP TABLE IF EXISTS first_table;<br />
</code><br />
<code><br />
--CREATE TABLE first_table (<br />
--id INT(10) NOT NULL AUTO_INCREMENT,<br />
--name VARCHAR(255) NOT NULL,<br />
--surname VARCHAR(255) NOT NULL,<br />
--PRIMARY KEY (id)<br />
--) TYPE=MyISAM;<br />
</code><br />
<code><br />
CREATE TABLE first_table (<br />
id INT(10) NOT NULL AUTO_INCREMENT,<br />
name VARCHAR(255) NOT NULL,<br />
surname VARCHAR(255) NOT NULL,<br />
PRIMARY KEY (id)<br />
) TYPE=innoDB;<br />
</code><br />
<code><br />
INSERT INTO first_table (name,surname) VALUES ('matteo','magni');<br />
INSERT INTO first_table (name,surname) VALUES ('john','starks');<br />
INSERT INTO first_table (name,surname) VALUES ('michael','jordan');<br />
INSERT INTO first_table (name,surname) VALUES ('kobe','bryant');<br />
INSERT INTO first_table (name,surname) VALUES ('earvin','johnson');<br />
INSERT INTO first_table (name,surname) VALUES ('larry','bird');<br />
INSERT INTO first_table (name,surname) VALUES ('patrick','ewing');<br />
INSERT INTO first_table (name,surname) VALUES ('reggie','miller');<br />
INSERT INTO first_table (name,surname) VALUES ('ron','harper');<br />
INSERT INTO first_table (name,surname) VALUES ('anfernee','hardaway');<br />
INSERT INTO first_table (name,surname) VALUES ('tim','hardaway');<br />
INSERT INTO first_table (name,surname) VALUES ('mitch','richmond');<br />
INSERT INTO first_table (name,surname) VALUES ('jason','williams');<br />
INSERT INTO first_table (name,surname) VALUES ('allen','iverson');<br />
INSERT INTO first_table (name,surname) VALUES ('dwayne','wade');<br />
</code></p>
<p>Lo importo così dopo aver creato il DB pdo<br />
<code><br />
mysql -p -D pdo < pdo.sql<br />
</code><br />
Per le prove utilizzerò sia la versione con tabella MyISAM che quella con tabella InnoDB, la differenza è che per la prima non sono disponibili le transazioni.</p>
<p><strong>Usiamo le eccezioni per connetterci al DB</strong><br />
</code><code><br />
//USO le eccezioni<br />
$string_dsn = 'mysql:host=localhost;dbname=pdo'; // mysql<br />
$string_username = 'user';<br />
$string_password = 'password';<br />
try {<br />
    $mypdo = new PDO($string_dsn, $string_username, $string_password);<br />
}<br />
catch(PDOException $e) {<br />
    echo 'Errore di connessione: '.$e->getMessage();<br />
}<br />
</code></p>
<p>Query fatta con errore, mi restituisce il numero dell&#8217;errore:<br />
<code><br />
$mypdo->exec('SELECT * FROM SELECT'); // errore generato appositamente<br />
echo 'Errore N: '.$mypdo->errorCode();<br />
</code>    </p>
<p>Se la uso così è molto utile, mando io il messaggio che voglio:<br />
<code><br />
if($mypdo->errorCode() !== '' || !$mypdo->exec('SELECT * FROM SELECT'))<br />
    echo 'errore nella query SELECT * FROM SELECT';<br />
</code></p>
<p>Così mi ritorna un array di tre elementi con le notizie sull&#8217;errore:<br />
<code><br />
var_dump($mypdo->errorInfo());<br />
//array di tre elementi<br />
if(count($mypdo->errorInfo()) == 1) // ... tutto ok<br />
if(count($mypdo->errorInfo()) > 1) { // ... ci sono errori<br />
    $errorinfo = $mypdo->errorInfo();<br />
    echo $errorinfo[2]; // stringa con l' errore<br />
}<br />
</code></p>
<p><strong>QUERY</strong> semplice senza preparare niente,<br />
Mi ritorna i dati accessibili sia con il numero della colonna (partendo da 0) che con il nome della colonna<br />
Query senza parametri aggiuntivi per stabilire che Fetch usare:</p>
<p><code><br />
foreach($mypdo->query('SELECT * FROM first_table') as $row)<br />
{<br />
    echo '--------------&lt;br /&gt;';<br />
    echo '1: '.$row[0].' - 2: '.$row[1].'&lt;br /&gt;';<br />
    echo 'id: '.$row['id'].' - name: '.$row['name'].'&lt;br /&gt;';<br />
}<br />
</code><br />
mi ritorna i dati accessibili sia con il numero della colonna (partendo da 0) che con il nome della colonna.</p>
<p>Esplicito il tipo di Fetch con il parametro PDO_FETCH_*<br />
<strong>PDo::FETCH_BOTH</strong> #usatelo come mysql fetch_array, risultato duplicato, quello di default<br />
<code><br />
foreach($mypdo->query('SELECT * FROM first_table', PDO::FETCH_BOTH) as $row)<br />
{<br />
    echo '--------------&lt;br /&gt;';<br />
    echo '1: '.$row[0].' - 2: '.$row[1].'&lt;br /&gt;';<br />
    echo 'id: '.$row['id'].' - name: '.$row['name'].'&lt;br /&gt;';<br />
}<br />
</code></p>
<p><strong>PDO::FETCH_ASSOC</strong> #usatelo come mysql_fetch_assoc<br />
<code><br />
foreach($mypdo->query('SELECT * FROM first_table', PDO::FETCH_ASSOC) as $row)<br />
{<br />
    echo '--------------&lt;br /&gt;';<br />
    echo 'id: '.$row['id'].' - name: '.$row['name'].'&lt;br /&gt;';<br />
}<br />
</code></p>
<p><strong>PDO::FETCH_NUM </strong>#analogo a mysql_fetch_row<br />
<code><br />
foreach($mypdo->query('SELECT * FROM first_table', PDO::FETCH_NUM) as $row)<br />
{<br />
    echo '--------------&lt;br/&gt;';<br />
    echo '1: '.$row[0].' - 2: '.$row[1].'&lt;br/&gt;';<br />
}<br />
</code></p>
<p><strong>PDO::FETCH_OBJ </strong>#ritorna un oggetto con le proprieta&#8217; che hanno il nome dei campi<br />
<code><br />
foreach($mypdo->query('SELECT * FROM first_table', PDO::FETCH_OBJ) as $row)<br />
{<br />
    echo '--------------&lt;br /&gt;';<br />
    echo 'id->'.$row->id.' - name-> '.$row->name.'&lt;br /&gt;';<br />
}<br />
</code></p>
<p><strong>PDO::FETCH_LAZY </strong>#combina *_BOTH e *_OBJ<br />
<code><br />
foreach($mypdo->query('SELECT * FROM first_table', PDO::FETCH_LAZY) as $row)<br />
{<br />
    echo '--------------&lt;br /&gt;';<br />
    echo '1: '.$row[0].' - 2: '.$row[1].'&lt;br /&gt;';<br />
    echo 'id:  '.$row['id'].' - name: '.$row['name'].'&lt;br /&gt;';<br />
    echo 'id->'.$row->id.' - name-> '.$row->name.'&lt;br /&gt;';<br />
}<br />
</code></p>
<p><strong>PDO::FETCH_BOUND</strong> #Lo vediamo con bindColumn,<br />
restituiti come attributi alle variabili PHP</p>
<p>Per Evitare problemi con DB case sensitive e non case sensitive<br />
Setto che i nomi delle colonne siano restituiti sempre minuscoli<br />
<code><br />
$mypdo->setAttribute(PDO::CASE_LOWER);<br />
/*<br />
 * Psso usare anche<br />
 * PDO::CASE_UPPER<br />
 * PDO::CASE_NATURAL come sono fornite dal driver, metodo di default<br />
 */<br />
</code><br />
oppure si usa sempre FETCH_NUM</p>
<p><strong>Utilizzo delle Transazioni</strong></p>
<p>inizio la transazione</p>
<p>Su Mysql devo usare tabelle InnoDB perchè MyIsam non supportano le transazioni</p>
<p>Però&#8230;<br />
The following example begins a transaction and issues two statements that<br />
modify the database before rolling back the changes.<br />
On MySQL, however, the DROP TABLE statement automatically commits the<br />
transaction so that none of the changes in the transaction are rolled back.</p>
<p>Quindi niente drop per una transazione.<br />
<code><br />
$mypdo->beginTransaction();<br />
$mypdo->exec('DROP TABLE first_table');<br />
$mypdo->rollBack(); // la tabella mytable rimarra' invariata :-)<br />
</code></p>
<p>come detto su MySQL la cancella lo stesso.</p>
<p><code><br />
$mypdo->beginTransaction();<br />
$mypdo->exec("INSERT INTO first_table (name,surname) VALUES ('gianni','morandi')");<br />
$mypdo->rollBack(); // la tabella mytable rimarra' invariata :-)<br />
</code></p>
<p><code><br />
$mypdo->beginTransaction();<br />
$mypdo->exec("INSERT INTO first_table (name,surname) VALUES ('gianni','morandi')");<br />
$mypdo->commit(); // la tabella mytable rimarra' invariata :-)<br />
</code><br />
mi inserisce il nuovo valore.</p>
<h3>Prepared Statement</h3>
<p><strong>Metodo Fetch</strong><br />
Metodo implementato nello statement che è in grado di spostare il cursore dei risultati di una query in un ciclo.<br />
Gli posso passare i parametri come a query.<br />
/*<br />
 * PDO::FETCH_ASSOC, PDO::FETCH_BOTH, PDO::FETCH_BOUND, PDO::FETCH_LAZY,<br />
 * PDO::FETCH_OBJ, PDO::FETCH_NUM<br />
 */<br />
<code><br />
$mypdo->beginTransaction();<br />
// preparo la query<br />
$stpdo = $mypdo->prepare('UPDATE first_table SET name = "pippo" WHERE id = 17');<br />
// eseguo la query<br />
$stpdo->execute();<br />
$mypdo->commit();<br />
echo 'SELECT';<br />
$mypdo->beginTransaction();<br />
// preparo la query<br />
$stpdo = $mypdo->prepare('SELECT * FROM first_table');<br />
// eseguo la query<br />
$stpdo->execute();<br />
//stampo a video il contenuto dell'array che mi crea fetch<br />
while ($row=$stpdo->fetch())<br />
{<br />
     echo 'id: '.$row['id'].' - name: '.$row['name'].'&lt;br /&gt;';<br />
}<br />
$mypdo->commit();<br />
</code></p>
<p><strong>La potenza prepare e execute </strong><br />
Potenza del metodo prepare<br />
<code><br />
$mypdo->beginTransaction();<br />
$stpdo = $mypdo->prepare('UPDATE first_table SET name = ? WHERE id = ?');<br />
//i punti interrogativi saranno sostituiti da execute<br />
$stpdo->execute(array('gianni', 17));<br />
$mypdo->commit();<br />
echo 'SELECT';<br />
$mypdo->beginTransaction();<br />
// preparo la query<br />
$stpdo = $mypdo->prepare('SELECT * FROM first_table');<br />
// eseguo la query<br />
$stpdo->execute();<br />
//stampo a video il contenuto dell'array che mi crea fetch<br />
while ($row=$stpdo->fetch())<br />
{<br />
     echo 'id: '.$row['id'].' - name: '.$row['name'].'&lt;br /&gt;';<br />
}<br />
$mypdo->commit();<br />
</code><br />
Posso preparare la query una volta e fare poi i vari inserimenti.<br />
<strong>potenza prepare e execute ancora</strong><br />
<code><br />
$mypdo->beginTransaction();<br />
$stpdo = $mypdo->prepare('UPDATE first_table SET name = :name WHERE id = :id');<br />
//i punti interrogativi non sempre sono chiari, così lo è di più<br />
$stpdo->execute(array(':name'=>'marcello',':id'=>17));<br />
$mypdo->commit();<br />
echo 'SELECT';<br />
$mypdo->beginTransaction();<br />
// preparo la query<br />
$stpdo = $mypdo->prepare('SELECT * FROM first_table');<br />
// eseguo la query<br />
$stpdo->execute();<br />
//stampo a video il contenuto dell'array che mi crea fetch<br />
while ($row=$stpdo->fetch())<br />
{<br />
     echo 'id: '.$row['id'].' - name: '.$row['name'].'&lt;br /&gt;';<br />
}<br />
$mypdo->commit();<br />
</code></p>
<p><strong>Metodo fetchAll</strong><br />
ritorna un array le righe del resultset<br />
<code><br />
$mypdo->beginTransaction();<br />
// preparo la query<br />
$stpdo = $mypdo->prepare('SELECT * FROM first_table');<br />
// eseguo la query<br />
$stpdo->execute();<br />
$row=$stpdo->fetchAll();<br />
//stampo a video il contenuto dell'array che mi crea fetch<br />
var_dump($row);<br />
$mypdo->commit();<br />
</code></p>
<p><strong>Metodo fetchAll</strong><br />
<code><br />
$mypdo->beginTransaction();<br />
// preparo la query<br />
$stpdo = $mypdo->prepare('SELECT * FROM first_table');<br />
// eseguo la query<br />
$stpdo->execute();<br />
$row=$stpdo->fetchAll(PDO::FETCH_OBJ);<br />
//così ho un array di oggetti<br />
//stampo a video il contenuto dell'array che mi crea fetch<br />
var_dump($row);<br />
$mypdo->commit();<br />
</code></p>
<h3>Metodi bind</h3>
<p><strong>bindParam</strong><br />
<code><br />
$id=10;<br />
$mypdo->beginTransaction();<br />
// preparo la query<br />
$stpdo = $mypdo->prepare("SELECT * FROM first_table WHERE id = ? ");<br />
$stpdo->bindParam(1,$id, PDO::PARAM_INT);<br />
$stpdo->execute();<br />
while ($row=$stpdo->fetch())<br />
{<br />
     echo 'id: '.$row['id'].' - name: '.$row['name'].'&lt;br /&gt;';<br />
}<br />
$mypdo->commit();<br />
</code><br />
Oppure:<br />
<code><br />
$id=10;<br />
$mypdo->beginTransaction();<br />
// preparo la query<br />
$stpdo = $mypdo->prepare("SELECT * FROM first_table WHERE id = :id ");<br />
$stpdo->bindParam(':id',$id, PDO::PARAM_INT);<br />
$stpdo->execute();<br />
while ($row=$stpdo->fetch())<br />
{<br />
     echo 'id: '.$row['id'].' - name: '.$row['name'].'&lt;br /&gt;';<br />
}<br />
$id=13;<br />
$stpdo->bindParam(':id',$id, PDO::PARAM_INT);<br />
$stpdo->execute();<br />
while ($row=$stpdo->fetch())<br />
{<br />
     echo 'id: '.$row['id'].' - name: '.$row['name'].'&lt;br /&gt;';<br />
}<br />
$mypdo->commit();<br />
</code><br />
Così ho preparato la query una volta sola, ed ho legato :id al valore della variabile $id.</p>
<p><strong>bindValue</strong><br />
<code><br />
$id=10;<br />
$mypdo->beginTransaction();<br />
$stpdo = $mypdo->prepare('SELECT * FROM first_table WHERE id < ? ');<br />
$stpdo->bindValue(1, $id, PDO::PARAM_INT);<br />
$stpdo->execute();<br />
while ($row=$stpdo->fetch())<br />
{<br />
     echo 'id: '.$row['id'].' - name: '.$row['name'].'&lt;br /&gt;';<br />
}<br />
$mypdo->commit();<br />
</code></p>
<p><strong>bindColumn</strong><br />
<code><br />
$mypdo->beginTransaction();<br />
// preparo la query<br />
$stpdo = $mypdo->prepare("SELECT * FROM first_table ");<br />
$stpdo->bindColumn(1,$id);<br />
$stpdo->bindColumn(2,$name);<br />
$stpdo->bindColumn(3,$surname);<br />
$stpdo->execute();<br />
while($row = $stpdo->fetch(PDO::FETCH_BOUND))<br />
    echo $id.' '.$name.' '.$surname.'&lt;br /&gt;'; // stampo i nomi<br />
$mypdo->commit();<br />
</code><br />
In pratica specifico prima come devono chiamarsi i dati letti da una query e di che tipo devono essere.<br />
a variabile $id non l&#8217;avevo mai creata, nonostante ciò non ho avuto nessun notice o warning perche&#8217; questa viene popolata e inizializzata ( se inesistente ) automaticamente all&#8217; interno della chiamata a bindColumn.<br />
Poi la variabile viene automaticamente riassegnata ad ogni ciclo del while ,<br />
permettendoci di evitare i soliti $row[N] per il fetch_row o $row['key'] per il fetch_assoc.</p>
<p><strong>bindColumn</strong><br />
<code><br />
$mypdo->beginTransaction();<br />
// preparo la query<br />
$stpdo = $mypdo->prepare("SELECT * FROM first_table ");<br />
$stpdo->bindColumn(1,$id, PDO::PARAM_INT);<br />
$stpdo->bindColumn(2,$name, PDO::PARAM_STR);<br />
$stpdo->bindColumn(3,$surname, PDO::PARAM_STR);<br />
$stpdo->execute();<br />
while($row = $stpdo->fetch(PDO::FETCH_BOUND))<br />
    echo $id.' '.$name.' '.$surname.'&lt;br /&gt;'; // stampo i nomi<br />
$mypdo->commit();<br />
</code></p>
<p>i parametri non modificano il risultato, ma &#8220;forse&#8221; ottimizzano le query</p>
<p>così abbiamo visto anche come funizona PDO::FETCH_BOUND</p>
<p>E se volessi usare Postgres invece di Mysql?<br />
Semplice creo il DB pgsql come quello mysql e basta che cambi queste rige con i diversi parametri di connessione:<br />
<code><br />
$string_dsn = 'pgsql:host=localhost;dbname=pdo'; // pgsql<br />
$string_username = 'user';<br />
$string_password = 'password';<br />
</code></p>
<p>ed il gioco è fatto, bello no?!</p>
<p>Lo studio l&#8217;ho fatto partendo da questi link:</p>
<p><a href="http://it2.php.net/pdo">http://it2.php.net/pdo</a><br />
<a href="http://forum.html.it/forum/showthread.php?s=&#038;postid=8143487">Pillola PDO</a></p>
<p>Gabba Gabba Hey<br />
Bonzo</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.ilbonzo.org/2008/06/16/pdo-abstraction-layer/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>PHP day 2008</title>
		<link>http://blog.ilbonzo.org/2008/05/31/php-day-2008/</link>
		<comments>http://blog.ilbonzo.org/2008/05/31/php-day-2008/#comments</comments>
		<pubDate>Sat, 31 May 2008 05:44:31 +0000</pubDate>
		<dc:creator>Bonzo</dc:creator>
				<category><![CDATA[Programmazione]]></category>
		<category><![CDATA[drupal]]></category>
		<category><![CDATA[joomla]]></category>
		<category><![CDATA[open source]]></category>
		<category><![CDATA[php]]></category>
		<category><![CDATA[zend]]></category>
		<category><![CDATA[eventi]]></category>

		<guid isPermaLink="false">http://blog.ilbonzo.org/2008/05/31/php-day-2008/</guid>
		<description><![CDATA[Venerdì scorso ho partecipato al primo giorno del PHP day 2008.
Rispetto allo scorso anno l&#8217;evento è risultato molto più interessante, forse anche per una mia maggior predisposizione allo scambio di opinioni e battute con i partecipanti. Purtroppo non ho potuto partecipare ai workshop del sabato, speriamo nel prossimo anno.
Ecco il talk che ho apprezzato di [...]]]></description>
			<content:encoded><![CDATA[<p>Venerdì scorso ho partecipato al primo giorno del <a href="http://www.phpday.it/site/">PHP day 2008</a>.<br />
Rispetto allo scorso anno l&#8217;evento è risultato molto più interessante, forse anche per una mia maggior predisposizione allo scambio di opinioni e battute con i partecipanti. Purtroppo non ho potuto partecipare ai workshop del sabato, speriamo nel prossimo anno.</p>
<p>Ecco il talk che ho apprezzato di più:<br />
Nel canale Enterprise si è assistito a un piccolo confronto tra tre CMS tra i più diffusi.</p>
<ul>
<li><a href="http://joomla.org">Joomla</a></li>
<li><a href="http://drupal.org">Drupal</a></li>
<li><a href="http://ez.no">eZpublish</a></li>
</ul>
<p>Avendoli utilizzati tutti e tre, ho apprezzato e seguito con interesse il confronto e la mia piccola conclusione è che Drupal è il miglior compromesso tra potenza e semplicità (ovviamente grazie a views e cck), eZpublish è potentissimo ma adatto a grosse realtà (con le sue 102 tabelle e tutto il resto è forse troppo esoso di risorse per un semplice blog), mentre Joomla rimane un po&#8217; staccato avendo una flessibilità minore rispetto agli altri due, nonostante ciò è quello con un community maggiore, quindi è sempre da tenere d&#8217;occhio. </p>
<p><a rel="shadowbox" href="http://farm3.static.flickr.com/2380/2531637547_c6d74e9f55.jpg?v=0"><img src="http://farm3.static.flickr.com/2380/2531637547_c6d74e9f55.jpg?v=0" alt="I pochi rimasti per i talk finali del venerdì" /></a></p>
<p>Oltre a questo ho fatto in tempo a sentire il talk di Daniele Teti sui Design patterns e quello di <a href="http://www.simonecarletti.com/blog/">Simone Carletti</a> sullo <a href="http://framework.zend.com/">zend framework</a> ed i web services. Quest&#8217;ultimo è stato ricco di esempi e molto interessante, non a caso ho scaricato lo Zend il giorno dopo e penso che, almeno come libreria comicerò ad usarlo. Uno dei suoi vantaggi è proprio il fatto di poter essere usato a pezzi, non costringendo il programmatore a sapere tutto sul framework. </p>
<p>Dal Blog di Fullo un po&#8217; di Link su foto, video e altro dell&#8217;evento.<br />
<a href="http://www.fullo.net/blog/archives/2008/05/29/phpday-2008-un-bellevento-a-meta/">Fullo Blog</a></p>
<p>Ci si vede nel 2009</p>
<p>Gabba Gabba Hey<br />
Bonzo</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.ilbonzo.org/2008/05/31/php-day-2008/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>CakePHP, Blog[2]</title>
		<link>http://blog.ilbonzo.org/2008/02/11/cakephp-blog2/</link>
		<comments>http://blog.ilbonzo.org/2008/02/11/cakephp-blog2/#comments</comments>
		<pubDate>Mon, 11 Feb 2008 12:31:51 +0000</pubDate>
		<dc:creator>Bonzo</dc:creator>
				<category><![CDATA[LinkedIn]]></category>
		<category><![CDATA[cakePHP]]></category>

		<guid isPermaLink="false">http://blog.ilbonzo.org/2008/02/11/cakephp-blog2/</guid>
		<description><![CDATA[Andiamo avanti con la realizzazione del blog scritto con CakePHP.
Devo creare il meccanismo la creazione, modifica e eliminzaione dei post.
Aggiungere i Post
/app/controllers/posts_controller.php

< ?php
class PostsController extends AppController
{
    var $name = 'Posts';
    function index()
    {
        $this->set('posts', $this->Post->findAll());
    }
	function [...]]]></description>
			<content:encoded><![CDATA[<p>Andiamo avanti con la realizzazione del blog scritto con <a href="http://cakephp.org" class="Tips3" title="CakePHP framework web">CakePHP</a>.</p>
<p>Devo creare il meccanismo la creazione, modifica e eliminzaione dei post.</p>
<p><strong>Aggiungere i Post</strong><br />
<em>/app/controllers/posts_controller.php</em><br />
<code><br />
< ?php<br />
class PostsController extends AppController<br />
{<br />
    var $name = 'Posts';<br />
    function index()<br />
    {<br />
        $this->set('posts', $this->Post->findAll());<br />
    }<br />
	function view($id = null)<br />
    {<br />
        $this->Post->id = $id;<br />
        $this->set('post', $this->Post->read());<br />
    }<br />
	function add()<br />
    {<br />
        if (!empty($this->data))<br />
        {<br />
            if ($this->Post->save($this->data))<br />
            {<br />
                $this->flash('Your post has been saved.','/posts');<br />
            }<br />
        }<br />
    }<br />
}<br />
?><br />
</code></p>
<p>Il controller guarda che i dati inviati via POST non siano vuoti, se non lo sono utilizza il metodo per salvare i dati. Con il metodo flash è possibile visualizzare un messaggio che dice se i dati sono stati salvati.<br />
<strong><br />
Creo la vista add</strong><br />
<em>/app/views/posts/add.thtml</em><br />
<code><br />
< &lt;h1&gt;Add Post&lt;/h1&gt;<br />
&lt;form method="post" action="<?php echo $html->url('/posts/add')?>"&gt;<br />
    &lt;p&gt;<br />
        Title:<br />
        < ?php echo $html->input('Post/title', array('size' => '40'))?><br />
        < ?php echo $html->tagErrorMsg('Post/title', 'Title is required.') ?><br />
    &lt;/p&gt;<br />
    &lt;p&gt;<br />
        Body:<br />
        < ?php echo $html->textarea('Post/body', array('rows'=>'10')) ?><br />
        < ?php echo $html->tagErrorMsg('Post/body', 'Body is required.') ?><br />
    &lt;/p&gt;<br />
    &lt;p&gt;<br />
        < ?php echo $html->submit('Save') ?><br />
    &lt;/p&gt;<br />
&lt;/form&gt;<br />
</code></p>
<p>ecco come si visualizza la pagina:<br />
<em>http://localhost/cake/posts/add</em><br />
<a href='http://blog.ilbonzo.org/wp-content/uploads/2008/02/003_add_post.png' title='creazione post' rel='lightbox'><img src='http://blog.ilbonzo.org/wp-content/uploads/2008/02/003_add_post.thumbnail.png' alt='creazione post' /></a></p>
<p><strong>Modifico il modello Post</strong><br />
<em>/app/models/post.php</em><br />
aggiungo la validazione dei dati.</p>
<p><code><br />
< ?php<br />
class Post extends AppModel<br />
{<br />
    var $name = 'Post';<br />
    var $validate = array(<br />
        'title'  => VALID_NOT_EMPTY,<br />
        'body'   => VALID_NOT_EMPTY<br />
    );<br />
}<br />
?></code></p>
<p>L&#8217;array $validate dice a Cake come validare i dati quando è chiamato il metodo save(). I valori per queste chiave si possono vedere in  /cake/libs/validators.php.</p>
<p><code><br />
/**<br />
 * Not empty.<br />
 */<br />
	define('VALID_NOT_EMPTY', '/.+/');<br />
/**<br />
 * Numbers [0-9] only.<br />
 */<br />
	define('VALID_NUMBER', '/^[-+]?\\b[0-9]*\\.?[0-9]+\\b$/');<br />
/**<br />
 * A valid email address.<br />
 */<br />
	define('VALID_EMAIL', '/\\A(?:^([a-z0-9][a-z0-9_\\-\\.\\+]*)@([a-z0-9][a-z0-9\\.\\-]{0,63}\\.(com|org|net|biz|info|name|net|pro|aero|coop|museum|[a-z]{2,4}))$)\\z/i');<br />
/**<br />
 * A valid year (1000-2999).<br />
 */<br />
	define('VALID_YEAR', '/^[12][0-9]{3}$/');<br />
</code></p>
<p>Ecco cosa succede se si prova ad inserire un post senza il titolo:</p>
<p><a href='http://blog.ilbonzo.org/wp-content/uploads/2008/02/004_cake_title_request.png' title='title request' rel='lightbox'><img src='http://blog.ilbonzo.org/wp-content/uploads/2008/02/004_cake_title_request.thumbnail.png' alt='title request' /></a></p>
<p><strong>Cancellare i post, azione delete</strong><br />
<em>/app/controllers/posts_controller.php</em></p>
<p><code><br />
< ?php<br />
class PostsController extends AppController<br />
{<br />
    var $name = 'Posts';<br />
    function index()<br />
    {<br />
        $this->set('posts', $this->Post->findAll());<br />
    }<br />
	function view($id = null)<br />
    {<br />
        $this->Post->id = $id;<br />
        $this->set('post', $this->Post->read());<br />
    }<br />
	function add()<br />
    {<br />
        if (!empty($this->data))<br />
        {<br />
            if ($this->Post->save($this->data))<br />
            {<br />
                $this->flash('Your post has been saved.','/posts');<br />
            }<br />
        }<br />
    }<br />
	function delete($id)<br />
	{<br />
		$this->Post->del($id);<br />
		$this->flash('The post with id: '.$id.' has been deleted.', '/posts');<br />
	}<br />
}<br />
?><br />
</code></p>
<p>Aggiungo il link delete nella vista index<br />
<em>/app/views/posts/index.thtml</em></p>
<p><code><br />
< ?php<br />
echo $html->link(<br />
                'Delete',<br />
                "/posts/delete/{$post['Post']['id']}",<br />
                null,<br />
                'Are you sure?'<br />
            )<br />
?><br />
</code></p>
<p>se clicco mi si apre un alert javascript che mi chiede se sono sicuro.<br />
Se disabilito javascript nel browser il post viene cancellato senza richiesta di conferma.</p>
<p><strong>Modificare i post, azione edit</strong><br />
<em>/app/controllers/posts_controller.php</em></p>
<p><code><br />
	function edit($id = null)<br />
	{<br />
		if (empty($this->data))<br />
		{<br />
			$this->Post->id = $id;<br />
			$this->data = $this->Post->read();<br />
		}<br />
		else<br />
		{<br />
			if ($this->Post->save($this->data['Post']))<br />
			{<br />
				$this->flash('Your post has been updated.','/posts');<br />
			}<br />
		}<br />
	}<br />
</code></p>
<p><strong>Creo la vista edit</strong><br />
<em>/app/views/posts/edit.thtml</em></p>
<p><code><br />
&lt;h1&gt;Edit Post&lt;/h1&gt;<br />
&lt;form method="post" action="< ?php echo $html->url('/posts/edit')?>"&gt;<br />
    < ?php echo $html->hidden('Post/id'); ?><br />
    &lt;p&gt;<br />
        Title:<br />
        < ?php echo $html->input('Post/title', array('size' => '40'))?><br />
        < ?php echo $html->tagErrorMsg('Post/title', 'Title is required.') ?><br />
    &lt;/p&gt;<br />
    &lt;p&gt;<br />
        Body:<br />
        < ?php echo $html->textarea('Post/body', array('rows'=>'10')) ?><br />
        < ?php echo $html->tagErrorMsg('Post/body', 'Body is required.') ?><br />
    &lt;/p&gt;<br />
    &lt;p&gt;<br />
        < ?php echo $html->submit('Save') ?><br />
    &lt;/p&gt;<br />
&lt;/form&gt;<br />
</code></p>
<p>aggiungo il link edit nella vista index<br />
<em>/app/views/posts/index.thtml</em></p>
<p><code><br />
 < ?php echo $html->link('Edit', '/posts/edit/'.$post['Post']['id']);?><br />
</code></p>
<p><strong>Modifica pagina di home</strong><br />
<em>/app/config/routes.php</em></p>
<p>Nel file routes.php ci sono le configurazioni per i controller e le relative viste che si devono aprire per i vari indirizzi.</p>
<p>Modifico commentando<br />
<code><br />
	//$Route->connect('/', array('controller' => 'pages', 'action' => 'display', 'home'));<br />
</code><br />
e settando:<br />
<code><br />
/**<br />
* Collegamento alla pagina index<br />
*<br />
*/<br />
	$Route->connect ('/', array('controller'=>'posts', 'action'=>'index'));<br />
</code><br />
Così andando a http://localhost/cake mi apre direttamente la vista index del controller posts.</p>
<p>Ecco fatto, ora il sistema di gestione dei Post è finito, il prossimo obbiettivo è implementare un sistema di gestione degli utenti che possono inviare i post.</p>
<p>Gabba Gabba Hey<br />
Bonzo</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.ilbonzo.org/2008/02/11/cakephp-blog2/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>CakePHP, Blog [1]</title>
		<link>http://blog.ilbonzo.org/2008/02/05/cakephp-blog-1/</link>
		<comments>http://blog.ilbonzo.org/2008/02/05/cakephp-blog-1/#comments</comments>
		<pubDate>Tue, 05 Feb 2008 12:51:41 +0000</pubDate>
		<dc:creator>Bonzo</dc:creator>
				<category><![CDATA[LinkedIn]]></category>
		<category><![CDATA[cakePHP]]></category>
		<category><![CDATA[php]]></category>
		<category><![CDATA[blog]]></category>
		<category><![CDATA[Programmazione]]></category>

		<guid isPermaLink="false">http://blog.ilbonzo.org/2008/02/05/cakephp-blog-1/</guid>
		<description><![CDATA[Comincio a fare &#8220;sul serio&#8221; con l&#8217;uso di CAkePHP, ora proverò a creare un blog.
Creazione database

Per prima cosa
Ecco alcuni accorgimenti sulle regole che devono seguire le tabelle (naming convention):

I nomi devono essere in plurale inglese (posts ad esempio), in modo che i modelli corrispondenti abbiano nomi in singolare;
tutte le tabelle devono avere una chiave primaria [...]]]></description>
			<content:encoded><![CDATA[<p>Comincio a fare &#8220;sul serio&#8221; con l&#8217;uso di CAkePHP, ora proverò a creare un blog.</p>
<p><strong>Creazione database</strong></p>
<blockquote><p>
Per prima cosa<br />
Ecco alcuni accorgimenti sulle regole che devono seguire le tabelle (naming convention):</p>
<ul>
<li>I nomi devono essere in plurale inglese (posts ad esempio), in modo che i modelli corrispondenti abbiano nomi in singolare;</li>
<li>tutte le tabelle devono avere una chiave primaria chiamata id;
        </li>
<li>le chiavi esterne utilizzate per costruire le relazioni tra le tabelle devono essere nomiate utilizzando il singolare della tabella a cui fanno riferimento seguito da _id (post_id per esempio);</li>
<li> è possibile includere i campi created e modified che verranno automaticamente aggiornati da CakePHP quando si opererà sui record.
</li>
</ul>
<p>Cake contiente una classe <em>inflections</em> che si occupa di ottenere i plurali dei vari nomi.</p>
</blockquote>
<p>Creo il database <strong>blog_cake</strong>.</p>
<p>Creo la tabella <strong>posts</strong>.<br />
<code><br />
/* First, create our posts table: */<br />
CREATE TABLE posts (<br />
    id INT UNSIGNED AUTO_INCREMENT PRIMARY KEY,<br />
    title VARCHAR(50),<br />
    body TEXT,<br />
    created DATETIME DEFAULT NULL,<br />
    modified DATETIME DEFAULT NULL<br />
);<br />
</code><br />
<code><br />
/* Then insert some posts for testing: */<br />
INSERT INTO posts (title,body,created)<br />
    VALUES ('il titolo', 'Questo è il contenuto di un post.', NOW());<br />
INSERT INTO posts (title,body,created)<br />
    VALUES ('secondo titolo', 'Altro contenuto di un post.', NOW());<br />
INSERT INTO posts (title,body,created)<br />
    VALUES ('Divetimento', 'Divertiamoci.', NOW());<br />
</code></p>
<p>Imposto i dati di connessione al database nel file <em>/app/config/database.php</em><br />
<code><br />
var $default = array('driver'   => 'mysql',<br />
                     'connect'  => 'mysql_pconnect',<br />
                     'host'     => 'localhost',<br />
                     'login'    => '<utente>',<br />
                     'password' => '
<password>',<br />
                     'database' => 'blog_cakel' );
</password></utente></code></p>
<p>Cake contiene una Classe AppModel da cui si parte per ottenere i nuovi modelli, estendendo tale classe di partenza.</p>
<p><strong>Creo il modello Post:</strong></p>
<p><em>/app/models/post.php</em></p>
<p><code><br />
< ?php<br />
class Post extends AppModel<br />
{<br />
    var $name = 'Post';<br />
}<br />
?><br />
</code></p>
<p><strong>Creo il controller Post</strong><br />
Dato che abbiamo deciso di seguire le convenzioni sui nomi sarà possibile accedere ai modelli implementati direttamente attraverso $this->NOME_MODELLO.<br />
<em>/app/controllers/posts_controller.php</em></p>
<p><code>< ?php<br />
class PostsController extends AppController<br />
{<br />
    var $name = 'Posts';<br />
}<br />
?><br />
</code></p>
<p>Ci aggiungo l&#8217;azione index</p>
<p><code><br />
< ?php<br />
class PostsController extends AppController<br />
{<br />
    var $name = 'Posts';<br />
    function index()<br />
    {<br />
        $this->set('posts', $this->Post->findAll());<br />
    }<br />
}<br />
?></code></p>
<p>Il metodo index registra un array con tutti i post inseriti utilizzando il metodo set, che rende disponibile questo array alla vista.</p>
<p><strong>Creo la vista index</strong><br />
<em><br />
/app/views/posts/index.thtml</em></p>
<p><code><br />
&lt;h1&gt;Blog&lt;/h1&gt;<br />
    < ?php foreach ($posts as $post): ?><br />
    &lt;dl&gt;<br />
		&lt;dt&gt;<br />
		&lt;h3&gt;< ?php echo $html->link($post['Post']['title'], "/posts/view/".$post['Post']['id']); ?>&lt;/h3&gt;<br />
        < ?php<br />
			echo $post['Post']['id'];<br />
			echo '&lt;br/&gt;';<br />
			echo $post['Post']['created'];<br />
			echo '&lt;br/&#038;gt';<br />
			echo '&lt;br/&gt;';<br />
		?><br />
		&lt;/dt&gt;<br />
		&lt;dd&gt;<br />
		< ?php<br />
			echo $post['Post']['body'];<br />
		?><br />
		&lt;/dd&gt;<br />
	&lt;/dl&gt;<br />
   < ?php endforeach; ?><br />
</code></p>
<p>Vado con il browser all&#8217;indirizzo:<br />
<em>http://localhost/cake/posts/</em><br />
ed ecco il risultato:</p>
<p><a href='http://blog.ilbonzo.org/wp-content/uploads/2008/01/001_post.PNG' title='cakePHP blog' rel='lightbox'><img src='http://blog.ilbonzo.org/wp-content/uploads/2008/01/001_post.thumbnail.PNG' alt='cakePHP blog' /></a></p>
<p>Ora aggiungo l&#8217;azione view al controller, per gestire la visualizzazione di un singolo post.</p>
<p><code><br />
< ?php<br />
class PostsController extends AppController<br />
{<br />
    var $name = 'Posts';<br />
    function index()<br />
    {<br />
        $this->set('posts', $this->Post->findAll());<br />
    }<br />
	function view($id = null)<br />
    {<br />
        $this->Post->id = $id;<br />
        $this->set('post', $this->Post->read());<br />
    }<br />
}<br />
?><br />
</code></p>
<p><strong>Creo la vista view</strong><br />
<em>/app/views/posts/view.thtml</em></p>
<p><code><br />
&lt;h2&gt;< ?php echo $post['Post']['title']?>&lt;/h2&gt;<br />
&lt;p&gt;&lt;small&gt;Created: < ?php echo $post['Post']['created']?>&lt;/small&gt;&lt;/p&gt;<br />
&lt;p&gt;< ?php echo $post['Post']['body']?>&lt;/p&gt;<br />
</code></p>
<p>Ora se clicco sul titolo del primo post, mi sposto all&#8217;indirizzo:<br />
<em>http://localhost/cake/posts/view/1</em></p>
<p>e vedo la vista view di questo post.</p>
<p><a href='http://blog.ilbonzo.org/wp-content/uploads/2008/02/002_single_post1.png' title='post singolo' rel='lightbox'><img src='http://blog.ilbonzo.org/wp-content/uploads/2008/02/002_single_post1.thumbnail.png' alt='post singolo' /></a></p>
<p>Così ho completato tutte le pagine per visualizzare il blog, la prossima volta passo alle pagine per inserimento, modifica e cancellazione dei post.</p>
<p>Gabba Gabba Hey<br />
Bonzo</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.ilbonzo.org/2008/02/05/cakephp-blog-1/feed/</wfw:commentRss>
		<slash:comments>6</slash:comments>
		</item>
		<item>
		<title>Plugin shadowbox per wordpress</title>
		<link>http://blog.ilbonzo.org/2008/01/31/plugin-shadowbox-per-wordpress/</link>
		<comments>http://blog.ilbonzo.org/2008/01/31/plugin-shadowbox-per-wordpress/#comments</comments>
		<pubDate>Thu, 31 Jan 2008 07:55:22 +0000</pubDate>
		<dc:creator>Bonzo</dc:creator>
				<category><![CDATA[Javascript]]></category>
		<category><![CDATA[wordpress]]></category>
		<category><![CDATA[mootools]]></category>

		<guid isPermaLink="false">http://blog.ilbonzo.org/2008/01/31/plugin-shadowbox-per-wordpress/</guid>
		<description><![CDATA[Ho letto di questo componente Shadowbox che è una specie di Lightbox, slimbox che consente di inserire molti tipi di contenuti: non solo foto ma video da youtube, animazioni flash, pagine html, ecc..    
Ho quindi pensato di provare a creare il mio primo plugin per wordpress integrando questo componente.
Qui intanto gli esempi [...]]]></description>
			<content:encoded><![CDATA[<p>Ho letto di questo componente <a href="http://mjijackson.com/shadowbox/">Shadowbox</a> che è una specie di Lightbox, slimbox che consente di inserire molti tipi di contenuti: non solo foto ma video da youtube, animazioni flash, pagine html, ecc..    </p>
<p>Ho quindi pensato di provare a creare il mio primo plugin per wordpress integrando questo componente.</p>
<p>Qui intanto gli esempi di come funziona Shadowbox:</p>
<h2><a name="demos">Demos</a></h2>
<h3>Images</h3>
<p>
        <a rel="shadowbox" href="http://farm2.static.flickr.com/1177/1150569783_61dbc56834.jpg" class="option">Single Image (Flickr)</a><br />
        <a rel="shadowbox[Aston Martin]" href="http://blog.ilbonzo.org/gallery/aston_martin/vantage.jpg" class="option" title="Aston Martin Vantage">Image Gallery</a></p>
<p>        <a rel="shadowbox[Aston Martin]" href="http://blog.ilbonzo.org/gallery/aston_martin/vanquish.jpg" class="hidden" title="Aston Martin Vanquish S">image</a><br />
        <a rel="shadowbox[Aston Martin]" href="http://blog.ilbonzo.org/gallery/aston_martin/db9.jpg" class="hidden" title="Aston Martin DB9">image</a>
    </p>
<h3><a name="lgimage-demo">Large Image</a></h3>
<p>You may have to shrink your browser window to view the effect here. See the <a href="#handlelgimages">handleLgImages</a> option for more information.</p>
<table class="thumbs" border="0" cellspacing="0" cellpadding="0">
<tr>
<td>Clipped (no resizing)</td>
<td>Resized</td>
<td>Draggable</td>
</tr>
<tr>
<td><a rel="shadowbox;options={handleLgImages:'none'}" href="http://blog.ilbonzo.org/gallery/greatwall.jpg" title="Great Wall of China"><img src="http://blog.ilbonzo.org/gallery/greatwall-thumb.jpg" alt=""></a></td>
<td><a rel="shadowbox" href="http://blog.ilbonzo.org/gallery/greatwall.jpg" title="Great Wall of China"><img src="http://blog.ilbonzo.org/gallery/greatwall-thumb.jpg" alt=""></a></td>
<td><a rel="shadowbox;options={handleLgImages:'drag'}" href="http://blog.ilbonzo.org/gallery/greatwall.jpg" title="Great Wall of China"><img src="http://blog.ilbonzo.org/gallery/greatwall-thumb.jpg" alt=""></a></td>
</tr>
</table>
<h3>Thumb Gallery</h3>
<p>Unlike the previous image gallery, this one is triggered by thumbnail links. It also uses a <a href="#countertype">skip counter</a> and is <a href="#continuous">continuous</a>.</p>
<table class="thumbs" border="0" cellspacing="0" cellpadding="0">
<tr>
<td><a rel="shadowbox[MustangThumbs];options={counterType:'skip',continuous:true}" href="http://blog.ilbonzo.org/gallery/mustang/red.jpg"><img src="http://blog.ilbonzo.org/gallery/mustang/red-thumb.jpg" alt="Red"></a></td>
<td><a rel="shadowbox[MustangThumbs];options={counterType:'skip',continuous:true}" href="http://blog.ilbonzo.org/gallery/mustang/blue.jpg"><img src="http://blog.ilbonzo.org/gallery/mustang/blue-thumb.jpg" alt="Red"></a></td>
<td><a rel="shadowbox[MustangThumbs];options={counterType:'skip',continuous:true}" href="http://blog.ilbonzo.org/gallery/mustang/grey.jpg"><img src="http://blog.ilbonzo.org/gallery/mustang/grey-thumb.jpg" alt="Red"></a></td>
</tr>
</table>
<h3>Flash</h3>
<p>
        <a rel="shadowbox;width=400;height=300" class="option" title="Girl Skipping" href="http://blog.ilbonzo.org/gallery/skip.swf">Single SWF</a><br />
        <a id="flash1" rel="width=600;height=450" class="option" title="Hollywood or Bust" href="http://blog.ilbonzo.org/gallery/old_man.swf">SWF Gallery</a><br />
        <a rel="shadowbox;width=600;height=450" class="option" title="Alien" href="http://blog.ilbonzo.org/gallery/alien.flv">Flash Video</a></p>
<h3>Movies</h3>
<p>
        <a rel="shadowbox;width=292;height=218" class="option" title="Unfortunate Kayaker" href="http://blog.ilbonzo.org/gallery/kayak.mov">Single Movie (mov)</a><br />
        <a rel="shadowbox;width=292;height=218;options={showMovieControls:false}" class="option" title="Unfortunate Kayaker" href="http://blog.ilbonzo.org/gallery/kayak.mp4">Single Movie (mpeg-4, controller disabled)</a><br />
        <a rel="shadowbox;width=318;height=218;options={autoplayMovies:false}" class="option" title="Unfortunate Kayaker" href="http://blog.ilbonzo.org/gallery/kayak.avi">Single Movie (avi, autoplay disabled)</a></p>
<p>        <a rel="shadowbox;width=320;height=240" class="option" title="Curious Cat" href="http://blog.ilbonzo.org/gallery/cat.wmv">Single Movie (wmv)</a><br />
        <a rel="shadowbox;width=640;height=272" class="option" title="Beowulf Trailer" href="http://images.apple.com/movies/paramount/beowulf/beowulf-tr2_h.640.mov">Apple.com Trailer</a><br />
        <a rel="shadowbox;width=405;height=340" class="option" title="David Beckham" href="http://www.youtube.com/v/wbzLpteC8ng&amp;autoplay=1">YouTube</a><br />
        <a rel="shadowbox;width=405;height=340" class="option" title="While My Ukulele Gently Weeps" href="http://video.google.com/googleplayer.swf?docid=1352016870638076087&amp;autoplay=1">Google Video</a><br />
        <a rel="shadowbox[Movies];width=405;height=340;options={continuous:true}" class="option" title="YouTube" href="http://www.youtube.com/v/JPSzcRbFArA&amp;autoplay=1">Movie Gallery</a><br />
        <a rel="shadowbox[Movies];width=292;height=218" class="hidden" title="QuickTime" href="gallery/kayak.mov">MOV</a></p>
<p>        <a rel="shadowbox[Movies];width=320;height=240" class="hidden" title="Windows Media" href="http://blog.ilbonzo.org/gallery/cat.wmv">WMV</a><br />
        <a rel="shadowbox[Movies];width=600;height=450" class="hidden" title="Flash Video" href="http://blog.ilbonzo.org/gallery/alien.flv">FLV</a><br />
        <a rel="shadowbox" class="option" title="Google.com" href="http://www.google.com/">External Website</a><br />
        <a rel="shadowbox" class="option" title="This page" href="http://blog.ilbonzo.org/">This page</a><br />
        <a rel="shadowbox[Mixed];options={counterType:'skip',continuous:true}" class="option" title="JPG" href="gallery/aston_martin/vanquish.jpg">Mixed Content Gallery</a><br />
        <a rel="shadowbox[Mixed];width=520;height=390" class="hidden" title="SWF" href="http://blog.ilbonzo.org/gallery/caveman.swf">swf</a></p>
<p>        <a rel="shadowbox[Mixed];width=292;height=218" class="hidden" title="MPEG-4" href="http://blog.ilbonzo.org/gallery/kayak.mp4">movie</a><br />
        <a rel="shadowbox[Mixed]" class="hidden" title="IFRAME" href="http://blog.ilbonzo.org/">iframe</a>
    </p>
<p>Il Plugin è molto semplice, basta caricare la cartella che si ottiene scompattando l&#8217;archivio compresso nelal cartella /wp-content/plugins, andare nella parte di amministrazione e attivare il plugin.</p>
<p>Per utilizzarlo basta aggiungere <strong>rel=&#8221;shadowbox&#8221;</strong> ai link che volete aprire in questo modo.</p>
<p>ecco un po&#8217; di esempi presi dal sito di <a href="http://mjijackson.com/shadowbox/">shadowbox</a></p>
<p><code></p>
<h3><a name="markup">Markup</a></h3>
<p>The simplest way to use Shadowbox is through your HTML markup. At the very least, you must add a <code>rel="shadowbox"</code> attribute to your links. For example, say you have this link to an image on your page:</p>
<pre>&lt;a href="myimage.jpg">My Image&lt;/a></pre>
<p>In order to set up this link for use with Shadowbox, simply change it to this:</p>
<pre>&lt;a href="myimage.jpg" rel="shadowbox">My Image&lt;/a></pre>
<p>If you would like to display a title for your image, simply add a <code>title</code> attribute to the link.</p>
<pre>&lt;a href="myimage.jpg" rel="shadowbox" title="My Image">My Image&lt;/a></pre>
<p>You must explicitly tell Shadowbox the dimensions to use to display content other than images. This is done by adding a few parameters to the end of the <code>rel</code> attribute, separated by semi-colons (like a CSS style declaration). To specify a movie's height and width, use the <code>height</code> and <code>width</code> parameters. Note: unlike in CSS, these values must always be specified in pixels.</p>
<pre>&lt;a href="mymovie.swf" rel="shadowbox;height=140;width=120">My Movie&lt;/a></pre>
<p>Additionally, you may set Shadowbox options on a per-link basis. To do this, you must include a <a href="http://www.json.org/">JSON</a>-formatted parameter called <code>options</code>. An example could be:</p>
<pre>&lt;a href="myimage.jpg" rel="shadowbox;options={overlayOpacity: 0.5, resize: false}">My Image&lt;/a></pre>
<p>In addition to displaying single images and movies, Shadowbox is also capable of displaying galleries of content. In order to designate a link as part of a gallery, you must add the gallery name to the <code>rel</code> attribute between square brackets immediately following the word "shadowbox". For example, the following markup creates a gallery called "Vacation" with two pictures:</p>
<pre>&lt;a href="beach.jpg" rel="shadowbox[Vacation]">The Beach&lt;/a>
&lt;a href="pier.jpg" rel="shadowbox[Vacation]">The Pier&lt;/a></pre>
<p>Galleries may be composed of content of many different types. The following markup is a compressed version of the last <a href="#demos">demo</a> above. It demonstrates how various media can be combined into a single gallery.</p>
<pre>&lt;a rel="shadowbox[Mixed];options={counterType:'skip',continuous:true}" href="vanquish.jpg">jpg&lt;/a>
&lt;a rel="shadowbox[Mixed];width=520;height=390" href="caveman.swf">swf&lt;/a>
&lt;a rel="shadowbox[Mixed];width=292;height=218" href="kayak.mp4">movie&lt;/a>
&lt;a rel="shadowbox[Mixed]" href="index.html">iframe&lt;/a></pre>
<p></code></p>
<p>Per ora il plugin funziona con mootools, ma è facilmente adattabile ad altre librerie javascript, visto che shqdowbox include i vari adapter per queste librerie.</p>
<ul>
<li><a href="http://developer.yahoo.com/yui/">Yahoo! User Interface Library</a> (yahoo, dom, event, anim)</li>
<li><a href="http://extjs.com">Ext</a> (standalone, ext-core.js)</li>
<li><a href="http://prototypejs.org/">Prototype</a> + <a href="http://script.aculo.us/">Scriptaculous</a></li>
<li><a href="http://jquery.com/">jQuery</a></li>
<li><a href="http://mootools.net/">MooTools</a> (requires Fx.Styles and its dependancies)</li>
<li><a href="http://dojotoolkit.org/">Dojo Toolkit</a> (thanks Peter Higgins)</li>
</ul>
<p><a href="http://blog.ilbonzo.org/upload/shadowbox.tar.gz">Scarica il plugin versione 0.1</a><br />
Ovviamente spero che se ci sono reeori qualcuno me lo segnali.</p>
<p>Gabba Gabba Hey<br />
Bonzo</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.ilbonzo.org/2008/01/31/plugin-shadowbox-per-wordpress/feed/</wfw:commentRss>
		<slash:comments>14</slash:comments>
<enclosure url="http://blog.ilbonzo.org/gallery/kayak.mov" length="860878" type="video/quicktime" />
<enclosure url="http://blog.ilbonzo.org/gallery/kayak.mp4" length="848200" type="video/mp4" />
<enclosure url="http://blog.ilbonzo.org/gallery/kayak.avi" length="1519768" type="video/x-msvideo" />
<enclosure url="http://blog.ilbonzo.org/gallery/cat.wmv" length="422489" type="video/x-ms-wmv" />
<enclosure url="http://images.apple.com/movies/paramount/beowulf/beowulf-tr2_h.640.mov" length="120" type="video/quicktime" />
		</item>
	</channel>
</rss>
