<?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>Consulenza-Web.com &#187; coding</title>
	<atom:link href="http://www.consulenza-web.com/tag/coding/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.consulenza-web.com</link>
	<description>Blog di Marco Pegoraro su Consulenza Web ed Informatica, Programmazione Web e realizzazione di Siti Web Accessibili.</description>
	<lastBuildDate>Mon, 30 Jan 2012 08:39:56 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3.1</generator>
		<item>
		<title>Struttura di un plugin jQuery</title>
		<link>http://www.consulenza-web.com/2012/01/struttura-di-un-plugin-jquery/</link>
		<comments>http://www.consulenza-web.com/2012/01/struttura-di-un-plugin-jquery/#comments</comments>
		<pubDate>Wed, 18 Jan 2012 17:13:12 +0000</pubDate>
		<dc:creator>peg</dc:creator>
				<category><![CDATA[jQuery]]></category>
		<category><![CDATA[Tutorial]]></category>
		<category><![CDATA[best practice]]></category>
		<category><![CDATA[closure]]></category>
		<category><![CDATA[coding]]></category>
		<category><![CDATA[jquery ui]]></category>
		<category><![CDATA[metodo]]></category>
		<category><![CDATA[ottimizzazione]]></category>
		<category><![CDATA[plugin]]></category>
		<category><![CDATA[prestazioni]]></category>
		<category><![CDATA[widget]]></category>

		<guid isPermaLink="false">http://www.consulenza-web.com/?p=497</guid>
		<description><![CDATA[In questo articolo voglio approfondire alcuni accorgimenti utili a migliorare le prestazioni, l&#8217;utilizzo e l&#8217;organizzazione di un plugin jQuery. Qualunque tipo di funzione/effetto e/o trasformazione del DOM di una pagina web può essere incorporata in un plugin jQuery con lo scopo di migliorare l&#8217;organizzazione del proprio codice Javascript. Invece di un&#8217;accozzaglia di istruzioni generiche avremo [...]]]></description>
			<content:encoded><![CDATA[<p>In questo articolo voglio approfondire alcuni accorgimenti utili a migliorare le prestazioni, l&#8217;utilizzo e l&#8217;organizzazione di un <strong>plugin jQuery</strong>.</p>
<p>Qualunque tipo di funzione/effetto e/o trasformazione del DOM di una pagina web può essere incorporata in un plugin jQuery con lo scopo di <strong>migliorare l&#8217;organizzazione del proprio codice Javascript</strong>.<br />
Invece di un&#8217;accozzaglia di istruzioni generiche avremo il riferimento ad un set ordinato di plugins.</p>
<p><a title="Codice sorgente completo dell'articolo" href="http://jsbin.com/apojah/14/edit/" class="aga aga_1" target="_blank">http://jsbin.com/apojah/14/edit/</a></p>
<p><span id="more-497"></span></p>
<h2>Wrapper jQuery:</h2>
<p>Il primo accorgimento utile è incorporare il codice del plugin in un <strong>oggetto wrapper</strong> il cui scopo è duplice:</p>
<ol>
<li>isolare il codice del plugin dallo spazio degli script della pagina</li>
<li>utilizzare <strong>$</strong> come riferimento interno a jQuery in modo sicuro</li>
</ol>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>0
1
2
</pre></td><td class="code"><pre class="javascript" style="font-family:monospace;"><span style="color: #339933;">;</span><span style="color: #009900;">&#40;</span><span style="color: #003366; font-weight: bold;">function</span><span style="color: #009900;">&#40;</span>$<span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span>
... <span style="color: #660066;">qui</span> va il codice del plugin ...
<span style="color: #009900;">&#125;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#40;</span>jQuery<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></pre></td></tr></table></div>

<p>Tutte le variabili dichiarate mediante la sintassi &#8220;var&#8221; saranno locali al plugin mentre rimane possibile accedere a variabili globali dichiarate esternamente.</p>
<p>Passare la variabile &#8220;jQuery&#8221; al wrapper rende possibile l&#8217;utilizzo della funzione <strong>$</strong> tipica di jQuery all&#8217;interno del codice del nostro plugin anche in presenza di altri framework esterni (es MooTools).</p>
<h2>Struttura base del plugin:</h2>
<p>Un plugin è un&#8217;estensione di jQuery che agisce su di un <em>contesto</em> formato da un elenco di <em>nodi DOM</em> identificati da una query xPath.</p>
<pre>$('p').hide();</pre>
<p>La precedente istruzione identifica un <em>elenco di nodi DOM</em> composto da tutti i paragrafi (p) presenti nel documento HTML e passa tale contesto alla funzione <em>hide()</em> di jQuery. Tale funzione restituisce il contesto stesso rendendo possibile la concatenazione di più plugins:</p>
<pre>$('p').hide().fadeIn();</pre>
<p>Per questo motivo il codice base del nostro plugin sarà:</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>0
1
2
3
4
5
6
7
8
</pre></td><td class="code"><pre class="javascript" style="font-family:monospace;">$.<span style="color: #660066;">fn</span>.<span style="color: #660066;">customPlugin</span> <span style="color: #339933;">=</span> <span style="color: #003366; font-weight: bold;">function</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
&nbsp;
  $<span style="color: #009900;">&#40;</span><span style="color: #000066; font-weight: bold;">this</span><span style="color: #009900;">&#41;</span>.<span style="color: #660066;">each</span><span style="color: #009900;">&#40;</span><span style="color: #003366; font-weight: bold;">function</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span>
    ... <span style="color: #660066;">azioni</span> sul singolo elemento DOM ...
  <span style="color: #009900;">&#125;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>  
&nbsp;
  <span style="color: #000066; font-weight: bold;">return</span> <span style="color: #000066; font-weight: bold;">this</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #009900;">&#125;</span><span style="color: #339933;">;</span></pre></td></tr></table></div>

<p>Viene eseguito un ciclo applicando una funzione ad ogni elemento del contesto. Successivamente il plugin restituisce il contesto stesso per consentire la concatenazione dei plugins come accennato sopra.</p>
<h2>Ottimizziamo il ciclo sul contesto:</h2>
<p>E&#8217; importante capire che in Javascript ogni <em>function()</em> è trattata come un oggetto.<br />
Il codice di questo esempio, seppur molto diffuso, crea un <strong>nuovo oggetto</strong> per ogni elemento di contesto quindi <strong>incide significativamente sulla memoria e sulla prestazioni</strong> del plugin stesso.</p>
<p>Possiamo <strong>ottimizzare</strong> il tutto spostando la logica applicata al singolo elemento in una funzione esterna locale al wrapper del plugin:</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>0
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
</pre></td><td class="code"><pre class="javascript" style="font-family:monospace;"><span style="color: #339933;">;</span><span style="color: #009900;">&#40;</span><span style="color: #003366; font-weight: bold;">function</span><span style="color: #009900;">&#40;</span>$<span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span>
&nbsp;
  <span style="color: #006600; font-style: italic;">/**
   * Metodo locale utilizzato dal plugin jQuery sugli elementi DOM
   *
   */</span>
  <span style="color: #003366; font-weight: bold;">var</span> __loop <span style="color: #339933;">=</span> <span style="color: #003366; font-weight: bold;">function</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
&nbsp;
    $<span style="color: #009900;">&#40;</span><span style="color: #000066; font-weight: bold;">this</span><span style="color: #009900;">&#41;</span>.<span style="color: #660066;">fadeOut</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span>.<span style="color: #660066;">fadeIn</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
  <span style="color: #009900;">&#125;</span><span style="color: #339933;">;</span>
&nbsp;
  <span style="color: #006600; font-style: italic;">/**
   * Plugin - Estensione jQuery
   */</span>
  $.<span style="color: #660066;">fn</span>.<span style="color: #660066;">customPlugin</span> <span style="color: #339933;">=</span> <span style="color: #003366; font-weight: bold;">function</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
&nbsp;
    <span style="color: #006600; font-style: italic;">// Applico la logica agli elementi del contesto (DOM)</span>
    $<span style="color: #009900;">&#40;</span><span style="color: #000066; font-weight: bold;">this</span><span style="color: #009900;">&#41;</span>.<span style="color: #660066;">each</span><span style="color: #009900;">&#40;</span>__loop<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
    <span style="color: #006600; font-style: italic;">// Mantengo la possibilità di concatenare plugins.</span>
    <span style="color: #000066; font-weight: bold;">return</span> <span style="color: #000066; font-weight: bold;">this</span><span style="color: #339933;">;</span>
&nbsp;
  <span style="color: #009900;">&#125;</span><span style="color: #339933;">;</span> <span style="color: #006600; font-style: italic;">// EndOf: &quot;customPlugin()&quot; ###</span>
&nbsp;
<span style="color: #009900;">&#125;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#40;</span>jQuery<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></pre></td></tr></table></div>

<p>In riga <em>#19</em> applichiamo la funzione <em>__fn()</em> che è definita esterna al plugin ma localmente al wrapper creato. In questo modo Javascript utilizzerà sempre il medesimo oggetto passando di volta in volta dati differenti.</p>
<p>Questo concetto è estremamente importante in quanto con jQuery è utilizzo comune passare nuove funzioni come parametri di metodi applicati ad elementi DOM. Aver cura di definire tali funzioni (solitamente callback) in modo esplicito nel wrapper del plugin è fondamentale per migliorare le prestazioni del nostro codice.</p>
<h2>Configurazione del Plugin:</h2>
<p>Praticamente il 100% dei plugins jQuery utilizzano il primo parametro passato come oggetto di configurazione interna.</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>0
1
2
3
</pre></td><td class="code"><pre class="javascript" style="font-family:monospace;">$<span style="color: #009900;">&#40;</span><span style="color: #3366CC;">'p'</span><span style="color: #009900;">&#41;</span>.<span style="color: #660066;">customPlugin</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#123;</span>
speed<span style="color: #339933;">:</span><span style="color: #3366CC;">'fast'</span><span style="color: #339933;">,</span>
color<span style="color: #339933;">:</span><span style="color: #3366CC;">'red'</span>
<span style="color: #009900;">&#125;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></pre></td></tr></table></div>

<p>Una configurazione classica consiste in un oggetto le cui proprietà sono utilizzate dalla logica interna al plugin stesso per personalizzare le funzionalità erogate secondo diverse esigenze.</p>
<p>L&#8217;utilizzo di un oggetto di configurazione fa nascere alcune problematiche di organizzazione del codice quali:</p>
<ul>
<li>necessità di applicare dei <strong>valori di default</strong> per opzioni non rese esplicite</li>
<li>necessità di <strong>passare l&#8217;oggetto di configurazione</strong> alla funzione <em>__loop()</em></li>
</ul>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>0
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
</pre></td><td class="code"><pre class="javascript" style="font-family:monospace;">$.<span style="color: #660066;">fn</span>.<span style="color: #660066;">customPlugin</span> <span style="color: #339933;">=</span> <span style="color: #003366; font-weight: bold;">function</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
&nbsp;
  <span style="color: #006600; font-style: italic;">// Proprietà di configurazione interna.</span>
  <span style="color: #003366; font-weight: bold;">var</span> cfg <span style="color: #339933;">=</span> <span style="color: #003366; font-weight: bold;">false</span><span style="color: #339933;">;</span>
&nbsp;
  <span style="color: #006600; font-style: italic;">// Estendo la proprietà di configurazione con l'oggetto di</span>
  <span style="color: #006600; font-style: italic;">// configurazione contenuto nel primo parametro del plugin.</span>
  <span style="color: #000066; font-weight: bold;">if</span> <span style="color: #009900;">&#40;</span> <span style="color: #339933;">!</span>arguments.<span style="color: #660066;">length</span> <span style="color: #339933;">||</span> $.<span style="color: #660066;">isPlainObject</span><span style="color: #009900;">&#40;</span>arguments<span style="color: #009900;">&#91;</span><span style="color: #CC0000;">0</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
&nbsp;
    cfg <span style="color: #339933;">=</span> $.<span style="color: #660066;">extend</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#123;</span><span style="color: #009900;">&#125;</span><span style="color: #339933;">,</span><span style="color: #009900;">&#123;</span>
      color<span style="color: #339933;">:</span> <span style="color: #3366CC;">'black'</span>
    <span style="color: #009900;">&#125;</span><span style="color: #339933;">,</span>arguments<span style="color: #009900;">&#91;</span><span style="color: #CC0000;">0</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
  <span style="color: #009900;">&#125;</span>
&nbsp;
  <span style="color: #006600; font-style: italic;">// Applico la logica agli elementi del contesto (DOM)</span>
  $<span style="color: #009900;">&#40;</span><span style="color: #000066; font-weight: bold;">this</span><span style="color: #009900;">&#41;</span>.<span style="color: #660066;">each</span><span style="color: #009900;">&#40;</span><span style="color: #003366; font-weight: bold;">function</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span> __loop.<span style="color: #660066;">call</span><span style="color: #009900;">&#40;</span> <span style="color: #000066; font-weight: bold;">this</span><span style="color: #339933;">,</span> cfg <span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span> <span style="color: #009900;">&#125;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
  <span style="color: #006600; font-style: italic;">// Mantengo la possibilità di concatenare plugins.</span>
  <span style="color: #000066; font-weight: bold;">return</span> <span style="color: #000066; font-weight: bold;">this</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #009900;">&#125;</span><span style="color: #339933;">;</span></pre></td></tr></table></div>

<p>Come prima cosa si noti l&#8217;aggiunta di una proprietà locale al plugin <strong>cfg</strong> la quale è instanziata a <em>false</em> e successivamente estesa da un oggetto contenente la <strong>configurazione di default</strong> del plugin stesso. (riga <em>#3</em> -&gt; <em>#13</em>)</p>
<p>La configurazione è contenuta nel primo parametro tra quelli passati al plugin, inoltre il valore di <em>cfg</em> viene modificato <strong>solamente se tale parametro è un oggetto</strong>. Questo condizionale è la base di una semplice tecnica per utilizzare il medesimo plugin con <strong>tipi di input differenti</strong> come avviene in quasi tutti i widget di jQuery UI.</p>
<pre>$('#foo').dialog({ .. config .. }).dialog('open');</pre>
<h2>Utilizziamo le Closures:</h2>
<p>Anche la riga <em>#16</em> è cambiata: abbiamo dovuto aggiungere una <strong>closure</strong> per consentire il passaggio della configurazione alla funzione locale <em>__loop()</em>.</p>
<p>L&#8217;utilizzo della <em>closure</em> è un <strong>compromesso di ottimizzazione</strong>.</p>
<p>Cerchiamo di isolare tutta la logica possibile in una funzione esterna che verrà invocata con parametri diversi dal codice interno alla closure. La closure verrà invece creata per ogni elemento DOM del contesto causando un leggero spreco di memoria.</p>
<p><strong>Mantenere essenziale il codice delle <em>closure</em> demandando tutta la logica a funzioni esterne è importantissimo per garantire buone performance al nostro codice!</strong></p>
<h2>Rispondere a diversi tipi di input:</h2>
<p>Abbiamo accennato a jQueryUI ed a come metta a disposizione una serie di widget la cui caratteristica comune è <strong>erogare comportamenti diversi in base a tipi di chiamate diverse:</strong></p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>0
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
</pre></td><td class="code"><pre class="javascript" style="font-family:monospace;"><span style="color: #009900;">&#40;</span><span style="color: #003366; font-weight: bold;">function</span><span style="color: #009900;">&#40;</span>$<span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span>
&nbsp;
  <span style="color: #006600; font-style: italic;">/**
   * Logic methods
   */</span>
&nbsp;
  <span style="color: #003366; font-weight: bold;">var</span> __loop <span style="color: #339933;">=</span> <span style="color: #003366; font-weight: bold;">function</span><span style="color: #009900;">&#40;</span> cfg <span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
&nbsp;
    $<span style="color: #009900;">&#40;</span><span style="color: #000066; font-weight: bold;">this</span><span style="color: #009900;">&#41;</span>.<span style="color: #660066;">data</span><span style="color: #009900;">&#40;</span> <span style="color: #3366CC;">'customPlugin'</span><span style="color: #339933;">,</span> cfg <span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
  <span style="color: #009900;">&#125;</span><span style="color: #339933;">;</span>
&nbsp;
  <span style="color: #003366; font-weight: bold;">var</span> __colorize <span style="color: #339933;">=</span> <span style="color: #003366; font-weight: bold;">function</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
&nbsp;
    <span style="color: #003366; font-weight: bold;">var</span> cfg <span style="color: #339933;">=</span> $<span style="color: #009900;">&#40;</span><span style="color: #000066; font-weight: bold;">this</span><span style="color: #009900;">&#41;</span>.<span style="color: #660066;">data</span><span style="color: #009900;">&#40;</span><span style="color: #3366CC;">'customPlugin'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
    $<span style="color: #009900;">&#40;</span><span style="color: #000066; font-weight: bold;">this</span><span style="color: #009900;">&#41;</span>.<span style="color: #660066;">css</span><span style="color: #009900;">&#40;</span> <span style="color: #3366CC;">'background-color'</span><span style="color: #339933;">,</span> cfg.<span style="color: #660066;">color</span> <span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
  <span style="color: #009900;">&#125;</span><span style="color: #339933;">;</span>
&nbsp;
  <span style="color: #006600; font-style: italic;">/**
   * Plugin - Estensione jQuery
   */</span>
  $.<span style="color: #660066;">fn</span>.<span style="color: #660066;">customPlugin</span> <span style="color: #339933;">=</span> <span style="color: #003366; font-weight: bold;">function</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
&nbsp;
    <span style="color: #006600; font-style: italic;">// Proprietà di configurazione interna.</span>
    <span style="color: #003366; font-weight: bold;">var</span> cfg <span style="color: #339933;">=</span> <span style="color: #003366; font-weight: bold;">false</span><span style="color: #339933;">;</span>
&nbsp;
    <span style="color: #006600; font-style: italic;">// Estendo la proprietà di configurazione con l'oggetto di</span>
    <span style="color: #006600; font-style: italic;">// configurazione contenuto nel primo parametro del plugin.</span>
    <span style="color: #000066; font-weight: bold;">if</span> <span style="color: #009900;">&#40;</span> <span style="color: #339933;">!</span>arguments.<span style="color: #660066;">length</span> <span style="color: #339933;">||</span> $.<span style="color: #660066;">isPlainObject</span><span style="color: #009900;">&#40;</span>arguments<span style="color: #009900;">&#91;</span><span style="color: #CC0000;">0</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
&nbsp;
      cfg <span style="color: #339933;">=</span> $.<span style="color: #660066;">extend</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#123;</span><span style="color: #009900;">&#125;</span><span style="color: #339933;">,</span><span style="color: #009900;">&#123;</span>
        color<span style="color: #339933;">:</span> <span style="color: #3366CC;">'black'</span>
      <span style="color: #009900;">&#125;</span><span style="color: #339933;">,</span>arguments<span style="color: #009900;">&#91;</span><span style="color: #CC0000;">0</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
    <span style="color: #009900;">&#125;</span>
&nbsp;
    <span style="color: #006600; font-style: italic;">// Inizializzazione Plugin:</span>
    <span style="color: #006600; font-style: italic;">// Applico la logica agli elementi del contesto (DOM)</span>
    <span style="color: #000066; font-weight: bold;">if</span> <span style="color: #009900;">&#40;</span> cfg <span style="color: #339933;">!==</span> <span style="color: #003366; font-weight: bold;">false</span> <span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
      $<span style="color: #009900;">&#40;</span><span style="color: #000066; font-weight: bold;">this</span><span style="color: #009900;">&#41;</span>.<span style="color: #660066;">each</span><span style="color: #009900;">&#40;</span><span style="color: #003366; font-weight: bold;">function</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span> __loop.<span style="color: #660066;">call</span><span style="color: #009900;">&#40;</span> <span style="color: #000066; font-weight: bold;">this</span><span style="color: #339933;">,</span> cfg <span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span> <span style="color: #009900;">&#125;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
    <span style="color: #006600; font-style: italic;">// Azioni su plugin intanziato:</span>
    <span style="color: #009900;">&#125;</span> <span style="color: #000066; font-weight: bold;">else</span> <span style="color: #000066; font-weight: bold;">if</span> <span style="color: #009900;">&#40;</span> arguments.<span style="color: #660066;">length</span> <span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
&nbsp;
      <span style="color: #000066; font-weight: bold;">switch</span> <span style="color: #009900;">&#40;</span> arguments<span style="color: #009900;">&#91;</span><span style="color: #CC0000;">0</span><span style="color: #009900;">&#93;</span> <span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
&nbsp;
        <span style="color: #000066; font-weight: bold;">case</span> <span style="color: #3366CC;">'colorize'</span><span style="color: #339933;">:</span>
          $<span style="color: #009900;">&#40;</span><span style="color: #000066; font-weight: bold;">this</span><span style="color: #009900;">&#41;</span>.<span style="color: #660066;">each</span><span style="color: #009900;">&#40;</span><span style="color: #003366; font-weight: bold;">function</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span> __colorize.<span style="color: #660066;">call</span><span style="color: #009900;">&#40;</span> <span style="color: #000066; font-weight: bold;">this</span> <span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span> <span style="color: #009900;">&#125;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
          <span style="color: #000066; font-weight: bold;">break</span><span style="color: #339933;">;</span>
&nbsp;
      <span style="color: #009900;">&#125;</span>
&nbsp;
    <span style="color: #009900;">&#125;</span>
&nbsp;
    <span style="color: #006600; font-style: italic;">// Mantengo la possibilità di concatenare plugins.</span>
    <span style="color: #000066; font-weight: bold;">return</span> <span style="color: #000066; font-weight: bold;">this</span><span style="color: #339933;">;</span>
&nbsp;
  <span style="color: #009900;">&#125;</span><span style="color: #339933;">;</span> <span style="color: #006600; font-style: italic;">// EndOf: &quot;customPlugin()&quot; ###</span>
&nbsp;
<span style="color: #009900;">&#125;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#40;</span>jQuery<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #006600; font-style: italic;">/**
 * Codice eseguito al caricamento della pagina
 */</span>
$<span style="color: #009900;">&#40;</span>document<span style="color: #009900;">&#41;</span>.<span style="color: #660066;">ready</span><span style="color: #009900;">&#40;</span><span style="color: #003366; font-weight: bold;">function</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span>
&nbsp;
  <span style="color: #006600; font-style: italic;">// Inizializzazione del plugin</span>
  $<span style="color: #009900;">&#40;</span><span style="color: #3366CC;">'p'</span><span style="color: #009900;">&#41;</span>.<span style="color: #660066;">customPlugin</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#123;</span>
    color<span style="color: #339933;">:</span><span style="color: #3366CC;">'red'</span>
  <span style="color: #009900;">&#125;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
  <span style="color: #006600; font-style: italic;">// Esempio di utilizzo delle azioni del plugin</span>
  $<span style="color: #009900;">&#40;</span><span style="color: #3366CC;">'input'</span><span style="color: #009900;">&#41;</span>.<span style="color: #660066;">click</span><span style="color: #009900;">&#40;</span><span style="color: #003366; font-weight: bold;">function</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span>
&nbsp;
    $<span style="color: #009900;">&#40;</span><span style="color: #3366CC;">'p'</span><span style="color: #009900;">&#41;</span>.<span style="color: #660066;">customPlugin</span><span style="color: #009900;">&#40;</span><span style="color: #3366CC;">'colorize'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
  <span style="color: #009900;">&#125;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #009900;">&#125;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></pre></td></tr></table></div>

<p>In questo esempio applichiamo il nostro plugin a tutti paragrafi (p) del documento (riga <em>#69</em>). Questa operazione andrà ad attivare il metodo locale <em>__loop()</em> la cui logica è salvare la configurazione del plugin all&#8217;interno del DOM del nodo interessato.</p>
<p>Successivamente sfruttiamo il click su di un bottone per invocare il metodo &#8220;colorize&#8221; del plugin stesso. In questo caso entra in scena il metodo local <em>__colorize()</em>. Questo è reso possibile dal controllo sul <strong>tipo di dato</strong> effettuato sul <strong>primo parametro</strong> passato al plugin. Rispettivamente in riga <em>#30</em> e poi in riga <em>#46</em>.</p>
<p>Seguendo la struttura esposta nell&#8217;articolo il codice del plugin è diviso in due macro sezioni: un <strong>&#8220;router&#8221; di azioni</strong> ed un certo numero di <strong>metodi interni</strong>.</p>
<p>Il <strong>router</strong> è gestito nella funzione che estende jQuery. Controlla il tipo di input e si occupa di stabile che<strong> tipo di azione</strong> è richiesta.</p>
<p>I <strong>metodi interni</strong> si occupano di dar seguito alla decisione del router e devono &#8220;fare la magia&#8221;. Solitamente i metodi interni sono invocati per ogni elemento DOM identificato dal contesto del plugin come nei precedenti esempi.</p>
<p><strong>Il passo successivo è massimizzare l&#8217;ottimizzazione dei metodi interni!</strong></p>
<h2>Ottimizzare con le Variabili Cache:</h2>
<p>Ogni metodo locale di logica riceve come <em>contesto</em> il riferimento ad un preciso nodo DOM facente parte dell&#8217;xPath su cui è stato lanciato il plugin. Nel nostro esempio significa che il codice <em>$(this)</em> all&#8217;interno dei metodi <em>__loop()</em> o <em>__colorize()</em> è il riferimento ad un singolo paragrafo.</p>
<p>Sempre all&#8217;interno di questi metodi potremo aver bisogno di effettuare nuove ricerche su nodi:</p>
<pre>$(this).find('strong')</pre>
<p>a cui applicare vari metodi jQuery oppure altri plugin a cascata.</p>
<p>Ogni volta che si utilizza jQuery per effettuare una ricerca viene impegnata memoria e CPU. Noi possiamo agire e salvare i risultati di una query in una variabile locale così da alleggerire il carico del computer client. Vediamo il codice di <em>__colorize()</em>:</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>0
1
2
3
4
5
6
7
8
</pre></td><td class="code"><pre class="javascript" style="font-family:monospace;"><span style="color: #003366; font-weight: bold;">var</span> __colorize <span style="color: #339933;">=</span> <span style="color: #003366; font-weight: bold;">function</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
&nbsp;
  <span style="color: #003366; font-weight: bold;">var</span> $this <span style="color: #339933;">=</span> $<span style="color: #009900;">&#40;</span><span style="color: #000066; font-weight: bold;">this</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
  <span style="color: #003366; font-weight: bold;">var</span> cfg <span style="color: #339933;">=</span> $this.<span style="color: #660066;">data</span><span style="color: #009900;">&#40;</span><span style="color: #3366CC;">'customPlugin'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
  $this.<span style="color: #660066;">css</span><span style="color: #009900;">&#40;</span> <span style="color: #3366CC;">'background-color'</span><span style="color: #339933;">,</span> cfg.<span style="color: #660066;">color</span> <span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #009900;">&#125;</span><span style="color: #339933;">;</span></pre></td></tr></table></div>

<p>In riga <em>#2</em> viene creata la variabile locale <strong>$this</strong> con riferimento al nodo DOM.<br />
Nelle righe <em>#4</em> e <em>#6</em> riutilizziamo questa variabile per applicare metodi jQuery.</p>
<p>Questo è ovviamente un esempio banale ma possiamo immaginare l&#8217;impatto positivo di questo accorgimento quando la logica comincia a complicarsi un po&#8217;!</p>
<h2>Conclusioni:</h2>
<p>In questo articolo abbiamo raccolto le basi per la costruzione di un plugin jQuery versatile e prestazionale.</p>
<p>Grazie a questa struttura <strong>diventa semplice realizzare strumenti complessi</strong> che contengano configurazione e azioni.</p>
<p>Nel prossimo articolo studiamo in dettaglio alcune linee guida utili alla <strong>realizzazione di un &#8220;widget&#8221;</strong> ovvero un plugin complesso che mette a disposizione un <strong>controllo di interfaccia facilmente riutilizzabile</strong> in progetti differenti.</p>
<p>Al momento in cui scrivo il progetto di &#8220;widget collection&#8221; jQuery più affermato è sicuramente jQueryUI il quale mette a disposizione controlli di interfaccia evoluti quali <em>dialog window</em>, <em>date picker</em>, <em>sortable list</em>, etc.</p>
<p>Noi impareremo a creare componenti &#8220;custom&#8221; il cui utilizzo sia però ispirato alle linee guida di jQueryUI, fino ad arrivare alla creazione di nuovi widget completamente compatibili con jQueryUI e le sue linee guida.</p>
<!-- Social Bookmarks BEGIN -->
<div class="social_bookmark">
<a><strong><em>Segnala presso:</em></strong></a>
<br />
<div class="d">
<br />
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://del.icio.us/post?url=http%3A%2F%2Fwww.consulenza-web.com%2F2012%2F01%2Fstruttura-di-un-plugin-jquery%2F&amp;title=Struttura+di+un+plugin+jQuery" rel="nofollow" title="Add to&nbsp;Del.icio.us"><img class="social_img" src="http://www.consulenza-web.com/wp-content/plugins/social-bookmarks/images/delicious.png" title="Add to&nbsp;Del.icio.us" alt="Add to&nbsp;Del.icio.us" /></a>
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://digg.com/submit?phase=2&amp;url=http%3A%2F%2Fwww.consulenza-web.com%2F2012%2F01%2Fstruttura-di-un-plugin-jquery%2F&amp;title=Struttura+di+un+plugin+jQuery" rel="nofollow" title="Add to&nbsp;digg"><img class="social_img" src="http://www.consulenza-web.com/wp-content/plugins/social-bookmarks/images/digg.png" title="Add to&nbsp;digg" alt="Add to&nbsp;digg" /></a>
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://www.facebook.com/sharer.php?u=http%3A%2F%2Fwww.consulenza-web.com%2F2012%2F01%2Fstruttura-di-un-plugin-jquery%2F" rel="nofollow" title="Add to&nbsp;Facebook"><img class="social_img" src="http://www.consulenza-web.com/wp-content/plugins/social-bookmarks/images/facebook.png" title="Add to&nbsp;Facebook" alt="Add to&nbsp;Facebook" /></a>
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://www.google.com/bookmarks/mark?op=edit&amp;output=popup&amp;bkmk=http%3A%2F%2Fwww.consulenza-web.com%2F2012%2F01%2Fstruttura-di-un-plugin-jquery%2F&amp;title=Struttura+di+un+plugin+jQuery" rel="nofollow" title="Add to&nbsp;Google Bookmarks"><img class="social_img" src="http://www.consulenza-web.com/wp-content/plugins/social-bookmarks/images/google.png" title="Add to&nbsp;Google Bookmarks" alt="Add to&nbsp;Google Bookmarks" /></a>
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://www.linkedin.com/shareArticle?mini=true&amp;url=http%3A%2F%2Fwww.consulenza-web.com%2F2012%2F01%2Fstruttura-di-un-plugin-jquery%2F&amp;title=Struttura+di+un+plugin+jQuery" rel="nofollow" title="Add to&nbsp;LinkedIn"><img class="social_img" src="http://www.consulenza-web.com/wp-content/plugins/social-bookmarks/images/linkedin.png" title="Add to&nbsp;LinkedIn" alt="Add to&nbsp;LinkedIn" /></a>
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://www.stumbleupon.com/submit?url=http%3A%2F%2Fwww.consulenza-web.com%2F2012%2F01%2Fstruttura-di-un-plugin-jquery%2F&amp;title=Struttura+di+un+plugin+jQuery" rel="nofollow" title="Add to&nbsp;Stumble Upon"><img class="social_img" src="http://www.consulenza-web.com/wp-content/plugins/social-bookmarks/images/stumbleupon.png" title="Add to&nbsp;Stumble Upon" alt="Add to&nbsp;Stumble Upon" /></a>
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://www.technorati.com/faves?add=http%3A%2F%2Fwww.consulenza-web.com%2F2012%2F01%2Fstruttura-di-un-plugin-jquery%2F" rel="nofollow" title="Add to&nbsp;Technorati"><img class="social_img" src="http://www.consulenza-web.com/wp-content/plugins/social-bookmarks/images/technorati.png" title="Add to&nbsp;Technorati" alt="Add to&nbsp;Technorati" /></a>
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://twitter.com/home/?status=Check+out+Struttura+di+un+plugin+jQuery+@+http%3A%2F%2Fwww.consulenza-web.com%2F2012%2F01%2Fstruttura-di-un-plugin-jquery%2F" rel="nofollow" title="Add to&nbsp;Twitter"><img class="social_img" src="http://www.consulenza-web.com/wp-content/plugins/social-bookmarks/images/twitter.png" title="Add to&nbsp;Twitter" alt="Add to&nbsp;Twitter" /></a>
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://myweb2.search.yahoo.com/myresults/bookmarklet?u=http%3A%2F%2Fwww.consulenza-web.com%2F2012%2F01%2Fstruttura-di-un-plugin-jquery%2F&amp;t=Struttura+di+un+plugin+jQuery" rel="nofollow" title="Add to&nbsp;Yahoo My Web"><img class="social_img" src="http://www.consulenza-web.com/wp-content/plugins/social-bookmarks/images/yahoo.png" title="Add to&nbsp;Yahoo My Web" alt="Add to&nbsp;Yahoo My Web" /></a>
<br />
</div>
</div>
<!-- Social Bookmarks END -->
]]></content:encoded>
			<wfw:commentRss>http://www.consulenza-web.com/2012/01/struttura-di-un-plugin-jquery/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>respond.js bug &#8211; supporto css3 media query IE8, IE7, IE6</title>
		<link>http://www.consulenza-web.com/2011/11/respond-js-bug/</link>
		<comments>http://www.consulenza-web.com/2011/11/respond-js-bug/#comments</comments>
		<pubDate>Thu, 10 Nov 2011 10:24:41 +0000</pubDate>
		<dc:creator>peg</dc:creator>
				<category><![CDATA[Sviluppo]]></category>
		<category><![CDATA[tip & tricks]]></category>
		<category><![CDATA[Tutorial]]></category>
		<category><![CDATA[Web Design]]></category>
		<category><![CDATA[bug]]></category>
		<category><![CDATA[coding]]></category>
		<category><![CDATA[css]]></category>
		<category><![CDATA[css3]]></category>
		<category><![CDATA[design responsivo]]></category>
		<category><![CDATA[ie6]]></category>
		<category><![CDATA[ie7]]></category>
		<category><![CDATA[ie8]]></category>
		<category><![CDATA[internet explorer]]></category>
		<category><![CDATA[media query]]></category>

		<guid isPermaLink="false">http://www.consulenza-web.com/?p=483</guid>
		<description><![CDATA[Stamattina ho perso non poco tempo nel debugging di un progetto web in cui ho utilizzato delle semplici tecniche di layout responsivo con le CSS3 Media Query. Ovviamente il problema è relativo a Internet Explorer nelle sue più nobili versioni: IE6, IE7 e IE8! L&#8217;argomento: Queste versioni di Internet Explorer non supportano le Media Query [...]]]></description>
			<content:encoded><![CDATA[<p>Stamattina ho perso non poco tempo nel debugging di un progetto web in cui ho utilizzato delle semplici tecniche di <a title="web design responsivo con le css3 media query" href="http://www.consulenza-web.com/2011/07/compromesso-vincente/"  target="_blank">layout responsivo con le CSS3 Media Query</a>.<br />
Ovviamente <strong>il problema è relativo a Internet Explorer</strong> nelle sue più nobili versioni: IE6, IE7 e IE8!<span id="more-483"></span></p>
<h2>L&#8217;argomento:</h2>
<p>Queste versioni di Internet Explorer non supportano le Media Query (nè HTML5&#8230; anzi, non supportano nulla!) ma fortunatamente esistono delle librerie che &#8211; via javascript &#8211; risolvono il problema.</p>
<ul>
<li><a title="CSS3 Media Query su Google Code" href="http://code.google.com/p/css3-mediaqueries-js/" class="aga aga_4" target="_blank">css3-mediaqueries-js</a> - supporto esteso alle media query CSS3</li>
<li><a title="CSS3 Media Query by Filament Group" href="http://filamentgroup.com/lab/respondjs_fast_css3_media_queries_for_internet_explorer_6_8_and_more/" class="aga aga_5" target="_blank">respond.js</a> &#8211; supporto ottimizzato alle media query CSS3 per il &#8220;mobile first&#8221; responsive design</li>
</ul>
<p>Io utilizzo <strong>respond.js</strong> perchè mi interessa solamente intercettare le dimensioni dello schermo ed agire di conseguenza sulla presentazione della pagina web ed è proprio su questa libreria che si concentra l&#8217;errore segnalato in questo post.</p>
<h2>L&#8217;errore:</h2>
<p>Questa libreria va in errore quando il foglio di stile contiene delle <strong>regole vuote</strong>:</p>
<pre>body {}</pre>
<h2>La soluzione:</h2>
<p>La semplicissima soluzione consiste nell&#8217;<strong>inserire almeno uno spazio</strong> all&#8217;interno delle parentesi graffe:</p>
<pre>body { }</pre>
<h2>Conclusioni:</h2>
<p>Molti di voi sostengono &#8211; a ragione &#8211; che questo tipo di istruzioni non dovrebbero esistere in un foglio di stile in quanto sono un semplice spreco di spazio e di tempo di caricamento. Sono pienamente d&#8217;accordo!</p>
<p>Tuttavia <strong>in piena fase di sviluppo</strong> molti sviluppatori usano scrivere il set completo di &#8220;css handler&#8221; per definire le regole interne in un secondo momento. In questo caso &#8211; in progettazione &#8211; questo bug può far perdere tempo prezioso e la soluzione proposta in <strong>questo articolo diventa utilissima</strong>!</p>
<!-- Social Bookmarks BEGIN -->
<div class="social_bookmark">
<a><strong><em>Segnala presso:</em></strong></a>
<br />
<div class="d">
<br />
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://del.icio.us/post?url=http%3A%2F%2Fwww.consulenza-web.com%2F2011%2F11%2Frespond-js-bug%2F&amp;title=respond.js+bug+%26%238211%3B+supporto+css3+media+query+IE8%2C+IE7%2C+IE6" rel="nofollow" title="Add to&nbsp;Del.icio.us"><img class="social_img" src="http://www.consulenza-web.com/wp-content/plugins/social-bookmarks/images/delicious.png" title="Add to&nbsp;Del.icio.us" alt="Add to&nbsp;Del.icio.us" /></a>
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://digg.com/submit?phase=2&amp;url=http%3A%2F%2Fwww.consulenza-web.com%2F2011%2F11%2Frespond-js-bug%2F&amp;title=respond.js+bug+%26%238211%3B+supporto+css3+media+query+IE8%2C+IE7%2C+IE6" rel="nofollow" title="Add to&nbsp;digg"><img class="social_img" src="http://www.consulenza-web.com/wp-content/plugins/social-bookmarks/images/digg.png" title="Add to&nbsp;digg" alt="Add to&nbsp;digg" /></a>
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://www.facebook.com/sharer.php?u=http%3A%2F%2Fwww.consulenza-web.com%2F2011%2F11%2Frespond-js-bug%2F" rel="nofollow" title="Add to&nbsp;Facebook"><img class="social_img" src="http://www.consulenza-web.com/wp-content/plugins/social-bookmarks/images/facebook.png" title="Add to&nbsp;Facebook" alt="Add to&nbsp;Facebook" /></a>
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://www.google.com/bookmarks/mark?op=edit&amp;output=popup&amp;bkmk=http%3A%2F%2Fwww.consulenza-web.com%2F2011%2F11%2Frespond-js-bug%2F&amp;title=respond.js+bug+%26%238211%3B+supporto+css3+media+query+IE8%2C+IE7%2C+IE6" rel="nofollow" title="Add to&nbsp;Google Bookmarks"><img class="social_img" src="http://www.consulenza-web.com/wp-content/plugins/social-bookmarks/images/google.png" title="Add to&nbsp;Google Bookmarks" alt="Add to&nbsp;Google Bookmarks" /></a>
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://www.linkedin.com/shareArticle?mini=true&amp;url=http%3A%2F%2Fwww.consulenza-web.com%2F2011%2F11%2Frespond-js-bug%2F&amp;title=respond.js+bug+%26%238211%3B+supporto+css3+media+query+IE8%2C+IE7%2C+IE6" rel="nofollow" title="Add to&nbsp;LinkedIn"><img class="social_img" src="http://www.consulenza-web.com/wp-content/plugins/social-bookmarks/images/linkedin.png" title="Add to&nbsp;LinkedIn" alt="Add to&nbsp;LinkedIn" /></a>
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://www.stumbleupon.com/submit?url=http%3A%2F%2Fwww.consulenza-web.com%2F2011%2F11%2Frespond-js-bug%2F&amp;title=respond.js+bug+%26%238211%3B+supporto+css3+media+query+IE8%2C+IE7%2C+IE6" rel="nofollow" title="Add to&nbsp;Stumble Upon"><img class="social_img" src="http://www.consulenza-web.com/wp-content/plugins/social-bookmarks/images/stumbleupon.png" title="Add to&nbsp;Stumble Upon" alt="Add to&nbsp;Stumble Upon" /></a>
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://www.technorati.com/faves?add=http%3A%2F%2Fwww.consulenza-web.com%2F2011%2F11%2Frespond-js-bug%2F" rel="nofollow" title="Add to&nbsp;Technorati"><img class="social_img" src="http://www.consulenza-web.com/wp-content/plugins/social-bookmarks/images/technorati.png" title="Add to&nbsp;Technorati" alt="Add to&nbsp;Technorati" /></a>
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://twitter.com/home/?status=Check+out+respond.js+bug+%26%238211%3B+supporto+css3+media+query+IE8%2C+IE7%2C+IE6+@+http%3A%2F%2Fwww.consulenza-web.com%2F2011%2F11%2Frespond-js-bug%2F" rel="nofollow" title="Add to&nbsp;Twitter"><img class="social_img" src="http://www.consulenza-web.com/wp-content/plugins/social-bookmarks/images/twitter.png" title="Add to&nbsp;Twitter" alt="Add to&nbsp;Twitter" /></a>
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://myweb2.search.yahoo.com/myresults/bookmarklet?u=http%3A%2F%2Fwww.consulenza-web.com%2F2011%2F11%2Frespond-js-bug%2F&amp;t=respond.js+bug+%26%238211%3B+supporto+css3+media+query+IE8%2C+IE7%2C+IE6" rel="nofollow" title="Add to&nbsp;Yahoo My Web"><img class="social_img" src="http://www.consulenza-web.com/wp-content/plugins/social-bookmarks/images/yahoo.png" title="Add to&nbsp;Yahoo My Web" alt="Add to&nbsp;Yahoo My Web" /></a>
<br />
</div>
</div>
<!-- Social Bookmarks END -->
]]></content:encoded>
			<wfw:commentRss>http://www.consulenza-web.com/2011/11/respond-js-bug/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>jQuery: strutturare il codice di un plugin</title>
		<link>http://www.consulenza-web.com/2011/07/jquery-strutturare-codice-plugin/</link>
		<comments>http://www.consulenza-web.com/2011/07/jquery-strutturare-codice-plugin/#comments</comments>
		<pubDate>Fri, 08 Jul 2011 07:47:17 +0000</pubDate>
		<dc:creator>peg</dc:creator>
				<category><![CDATA[jQuery]]></category>
		<category><![CDATA[Sviluppo]]></category>
		<category><![CDATA[Tutorial]]></category>
		<category><![CDATA[best practice]]></category>
		<category><![CDATA[codice]]></category>
		<category><![CDATA[coding]]></category>
		<category><![CDATA[esempio]]></category>
		<category><![CDATA[javascript]]></category>
		<category><![CDATA[js]]></category>
		<category><![CDATA[organizzazione]]></category>
		<category><![CDATA[plugin]]></category>

		<guid isPermaLink="false">http://www.consulenza-web.com/?p=353</guid>
		<description><![CDATA[In questo articolo espongo un&#8217;architettura di codice Javascript per la definizione di plugin jQuery i cui obiettivi sono: Compatibilità cross-library Configurazione globale del plugin Separazione delle API dal codice funzionale del plugin stesso Visualizza l&#8217;esempio correlato » Scarica i files dell&#8217;esempio correlato » 1. Definizione di uno Scope anonimo: /** * jQuery Bacheca * Plugin Dimostrativo */ [...]]]></description>
			<content:encoded><![CDATA[<p>In questo articolo espongo un&#8217;architettura di codice Javascript per la definizione di plugin jQuery i cui obiettivi sono:</p>
<ol>
<li>Compatibilità cross-library</li>
<li>Configurazione globale del plugin</li>
<li>Separazione delle API dal codice funzionale del plugin stesso</li>
</ol>
<div><a title="Bacheca, Plugin jQuery di Esempio | organizzazione codice plugin jQuery | www.consulenza-web.com" href="http://consulenza-web.com/jquery/bacheca"  target="_blank">Visualizza l&#8217;esempio correlato »</a><br />
<a title="download files di esempio, zip, 37Kb" href="http://consulenza-web.com/jquery/bacheca.zip" class="aga aga_7" target="_blank">Scarica i files dell&#8217;esempio correlato »</a></div>
<h2><span id="more-353"></span>1. Definizione di uno Scope anonimo:</h2>
<div>
<pre>/**
 * jQuery Bacheca
 * Plugin Dimostrativo
 */

;(function($){
  // Plugin's code goes here
})( jQuery );</pre>
<p>Questo codice crea uno <em>SCOPE</em> ovvero una <strong>bolla isolata</strong> in cui scrivere il nostro codice.</p>
<p>A meno di particolari accorgimenti questo codice non può influire su altro codice pubblico e codice di terzi non può agire sul nostro. Questo ci garantisce al nostro plugin certa protezione dagli errori altrui!</p>
<p>Un&#8217;altro vantaggio di questa tecnica consiste nel poter utilizzare il &#8220;$&#8221; come riferimento a jQuery anche in presenza di altre librerie in quando esso è definito come variabile locale del nostro ambiente di lavoro.</p>
<p><strong>NOTA:</strong> il codice sorgente visualizzato d&#8217;ora in avanti si riferisce al contenuto di questo wrapper.</p>
</div>
<h2>2. Configurazione Globale del Plugin<span class="Apple-style-span" style="font-size: 13px; font-weight: normal;"> </span></h2>
<pre>$.bacheca = {

  // Versione ed altre info eventuali.
  version: '1.0,
  author: 'Marco Pegoraro',
  doc: 'http://www.documentazionedelplugin.com',

  // Configurazione globale del plugin.
  defaults: {},

};</pre>
<p>Questa istruzione <strong>estende jQuery</strong> e aggiunge una nuova proprietà chiamata con il nome del plugin stesso.</p>
<p><strong>NOTA:</strong> I dati qui collezionati saranno pubblici ed accessibili da qualunque porzione di codice abbia accesso al <em>namespace</em> jQuery. Questo è un fatto importante perchè chi utilizza il nostro plugin potrà scrivere istruzioni simili alla seguente per configurare a livello globale il comportamento del plugin stesso.</p>
<pre>$.bacheca.defaults.var1 = "foo";</pre>
<p>Qualunque istanza del plugin bacheca riceverà questa variabile nella configurazione locale (a meno che non venga sovrascritta dalla configurazione dell&#8217;istanza stessa!)</p>
<p>Può essere molto utile poter controllare, a livello di pagina, se un determinato plugin è caricato o meno con un&#8217;istruzione simile a questa:</p>
<pre>if ( $.bacheca ) { /* plugin exists */ } else { /* plugin missing */ }</pre>
<h2>3. Il Plugin</h2>
<p>Il plugin vero e proprio è semplicemente una funzione che estende la collection di jQuery aggiungendo nuove funzionalità.</p>
<p>$.fn.bacheca = function() { /* plugin logic */ }</p>
<p>Molti sviluppatori implementano le funzionalità direttamente nel codice logico del plugin ma io trovo sia più corretto <strong>organizzare il plugin come un metodo pubblico di accesso ad API  private</strong>.</p>
<p>Questo significa che tutta la logica del plugin è inaccessibile da codice globale e la possiamo utilizzare solamente attraverso il plugin stesso mediante istruzioni simili a:</p>
<pre>$('#bacheca').bacheca({ bgcolor: "#eee" });
$('#bacheca').bacheca( "write", "Nuova frase in bacheca" );
$('#bacheca').bacheca( "clear" );</pre>
<p>Come si può vedere da questo esempio stiamo utilizzando sempre il plugin &#8220;bacheca&#8221; il quale avrà <strong>comportamenti differenti in base alla tipologia del primo parametro</strong>. nel caso il primo parametro venga riconosciuto come nome di una API essa verrà invocata ricevendo tutti i parametri aggiuntivi.</p>
<p>Il codice da utilizzare per implementare quanto esposto è:</p>
<pre>// Collezione di metodi di interfaccia (API)
apis = {};

// Definizione del plugin
$.fn.bacheca = function( method ) {

  // Cerco il metodo richiesto tra le API esposte.
  if ( apis[method] ) {
    return apis[ method ].apply( this, Array.prototype.slice.call( arguments, 1 ));

  // Lancio il metodo di inizializzazione in presenza di un oggetto di configurazione.
  } else if ( typeof method === 'object' || ! method ) {
    return apis.init.apply( this, arguments );

  // Lancio un'eccezione jQuery in caso il metodo API non sia trovato.
  } else {
    $.error( 'Method "' +  method + '" does not exist on jQuery.bacheca' );

  }
}</pre>
<p>Come anticipato il plugin non contiene logica funzionale ma è solo un &#8220;<em>passa carte</em>&#8221; verso metodi elencati in un array chiamato &#8220;apis&#8221;.</p>
<p>L&#8217;oggetto &#8220;apis&#8221; viene definito all&#8217;interno dello scope del plugin e risulta quindi essere un oggetto &#8220;privato&#8221; il cui utilizzo è riservato al codice del plugin stesso.<br />
In questo modo possiamo esporre funzionalità all&#8217;esterno garantendo che esse non siano modificabili da altro software (altri plugins, etc).</p>
<h2>4. API Collection</h2>
<p>Il plugin definito nel paragrafo precedente non fa altro che cercare metodi all&#8217;interno della collezione delle API.</p>
<p>Il nostro lavoro di sviluppo del plugin consiste proprio nell&#8217;estendere queste API a partire dal metodo &#8220;init()&#8221;, che riceverà la configurazione del plugin stesso, proseguendo poi per i metodi di azione.</p>
<h2>5. Bacheca::init()</h2>
<pre>apis.init = function( cfg ) {

  // Estendo la configurazione di default con la configurazione locale
  var cfg = $.extend( {}, $.bacheca.defaults, cfg );

  // Ciclo gli elementi identificati dal selettore
  return $(this).each(function(){
    $bacheca = $(this);
    $bacheca.html( cfg.content );
    if ( cfg.bgcolor != null ) $bacheca.css( 'background', cfg.bgcolor );
  });
}</pre>
<p>Questo metodo riceve la configurazione locale applicata all&#8217;istanza del plugin. Ogni istanza del plugin (ogni suo utilizzo) può essere configurato a piacere ed è importante che queste configurazioni siano mantenute isolate le une dalle altre.</p>
<p>In questo primo e semplice plugin la configurazione è utilizzata semplicemente per definire il contenuto iniziale della bacheca ed il suo colore di sfondo. Gli altri metodi API non fanno uso di questa configurazione dunque non ci siamo occupati di gestirla al meglio (lasciamo l&#8217;argomento ad un articolo dedicato).</p>
<h2>6. Bacheca::write(), Bacheca::clear()</h2>
<pre>apis.write = function( word ) {
  return $(this).append('&lt;p&gt;'+word+'&lt;/p&gt;');
}</pre>
<pre>apis.clear = function() {
  return $(this).html("");
}</pre>
<p>Questi due metodi API esposti dal plugin sono estremamente semplici e consentono di manipolare il contenuto della bacheca.</p>
<h2>7. Utilizzo del plugin:</h2>
<pre>&lt;!-- Codice HTML --&gt;
&lt;div id="bacheca"&gt;&lt;/div&gt;</pre>
<pre>// Codice Javascript globale:
$(document).ready(function(){
  $('#bacheca')
    .bacheca({ bgcolor:"green", content:"Test Contenuto" })
    .bacheca('clear')
    .bacheca('write','Il mio nome è Marco')
  ;
});</pre>
<!-- Social Bookmarks BEGIN -->
<div class="social_bookmark">
<a><strong><em>Segnala presso:</em></strong></a>
<br />
<div class="d">
<br />
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://del.icio.us/post?url=http%3A%2F%2Fwww.consulenza-web.com%2F2011%2F07%2Fjquery-strutturare-codice-plugin%2F&amp;title=jQuery%3A+strutturare+il+codice+di+un+plugin" rel="nofollow" title="Add to&nbsp;Del.icio.us"><img class="social_img" src="http://www.consulenza-web.com/wp-content/plugins/social-bookmarks/images/delicious.png" title="Add to&nbsp;Del.icio.us" alt="Add to&nbsp;Del.icio.us" /></a>
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://digg.com/submit?phase=2&amp;url=http%3A%2F%2Fwww.consulenza-web.com%2F2011%2F07%2Fjquery-strutturare-codice-plugin%2F&amp;title=jQuery%3A+strutturare+il+codice+di+un+plugin" rel="nofollow" title="Add to&nbsp;digg"><img class="social_img" src="http://www.consulenza-web.com/wp-content/plugins/social-bookmarks/images/digg.png" title="Add to&nbsp;digg" alt="Add to&nbsp;digg" /></a>
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://www.facebook.com/sharer.php?u=http%3A%2F%2Fwww.consulenza-web.com%2F2011%2F07%2Fjquery-strutturare-codice-plugin%2F" rel="nofollow" title="Add to&nbsp;Facebook"><img class="social_img" src="http://www.consulenza-web.com/wp-content/plugins/social-bookmarks/images/facebook.png" title="Add to&nbsp;Facebook" alt="Add to&nbsp;Facebook" /></a>
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://www.google.com/bookmarks/mark?op=edit&amp;output=popup&amp;bkmk=http%3A%2F%2Fwww.consulenza-web.com%2F2011%2F07%2Fjquery-strutturare-codice-plugin%2F&amp;title=jQuery%3A+strutturare+il+codice+di+un+plugin" rel="nofollow" title="Add to&nbsp;Google Bookmarks"><img class="social_img" src="http://www.consulenza-web.com/wp-content/plugins/social-bookmarks/images/google.png" title="Add to&nbsp;Google Bookmarks" alt="Add to&nbsp;Google Bookmarks" /></a>
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://www.linkedin.com/shareArticle?mini=true&amp;url=http%3A%2F%2Fwww.consulenza-web.com%2F2011%2F07%2Fjquery-strutturare-codice-plugin%2F&amp;title=jQuery%3A+strutturare+il+codice+di+un+plugin" rel="nofollow" title="Add to&nbsp;LinkedIn"><img class="social_img" src="http://www.consulenza-web.com/wp-content/plugins/social-bookmarks/images/linkedin.png" title="Add to&nbsp;LinkedIn" alt="Add to&nbsp;LinkedIn" /></a>
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://www.stumbleupon.com/submit?url=http%3A%2F%2Fwww.consulenza-web.com%2F2011%2F07%2Fjquery-strutturare-codice-plugin%2F&amp;title=jQuery%3A+strutturare+il+codice+di+un+plugin" rel="nofollow" title="Add to&nbsp;Stumble Upon"><img class="social_img" src="http://www.consulenza-web.com/wp-content/plugins/social-bookmarks/images/stumbleupon.png" title="Add to&nbsp;Stumble Upon" alt="Add to&nbsp;Stumble Upon" /></a>
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://www.technorati.com/faves?add=http%3A%2F%2Fwww.consulenza-web.com%2F2011%2F07%2Fjquery-strutturare-codice-plugin%2F" rel="nofollow" title="Add to&nbsp;Technorati"><img class="social_img" src="http://www.consulenza-web.com/wp-content/plugins/social-bookmarks/images/technorati.png" title="Add to&nbsp;Technorati" alt="Add to&nbsp;Technorati" /></a>
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://twitter.com/home/?status=Check+out+jQuery%3A+strutturare+il+codice+di+un+plugin+@+http%3A%2F%2Fwww.consulenza-web.com%2F2011%2F07%2Fjquery-strutturare-codice-plugin%2F" rel="nofollow" title="Add to&nbsp;Twitter"><img class="social_img" src="http://www.consulenza-web.com/wp-content/plugins/social-bookmarks/images/twitter.png" title="Add to&nbsp;Twitter" alt="Add to&nbsp;Twitter" /></a>
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://myweb2.search.yahoo.com/myresults/bookmarklet?u=http%3A%2F%2Fwww.consulenza-web.com%2F2011%2F07%2Fjquery-strutturare-codice-plugin%2F&amp;t=jQuery%3A+strutturare+il+codice+di+un+plugin" rel="nofollow" title="Add to&nbsp;Yahoo My Web"><img class="social_img" src="http://www.consulenza-web.com/wp-content/plugins/social-bookmarks/images/yahoo.png" title="Add to&nbsp;Yahoo My Web" alt="Add to&nbsp;Yahoo My Web" /></a>
<br />
</div>
</div>
<!-- Social Bookmarks END -->
]]></content:encoded>
			<wfw:commentRss>http://www.consulenza-web.com/2011/07/jquery-strutturare-codice-plugin/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Froggle CMS: piano di sviluppo!</title>
		<link>http://www.consulenza-web.com/2010/09/froggle-cms-piano-di-sviluppo/</link>
		<comments>http://www.consulenza-web.com/2010/09/froggle-cms-piano-di-sviluppo/#comments</comments>
		<pubDate>Thu, 23 Sep 2010 07:03:38 +0000</pubDate>
		<dc:creator>peg</dc:creator>
				<category><![CDATA[CakePHP]]></category>
		<category><![CDATA[JuniorCMS]]></category>
		<category><![CDATA[cms]]></category>
		<category><![CDATA[coding]]></category>
		<category><![CDATA[crossbrowser]]></category>
		<category><![CDATA[crud]]></category>
		<category><![CDATA[icp]]></category>
		<category><![CDATA[interfaccia]]></category>
		<category><![CDATA[jcms]]></category>
		<category><![CDATA[pannello]]></category>
		<category><![CDATA[php]]></category>
		<category><![CDATA[php framework]]></category>
		<category><![CDATA[rad]]></category>
		<category><![CDATA[seo]]></category>
		<category><![CDATA[site]]></category>
		<category><![CDATA[sitebuilder]]></category>
		<category><![CDATA[url rewrite]]></category>
		<category><![CDATA[web]]></category>
		<category><![CDATA[web2.0]]></category>

		<guid isPermaLink="false">http://www.consulenza-web.com/2010/09/froggle-cms-piano-di-sviluppo/</guid>
		<description><![CDATA[Dopo quasi 3 anni di sviluppo di JuniorCMS abbiamo messo assieme un bel po&#8217; di funzionalità e framework applicativi. JuniorCMS è utilizzato con pieno successo in moltissimi siti e progetti web di alto livello per strutture che fondano il loro business sulle vendite on-line e sul webmarketing. Abbiamo realizzato gestionali operativi su scala nazionale (Gruppo [...]]]></description>
			<content:encoded><![CDATA[<p>Dopo quasi 3 anni di sviluppo di JuniorCMS abbiamo messo assieme un bel po&#8217; di funzionalità e framework applicativi.</p>
<p>JuniorCMS è utilizzato con pieno successo in moltissimi siti e <b>progetti web di alto livello</b> per strutture che fondano il loro business sulle vendite on-line e sul webmarketing.</p>
<p>Abbiamo realizzato <b>gestionali operativi su scala nazionale</b> (Gruppo Volkswagen) e abbiamo realizzato <b>micro-gestionali per la bottega sotto casa</b>.</p>
<p>Stiamo realizzando il progetto <b><a href="http://www.adessoweb.biz?007" class="aga aga_15" title="realizzazione siti web economici, sito web economico" target="_blank">AdessoWEB</a></b> che consente di avvicinarsi al business on-line con un prodotto professionale ma estremamente semplice ed intuitivo.</p>
<p><b><u>Ora vogliamo andare avanti.</u></b></p>
<p>Ciò che in questi anni non abbiamo realizzato è una community di sviluppatori che utilizzano questo prodotto.</p>
<p><a href="http://www.froggle.it" class="aga aga_16" title="Italian based CMS" target="_blank">FroggleCMS</a> nasce per risolvere questo enorme problema e creare una soluzione di gestione contenuti basata sul concetto di sviluppo veloce (RAD).</p>
<h2>Powerfull Plugins</h2>
<p>Alla base del progetto abbiamo messo il concetto di &#8220;<b>plugin</b>&#8221; inteso come &#8220;<b>raggruppamento logico di software e risorse atto a risolvere una precisa necessità</b>&#8220;.</p>
<p>Le necessità che un plugin può risolvere sono anch&#8217;esse tipizzate in:</p>
<ol>
<li><b>libreria</b>: condivisione di librerie e framework</li>
<li><b>servizio</b>: definizione di servizi condivisi all&#8217;applicativo</li>
<li><b>applicativo</b>: definizione di software gestionale utile</li>
<li><b>estensione</b>: intervento di modifica e/o estensione di altri plugins</li>
<li><b>custom</b>: insieme di applicativo ed estensione ove inserire il codice personalizzato sul singolo progetto.</li>
</ol>
<p>Il plugin di estensione o custom permettono di modificare in modo approfondito sul comportamento dei livelli ingeriori per <b>implementare soluzioni specifiche senza creare fork del progetto</b>.</p>
<h2>Life Cycle Guarantee</h2>
<p>Anni di esperienza nella progettazione di applicativi ci hanno insegnato l&#8217;<b>importanza del ciclo di vita del software</b>.</p>
<p>Molte piccole web agency (l&#8217;Italia ne è piena) si trovano a <b>sviluppare progetti in velocità</b> per sopravvivere sul mercato.</p>
<p><b>La creazione di soluzioni realmente riutilizzabili è molto difficile</b> in quanto, di progetto in progetto, nascono nuove necessità, ottimizzazioni, verticalizzazioni.</p>
<p>Di fatto ci si trova quasi sempre a creare piccoli fork di progetti preesistenti con il triste risultato di <b>produrre decine di sub-versioni incompatibili</b> di un progetto inizialmente coerente.</p>
<p><u>Il nostro devTeam è stato a lungo vittima di questo processo!</u></p>
<p><b>La soluzione proposta da FroggleCMS consente di isolare qualunque software in plugins che possono essere migliorati e versionati come un qualunque software commerciale.</b></p>
<p>Nel momento in cui un particolare progetto richiede una particolare modifica ad un plugin esistente è possibile <b>definire un plugin di estensione che apporta modifiche dall&#8217;esterno senza modificare le logiche esistenti</b>.</p>
<p>Questa architettura è già implementata con successo su JuniorCMS e da oltre un anno ne godiamo i benefici per creare customizzazioni quali:</p>
<ul>
<li>aggiunta di campi personalizzati a strutture dati esistenti</li>
<li>modificare l&#8217;interfaccia utente esistente per adeguarla al progetto</li>
<li>inserire o modificare logica di controllo</li>
<li>inserire o modificare logica di cooperazione tra plugins (es servizi di sincronizzazione)</li>
</ul>
<h2>Spaghetti Coding Proof:</h2>
<p>Ecco le fasi di realizzazione di un <b>Tipico Spaghetti Project:</b></p>
<ol>
<li>Creazione in velocità di un plugin di gestione rassegna stampa con titolo e file allegato per un cliente.</li>
<li>Un nuovo cliente mi chiede la rassegna stampa ma ha bisogno di un campo abstract.</li>
<li>Copio il plugin già creato e lo modifico per il nuovo cliente.</li>
</ol>
<p>Questo tipo di sviluppo lo vedo ogni santo giorno in qualunque realtà aziendale e la triste conseguenza (già citata sopra) è la proliferazione di micro plugins incompatibili tra loro.</p>
<p>La conseguenza più pericolosa è che se il &#8220;plugin madre&#8221; ha un grosso bug il tempo impiegato per correggere tutti i derivati è semplicemente apocalittico!</p>
<p>Ecco le fasi di realizzazione di un <b>Froggle Spaghetti Project:</b></p>
<ol>
<li>Creazione in velocità di un plugin di gestione rassegna stampa con titolo e file allegato per un cliente.</li>
<li>Un nuovo cliente mi chiede la rassegna stampa ma ha bisogno di un campo abstract.</li>
<li>Creo un nuovo plugin che estende la rassegna stampa aggiungendo il campo su db, l&#8217;interfaccia e la logica necessaria senza modificare la logica preesistente.</li>
</ol>
<p>Questo tipo di sviluppo ha enormi vantaggi:</p>
<ul>
<li>mi permette di creare soluzioni veloci che possono essere migliorate e redistribuite in tempi più rilassati</li>
<li>mi permette di gestire la sicurezza del software per singolo plugin senza preoccuparmi delle sue estensioni (che ereditano la sicurezza)</li>
<li>mi permette di abbattere il numero di versioni incompatibili creando invece &#8220;catene di estensione&#8221; che possono essere facilmente versionate e mantenute</li>
<li>mi permette di utilizzare e personalizzare qualunque plugin esistente (anche commerciale) senza violare licenze sul codice o simile.</li>
</ul>
<h2>Sviluppo di FroggleCMS:</h2>
<p><u>1° Ottobre 2010:</u> il devTeam di JuniorCMS da vita allo sviluppo dell&#8217;infrastruttura di <a href="http://www.froggle.it" class="aga aga_17" title="Italian based CMS" target="_blank">FroggleCMS</a> (<a href="http://www.cakepower.org" class="aga aga_18" title="CakePHP with Power" target="_blank">CakePOWER</a>).</p>
<p><u>1° Novembre 2010:</u> viene rilasciato <a href="http://www.cakepower.org" class="aga aga_19" title="CakePHP with Power" target="_blank">CakePOWER</a> che implementa su <a href="http://www.cakephp.org" class="aga aga_20" title="PHP RAD Framework" target="_blank">CakePHP</a> l&#8217;architettura presentata in questo articolo assieme ad altre architetture di importanza minore.</p>
<p><u>1° Dicembre 2010:</u> viene rilasciato il plugin &#8220;froggle&#8221; che contiene l&#8217;interfaccia di base di <a href="http://www.froggle.it" class="aga aga_21" title="Italian based CMS" target="_blank">FroggleCMS</a> e la gestione utenti. Questo plugin è destinato ad essere frequentemente aggiornato con l&#8217;aggiunta costante delle funzionalità &#8220;core&#8221;.</p>
<p><u><b>1° Gennaio 2011:</b></u> <b>viene rilasciato il primo pacchetto auto-installante di FroggleCMS pronto per essere utilizzato in attività commerciali.</b></p>
<p>A questo punto daremo il via ad un programma di sviluppo plugins per coprire in breve tempo le principali esigenze di gestione contenuti on-line quali:</p>
<ul>
<li>gestione albero pagine sito web</li>
<li>gestione news</li>
<li>gestione rassegna stampa</li>
<li>gestione calendario eventi</li>
<li>gestione photo-gallery</li>
<li>gestione prodotti generici</li>
<li>gestione pagamento con carta di credito</li>
<li>organizzazione dei prodotti per categorie</li>
<li>gestione di un carrello elettronico complesso</li>
<li>e-commerce (unisce precedenti plugins aggiungendo gestione sconti, gestione coupon, offerte, tasse, valute, magazzino, etc)</li>
</ul>
<p>Il mercato di riferimento per questo prodotto è il nostro bel paese dunque tutta <u><b>la documentazione sarà inizialmente prodotta in italiano</b></u> mentre i commenti del codice sorgente cercheranno, per quanto possibile, di essere scritti in un decente spaghetti-english.</p>
<p>Ciao a tutti e buona fortuna al DevTEAM!</p>
<p></p>
<!-- Social Bookmarks BEGIN -->
<div class="social_bookmark">
<a><strong><em>Segnala presso:</em></strong></a>
<br />
<div class="d">
<br />
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://del.icio.us/post?url=http%3A%2F%2Fwww.consulenza-web.com%2F2010%2F09%2Ffroggle-cms-piano-di-sviluppo%2F&amp;title=Froggle+CMS%3A+piano+di+sviluppo%21" rel="nofollow" title="Add to&nbsp;Del.icio.us"><img class="social_img" src="http://www.consulenza-web.com/wp-content/plugins/social-bookmarks/images/delicious.png" title="Add to&nbsp;Del.icio.us" alt="Add to&nbsp;Del.icio.us" /></a>
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://digg.com/submit?phase=2&amp;url=http%3A%2F%2Fwww.consulenza-web.com%2F2010%2F09%2Ffroggle-cms-piano-di-sviluppo%2F&amp;title=Froggle+CMS%3A+piano+di+sviluppo%21" rel="nofollow" title="Add to&nbsp;digg"><img class="social_img" src="http://www.consulenza-web.com/wp-content/plugins/social-bookmarks/images/digg.png" title="Add to&nbsp;digg" alt="Add to&nbsp;digg" /></a>
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://www.facebook.com/sharer.php?u=http%3A%2F%2Fwww.consulenza-web.com%2F2010%2F09%2Ffroggle-cms-piano-di-sviluppo%2F" rel="nofollow" title="Add to&nbsp;Facebook"><img class="social_img" src="http://www.consulenza-web.com/wp-content/plugins/social-bookmarks/images/facebook.png" title="Add to&nbsp;Facebook" alt="Add to&nbsp;Facebook" /></a>
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://www.google.com/bookmarks/mark?op=edit&amp;output=popup&amp;bkmk=http%3A%2F%2Fwww.consulenza-web.com%2F2010%2F09%2Ffroggle-cms-piano-di-sviluppo%2F&amp;title=Froggle+CMS%3A+piano+di+sviluppo%21" rel="nofollow" title="Add to&nbsp;Google Bookmarks"><img class="social_img" src="http://www.consulenza-web.com/wp-content/plugins/social-bookmarks/images/google.png" title="Add to&nbsp;Google Bookmarks" alt="Add to&nbsp;Google Bookmarks" /></a>
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://www.linkedin.com/shareArticle?mini=true&amp;url=http%3A%2F%2Fwww.consulenza-web.com%2F2010%2F09%2Ffroggle-cms-piano-di-sviluppo%2F&amp;title=Froggle+CMS%3A+piano+di+sviluppo%21" rel="nofollow" title="Add to&nbsp;LinkedIn"><img class="social_img" src="http://www.consulenza-web.com/wp-content/plugins/social-bookmarks/images/linkedin.png" title="Add to&nbsp;LinkedIn" alt="Add to&nbsp;LinkedIn" /></a>
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://www.stumbleupon.com/submit?url=http%3A%2F%2Fwww.consulenza-web.com%2F2010%2F09%2Ffroggle-cms-piano-di-sviluppo%2F&amp;title=Froggle+CMS%3A+piano+di+sviluppo%21" rel="nofollow" title="Add to&nbsp;Stumble Upon"><img class="social_img" src="http://www.consulenza-web.com/wp-content/plugins/social-bookmarks/images/stumbleupon.png" title="Add to&nbsp;Stumble Upon" alt="Add to&nbsp;Stumble Upon" /></a>
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://www.technorati.com/faves?add=http%3A%2F%2Fwww.consulenza-web.com%2F2010%2F09%2Ffroggle-cms-piano-di-sviluppo%2F" rel="nofollow" title="Add to&nbsp;Technorati"><img class="social_img" src="http://www.consulenza-web.com/wp-content/plugins/social-bookmarks/images/technorati.png" title="Add to&nbsp;Technorati" alt="Add to&nbsp;Technorati" /></a>
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://twitter.com/home/?status=Check+out+Froggle+CMS%3A+piano+di+sviluppo%21+@+http%3A%2F%2Fwww.consulenza-web.com%2F2010%2F09%2Ffroggle-cms-piano-di-sviluppo%2F" rel="nofollow" title="Add to&nbsp;Twitter"><img class="social_img" src="http://www.consulenza-web.com/wp-content/plugins/social-bookmarks/images/twitter.png" title="Add to&nbsp;Twitter" alt="Add to&nbsp;Twitter" /></a>
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://myweb2.search.yahoo.com/myresults/bookmarklet?u=http%3A%2F%2Fwww.consulenza-web.com%2F2010%2F09%2Ffroggle-cms-piano-di-sviluppo%2F&amp;t=Froggle+CMS%3A+piano+di+sviluppo%21" rel="nofollow" title="Add to&nbsp;Yahoo My Web"><img class="social_img" src="http://www.consulenza-web.com/wp-content/plugins/social-bookmarks/images/yahoo.png" title="Add to&nbsp;Yahoo My Web" alt="Add to&nbsp;Yahoo My Web" /></a>
<br />
</div>
</div>
<!-- Social Bookmarks END -->
]]></content:encoded>
			<wfw:commentRss>http://www.consulenza-web.com/2010/09/froggle-cms-piano-di-sviluppo/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Utilizzare il layout di un plugin da un punto qualunque dell&#8217;applicazione</title>
		<link>http://www.consulenza-web.com/2009/06/utilizzare-il-layout-di-un-plugin/</link>
		<comments>http://www.consulenza-web.com/2009/06/utilizzare-il-layout-di-un-plugin/#comments</comments>
		<pubDate>Mon, 29 Jun 2009 18:05:05 +0000</pubDate>
		<dc:creator>peg</dc:creator>
				<category><![CDATA[CakePHP]]></category>
		<category><![CDATA[code design]]></category>
		<category><![CDATA[coding]]></category>
		<category><![CDATA[how to]]></category>
		<category><![CDATA[rad]]></category>
		<category><![CDATA[ToolTIP]]></category>

		<guid isPermaLink="false">http://www.consulenza-web.com/?p=95</guid>
		<description><![CDATA[CakePHP 1.2 introduce una serie di funzionalità dedicate esplicitamente allo sviluppo RAD di applicazioni. In questo articolo spiego come è possibile utilizzare dei layout contenuti in uno specifico plugin utilizzando quindi il concetto stesso di plugin per re-distribuire contenuti grafici oltre alle funzionalità contenute in helpers e components. All&#8217;interno di un metodo di controller, appena [...]]]></description>
			<content:encoded><![CDATA[<p>CakePHP 1.2 introduce una serie di funzionalità dedicate esplicitamente allo <strong>sviluppo RAD di applicazioni</strong>.</p>
<p>In questo articolo spiego come è possibile utilizzare dei <strong>layout contenuti in uno specifico plugin</strong> utilizzando quindi il concetto stesso di plugin per <strong>re-distribuire contenuti grafici</strong> oltre alle funzionalità contenute in helpers e components.</p>
<p>All&#8217;interno di un metodo di controller, appena prima del render (o della conclusione del metodo) è sufficiente specificare plugin e layout che si desidera utilizzare per il rendering della richiesta:</p>
<pre>...
$this-&gt;plugin = 'Myplugin';
$this-&gt;layout = 'my_layout';
...</pre>
<p>Questo tipo di codice produce la richiesta del file: &#8220;/app/plugins/myplugin/views/layouts/my_layout.ctp&#8221; da utilizzarsi come layout per la richiesta in corso.</p>
<!-- Social Bookmarks BEGIN -->
<div class="social_bookmark">
<a><strong><em>Segnala presso:</em></strong></a>
<br />
<div class="d">
<br />
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://del.icio.us/post?url=http%3A%2F%2Fwww.consulenza-web.com%2F2009%2F06%2Futilizzare-il-layout-di-un-plugin%2F&amp;title=Utilizzare+il+layout+di+un+plugin+da+un+punto+qualunque+dell%26%238217%3Bapplicazione" rel="nofollow" title="Add to&nbsp;Del.icio.us"><img class="social_img" src="http://www.consulenza-web.com/wp-content/plugins/social-bookmarks/images/delicious.png" title="Add to&nbsp;Del.icio.us" alt="Add to&nbsp;Del.icio.us" /></a>
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://digg.com/submit?phase=2&amp;url=http%3A%2F%2Fwww.consulenza-web.com%2F2009%2F06%2Futilizzare-il-layout-di-un-plugin%2F&amp;title=Utilizzare+il+layout+di+un+plugin+da+un+punto+qualunque+dell%26%238217%3Bapplicazione" rel="nofollow" title="Add to&nbsp;digg"><img class="social_img" src="http://www.consulenza-web.com/wp-content/plugins/social-bookmarks/images/digg.png" title="Add to&nbsp;digg" alt="Add to&nbsp;digg" /></a>
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://www.facebook.com/sharer.php?u=http%3A%2F%2Fwww.consulenza-web.com%2F2009%2F06%2Futilizzare-il-layout-di-un-plugin%2F" rel="nofollow" title="Add to&nbsp;Facebook"><img class="social_img" src="http://www.consulenza-web.com/wp-content/plugins/social-bookmarks/images/facebook.png" title="Add to&nbsp;Facebook" alt="Add to&nbsp;Facebook" /></a>
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://www.google.com/bookmarks/mark?op=edit&amp;output=popup&amp;bkmk=http%3A%2F%2Fwww.consulenza-web.com%2F2009%2F06%2Futilizzare-il-layout-di-un-plugin%2F&amp;title=Utilizzare+il+layout+di+un+plugin+da+un+punto+qualunque+dell%26%238217%3Bapplicazione" rel="nofollow" title="Add to&nbsp;Google Bookmarks"><img class="social_img" src="http://www.consulenza-web.com/wp-content/plugins/social-bookmarks/images/google.png" title="Add to&nbsp;Google Bookmarks" alt="Add to&nbsp;Google Bookmarks" /></a>
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://www.linkedin.com/shareArticle?mini=true&amp;url=http%3A%2F%2Fwww.consulenza-web.com%2F2009%2F06%2Futilizzare-il-layout-di-un-plugin%2F&amp;title=Utilizzare+il+layout+di+un+plugin+da+un+punto+qualunque+dell%26%238217%3Bapplicazione" rel="nofollow" title="Add to&nbsp;LinkedIn"><img class="social_img" src="http://www.consulenza-web.com/wp-content/plugins/social-bookmarks/images/linkedin.png" title="Add to&nbsp;LinkedIn" alt="Add to&nbsp;LinkedIn" /></a>
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://www.stumbleupon.com/submit?url=http%3A%2F%2Fwww.consulenza-web.com%2F2009%2F06%2Futilizzare-il-layout-di-un-plugin%2F&amp;title=Utilizzare+il+layout+di+un+plugin+da+un+punto+qualunque+dell%26%238217%3Bapplicazione" rel="nofollow" title="Add to&nbsp;Stumble Upon"><img class="social_img" src="http://www.consulenza-web.com/wp-content/plugins/social-bookmarks/images/stumbleupon.png" title="Add to&nbsp;Stumble Upon" alt="Add to&nbsp;Stumble Upon" /></a>
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://www.technorati.com/faves?add=http%3A%2F%2Fwww.consulenza-web.com%2F2009%2F06%2Futilizzare-il-layout-di-un-plugin%2F" rel="nofollow" title="Add to&nbsp;Technorati"><img class="social_img" src="http://www.consulenza-web.com/wp-content/plugins/social-bookmarks/images/technorati.png" title="Add to&nbsp;Technorati" alt="Add to&nbsp;Technorati" /></a>
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://twitter.com/home/?status=Check+out+Utilizzare+il+layout+di+un+plugin+da+un+punto+qualunque+dell%26%238217%3Bapplicazione+@+http%3A%2F%2Fwww.consulenza-web.com%2F2009%2F06%2Futilizzare-il-layout-di-un-plugin%2F" rel="nofollow" title="Add to&nbsp;Twitter"><img class="social_img" src="http://www.consulenza-web.com/wp-content/plugins/social-bookmarks/images/twitter.png" title="Add to&nbsp;Twitter" alt="Add to&nbsp;Twitter" /></a>
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://myweb2.search.yahoo.com/myresults/bookmarklet?u=http%3A%2F%2Fwww.consulenza-web.com%2F2009%2F06%2Futilizzare-il-layout-di-un-plugin%2F&amp;t=Utilizzare+il+layout+di+un+plugin+da+un+punto+qualunque+dell%26%238217%3Bapplicazione" rel="nofollow" title="Add to&nbsp;Yahoo My Web"><img class="social_img" src="http://www.consulenza-web.com/wp-content/plugins/social-bookmarks/images/yahoo.png" title="Add to&nbsp;Yahoo My Web" alt="Add to&nbsp;Yahoo My Web" /></a>
<br />
</div>
</div>
<!-- Social Bookmarks END -->
]]></content:encoded>
			<wfw:commentRss>http://www.consulenza-web.com/2009/06/utilizzare-il-layout-di-un-plugin/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>Utilizzare operatori sql in CakePHP find()</title>
		<link>http://www.consulenza-web.com/2009/02/utilizzare-operatori-sql-in-cakephp-find/</link>
		<comments>http://www.consulenza-web.com/2009/02/utilizzare-operatori-sql-in-cakephp-find/#comments</comments>
		<pubDate>Fri, 06 Feb 2009 12:46:18 +0000</pubDate>
		<dc:creator>peg</dc:creator>
				<category><![CDATA[CakePHP]]></category>
		<category><![CDATA[coding]]></category>
		<category><![CDATA[find]]></category>
		<category><![CDATA[query]]></category>
		<category><![CDATA[sql]]></category>

		<guid isPermaLink="false">http://www.consulenza-web.com/?p=29</guid>
		<description><![CDATA[Riporto il sunto di una discussione sviluppata sul Gruppo Google di CakePHP inerente all&#8217;utilizzo di operatori SQL nelle operazioni di estrazione dati (finder query): http://groups.google.com/group/cake-php/browse_thread/thread/89dd8a8846bad3a1?hl=en L&#8217;autore ha la necessità di estrarre da un campo di testo un numero limitato di caratteri utilizzando l&#8217;operatore SQL LEFT: LEFT(Table.field, len) as new_field_name La soluzione proposta (e testata) consiste [...]]]></description>
			<content:encoded><![CDATA[<p>Riporto il sunto di una discussione sviluppata sul <a title="Vai al gruppo CakePHP" href="http://groups.google.com/group/cake-php/" class="aga aga_27" target="_blank">Gruppo Google</a> di CakePHP inerente all&#8217;utilizzo di operatori SQL nelle operazioni di estrazione dati (finder query):<br />
<a title="Vai alla discussione" href="http://groups.google.com/group/cake-php/browse_thread/thread/89dd8a8846bad3a1?hl=en" class="aga aga_28" target="_blank">http://groups.google.com/group/cake-php/browse_thread/thread/89dd8a8846bad3a1?hl=en</a></p>
<p>L&#8217;autore ha la necessità di estrarre da un campo di testo un numero limitato di caratteri utilizzando l&#8217;operatore SQL LEFT:</p>
<pre>LEFT(Table.field, len) as new_field_name</pre>
<p>La soluzione proposta (e testata) consiste nell&#8217;utilizzo dell&#8217;operatore direttamente nell&#8217;elenco dei campi da estrarre come parametro aggiuntivo dell&#8217;operazione <em>find()</em>.</p>
<pre>$list = $this-&gt;User-&gt;find( "all", array(
  fields = array(
    'id',
    'username',
    'left(User.username, 5) as short_username'
  )
));</pre>
<p>Questo comando di estrazione genera come output la seguente struttura associativa:</p>
<pre>array(
  0 =&gt; array(
    [User] =&gt; array(
      [id] =&gt; 1
      [username] = Marco Pegoraro
    )
    [0] =&gt; array(
      [short_username] =&gt; Marco
    )
  )
)</pre>
<p>Si può dunque notare come il campo ottenuto mediante operatore SQL sia stato erogato fuori dal raggruppamento del modello e inserito sotto ad un indice numerico.</p>
<p>Ho fatto alcuni test utilizzando le relazioni tra i modelli (belongsTo) e ho estratto campi da più modelli definendo campi <em>elaborati</em> da più modelli. Tali campi vengono sempre proposti sotto l&#8217;indice 0.</p>
<p>Al momento in cui scrivo la discussione è in attesa di una soluzione per modificare in modo esplicito il nome del raggruppamento di questi campi prodotto di un operatore SQL.</p>
<h2>Alcune risorse utili:</h2>
<ul>
<li><a href="http://groups.google.com/group/cake-php/browse_thread/thread/f823cc7f168cd619?hl=en" class="aga aga_29" target="_blank">http://groups.google.com/group/cake-php/browse_thread/thread/f823cc7f168cd619?hl=en</a></li>
<li><a href="http://teknoid.wordpress.com/2008/09/29/dealing-with-calculated-fields-in-cakephps-find/" class="aga aga_30" target="_blank">http://teknoid.wordpress.com/2008/09/29/dealing-with-calculated-fields-in-cakephps-find/</a></li>
<li><a href="http://i-love-cake.pastebin.com/f78d0639a" class="aga aga_31" target="_blank">http://i-love-cake.pastebin.com/f78d0639a</a> (MySql Dbo variant)</li>
</ul>
<!-- Social Bookmarks BEGIN -->
<div class="social_bookmark">
<a><strong><em>Segnala presso:</em></strong></a>
<br />
<div class="d">
<br />
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://del.icio.us/post?url=http%3A%2F%2Fwww.consulenza-web.com%2F2009%2F02%2Futilizzare-operatori-sql-in-cakephp-find%2F&amp;title=Utilizzare+operatori+sql+in+CakePHP+find%28%29" rel="nofollow" title="Add to&nbsp;Del.icio.us"><img class="social_img" src="http://www.consulenza-web.com/wp-content/plugins/social-bookmarks/images/delicious.png" title="Add to&nbsp;Del.icio.us" alt="Add to&nbsp;Del.icio.us" /></a>
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://digg.com/submit?phase=2&amp;url=http%3A%2F%2Fwww.consulenza-web.com%2F2009%2F02%2Futilizzare-operatori-sql-in-cakephp-find%2F&amp;title=Utilizzare+operatori+sql+in+CakePHP+find%28%29" rel="nofollow" title="Add to&nbsp;digg"><img class="social_img" src="http://www.consulenza-web.com/wp-content/plugins/social-bookmarks/images/digg.png" title="Add to&nbsp;digg" alt="Add to&nbsp;digg" /></a>
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://www.facebook.com/sharer.php?u=http%3A%2F%2Fwww.consulenza-web.com%2F2009%2F02%2Futilizzare-operatori-sql-in-cakephp-find%2F" rel="nofollow" title="Add to&nbsp;Facebook"><img class="social_img" src="http://www.consulenza-web.com/wp-content/plugins/social-bookmarks/images/facebook.png" title="Add to&nbsp;Facebook" alt="Add to&nbsp;Facebook" /></a>
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://www.google.com/bookmarks/mark?op=edit&amp;output=popup&amp;bkmk=http%3A%2F%2Fwww.consulenza-web.com%2F2009%2F02%2Futilizzare-operatori-sql-in-cakephp-find%2F&amp;title=Utilizzare+operatori+sql+in+CakePHP+find%28%29" rel="nofollow" title="Add to&nbsp;Google Bookmarks"><img class="social_img" src="http://www.consulenza-web.com/wp-content/plugins/social-bookmarks/images/google.png" title="Add to&nbsp;Google Bookmarks" alt="Add to&nbsp;Google Bookmarks" /></a>
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://www.linkedin.com/shareArticle?mini=true&amp;url=http%3A%2F%2Fwww.consulenza-web.com%2F2009%2F02%2Futilizzare-operatori-sql-in-cakephp-find%2F&amp;title=Utilizzare+operatori+sql+in+CakePHP+find%28%29" rel="nofollow" title="Add to&nbsp;LinkedIn"><img class="social_img" src="http://www.consulenza-web.com/wp-content/plugins/social-bookmarks/images/linkedin.png" title="Add to&nbsp;LinkedIn" alt="Add to&nbsp;LinkedIn" /></a>
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://www.stumbleupon.com/submit?url=http%3A%2F%2Fwww.consulenza-web.com%2F2009%2F02%2Futilizzare-operatori-sql-in-cakephp-find%2F&amp;title=Utilizzare+operatori+sql+in+CakePHP+find%28%29" rel="nofollow" title="Add to&nbsp;Stumble Upon"><img class="social_img" src="http://www.consulenza-web.com/wp-content/plugins/social-bookmarks/images/stumbleupon.png" title="Add to&nbsp;Stumble Upon" alt="Add to&nbsp;Stumble Upon" /></a>
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://www.technorati.com/faves?add=http%3A%2F%2Fwww.consulenza-web.com%2F2009%2F02%2Futilizzare-operatori-sql-in-cakephp-find%2F" rel="nofollow" title="Add to&nbsp;Technorati"><img class="social_img" src="http://www.consulenza-web.com/wp-content/plugins/social-bookmarks/images/technorati.png" title="Add to&nbsp;Technorati" alt="Add to&nbsp;Technorati" /></a>
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://twitter.com/home/?status=Check+out+Utilizzare+operatori+sql+in+CakePHP+find%28%29+@+http%3A%2F%2Fwww.consulenza-web.com%2F2009%2F02%2Futilizzare-operatori-sql-in-cakephp-find%2F" rel="nofollow" title="Add to&nbsp;Twitter"><img class="social_img" src="http://www.consulenza-web.com/wp-content/plugins/social-bookmarks/images/twitter.png" title="Add to&nbsp;Twitter" alt="Add to&nbsp;Twitter" /></a>
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://myweb2.search.yahoo.com/myresults/bookmarklet?u=http%3A%2F%2Fwww.consulenza-web.com%2F2009%2F02%2Futilizzare-operatori-sql-in-cakephp-find%2F&amp;t=Utilizzare+operatori+sql+in+CakePHP+find%28%29" rel="nofollow" title="Add to&nbsp;Yahoo My Web"><img class="social_img" src="http://www.consulenza-web.com/wp-content/plugins/social-bookmarks/images/yahoo.png" title="Add to&nbsp;Yahoo My Web" alt="Add to&nbsp;Yahoo My Web" /></a>
<br />
</div>
</div>
<!-- Social Bookmarks END -->
]]></content:encoded>
			<wfw:commentRss>http://www.consulenza-web.com/2009/02/utilizzare-operatori-sql-in-cakephp-find/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

