<?xml version="1.0" encoding="utf-8" ?>

<rss version="2.0">

    <channel>

        <title>Blog</title>
        <link>http://www.giorgioborelli.it/blog</link>
        <description>Idee, notizie ed informazioni sparse</description>

        <generator>basesyndication</generator>
        <!-- TODO
        <lastBuildDate>Mon, 30 Sep 2002 11:00:00 GMT</lastBuildDate>
        <copyright>Copyright 1997-2002 Dave Winer</copyright>
        <docs>http://backend.userland.com/rss</docs>
        <category domain="Syndic8">1765</category>
        <managingEditor>dave@userland.com</managingEditor>
        <webMaster>dave@userland.com</webMaster>
        -->

        <!-- TODO: Should there be an individual image associatable with each
        Weblog object?  I think so... -->
        <image>
            <title>Blog</title>
            <url>http://www.giorgioborelli.it/logo.png</url>
            <link>http://www.giorgioborelli.it/blog</link>
        </image>

        
            <item>
                <title>Correzione degli url relativi con TinyMCE in Plone</title>
                <guid>http://www.giorgioborelli.it/blog/correzione-degli-url-relativi-con-tinymce-in-plone</guid>
                <link>http://www.giorgioborelli.it/blog/correzione-degli-url-relativi-con-tinymce-in-plone</link>
                <description>&lt;img src="http://www.giorgioborelli.it/blog/correzione-degli-url-relativi-con-tinymce-in-plone/leadImage" alt="Correzione degli url relativi con TinyMCE in Plone" title="Correzione degli url relativi con TinyMCE in Plone" height="250" width="350" /&gt;&lt;p&gt;&lt;a class="external-link" href="http://www.tinymce.com"&gt;TinyMCE&lt;/a&gt; è l'editor predefinito in Plone più o meno dalla versione e lo reputo un ottimo editor html. A volte però ha un comportamento che non mi piace molto, ad esempio, quando inserisco un link ad una risorsa che si trova sullo stesso dominio dove è pubblicato il sito, TinyMCE trasforma l'eventuale url assoluto del link  - &lt;i&gt;http://www.miodominio/nome_risorsa&lt;/i&gt; -  in url relativo - &lt;i&gt;nome_risorsa.&lt;/i&gt;&lt;/p&gt;
&lt;p&gt;Questo comportamento non è di per se errato ma risulta fastidioso quando il link viene visualizzato in differenti contesti. Immaginiamo una portlet di testo inserita nella root del portale con all'interno un link ad una pagina chiamata &lt;i&gt;pagina-di-test&lt;/i&gt; che si trova anch'essa nella root del portale.&lt;/p&gt;
&lt;p&gt;Quando visualizzo la portlet dalla home page il link è corretto e punta direttamente a:&lt;i&gt; http://www.miodominio.it/pagina-di-test&lt;/i&gt;&lt;/p&gt;
&lt;p&gt;Cambiando contesto però, per esempio entrando nella cartella &lt;i&gt;news&lt;/i&gt; il link all'interno della portlet punterà a: &lt;i&gt;http://www.miodominio.it/news/pagina-di-test&lt;/i&gt;&lt;/p&gt;
&lt;p&gt;Ora, per il meccanismo dell'acquisizione di Zope, il link punterà alla risorsa corretta e funzionerà correttamente ma esso non è formalmente corretto e potrebbe portare ad altri problemi legati soprattutto al SEO.&lt;i&gt;&lt;br /&gt;&lt;/i&gt;&lt;/p&gt;
&lt;p&gt;Un'impostazione all'interno del javascript di TinyMCE permette però di inibire questo comportamento dell'editor. Aggiungendo all'interno del file &lt;i&gt;tiny_mce_init.js &lt;/i&gt;in &lt;i&gt;portal_skin &lt;/i&gt; la seguente riga alla variabile &lt;i&gt;init_dict&lt;/i&gt; non verranno infatti più convertiti gli indirizzi degli link inseriti.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;convert_urls: false&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;Altre informazioni&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a class="external-link" href="http://stackoverflow.com/questions/5196205/disable-tinymce-url-conversions"&gt;http://stackoverflow.com/questions/5196205/disable-tinymce-url-conversions&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="external-link" href="http://www.tinymce.com/wiki.php/Configuration:convert_urls"&gt;Documentazione TinyMCE&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description>
                <author>Giorgio Borelli</author>

                
                    <category>tips and tricks</category>
                
                
                    <category>Plone</category>
                

                <pubDate>Sat, 24 Mar 2012 16:35:00 +0100</pubDate>

                
            </item>
        
        
            <item>
                <title>Breve introduzione a plone.app.testing</title>
                <guid>http://www.giorgioborelli.it/blog/introduzione-a-plone.app.testing</guid>
                <link>http://www.giorgioborelli.it/blog/introduzione-a-plone.app.testing</link>
                <description>&lt;img src="http://www.giorgioborelli.it/blog/introduzione-a-plone.app.testing/leadImage" alt="Breve introduzione a plone.app.testing" title="Breve introduzione a plone.app.testing" height="282" width="468" /&gt;&lt;p&gt;Ho avuto l'occasione di provare il nuovo prodotto &lt;a class="external-link" href="http://pypi.python.org/pypi/plone.app.testing"&gt;plone.app.testing&lt;/a&gt; e devo dire che sono rimasto positivamente impressionato. L'attenzione verso i test è sempre stata alta all'interno della comunità Plone ed anche questo strumento, che organizza e semplifica l'impostazione dei test, è all'altezza delle aspettative.&lt;/p&gt;
&lt;h2&gt;Cosa cambia con plone.app.testing?&lt;/h2&gt;
&lt;p&gt;La principale differenza, rispetto al precedente approccio ai test, è che &lt;b&gt;plone.app.testing&lt;/b&gt; ci obbliga ad &lt;b&gt;organizzare i nostri test secondo una serie di layer&lt;/b&gt; che si occupano di creare una serie di configurazioni ad hoc per i nostri test.&lt;/p&gt;
&lt;p&gt;Ogni &lt;b&gt;layer&lt;/b&gt; è quindi &lt;i&gt;'indipendente'&lt;/i&gt; dagli altri e deve contenere solamente le configurazioni necessarie per una specifica serie di test.&lt;/p&gt;
&lt;p&gt;Sarà il sistema, durante l'esecuzione dei test, ad occuparsi dell'organizzazione e dell'ordinamento degli stessi in base ai layer. In questo modo i test appartenenti al medesimo layer vengono eseguiti insieme risparmiando tempo nella loro esecuzione.&lt;/p&gt;
&lt;p&gt;All'interno di plone.app.testing sono già definiti alcuni layer preconfigurati che semplificano ulteriormente il lavoro: avremo quindi layer specifici per gli unittest, per i test di integrazione, fuzionali ecc.&lt;/p&gt;
&lt;h2&gt;Come districarsi nella foresta&lt;/h2&gt;
&lt;p&gt;Iniziamo dalla configurazione di una specifica sezione del buildout&lt;/p&gt;
&lt;pre&gt;...&lt;br /&gt;[tests]
recipe = zc.recipe.testrunner
eggs = 
    egg.da.testare [test]&lt;br /&gt;...&lt;/pre&gt;
&lt;p&gt;In questo modo, grazie a &lt;a class="external-link" href="http://pypi.python.org/pypi/zc.recipe.testrunner"&gt;zc.recipe.testrunner&lt;/a&gt;, abbiamo definito una specifica sezione ed incluso il nostro pacchetto tra gli egg da testare.&lt;/p&gt;
&lt;p&gt;Specificando l'opzione &lt;i&gt;[test]&lt;/i&gt; indichiamo inoltre che per il nostro pacchetto dovranno essere prese in considerazione delle specifiche dipendenze definite all'interno del nostro prodotto nel seguente modo:&lt;/p&gt;
&lt;pre class="prettyprint"&gt;# setup.py&lt;br /&gt;...&lt;br /&gt;extras_require = {&lt;br /&gt;    'test': [&lt;br /&gt;        'plone.app.testing',&lt;br /&gt;        ...&lt;br /&gt;    ]&lt;br /&gt;},&lt;br /&gt;...&lt;/pre&gt;
&lt;p&gt;ora possiamo creare il nostro primo layer che sarà basato su PLONE_FIXITURE, un layer predefinito in plone.app.testing:&lt;/p&gt;
&lt;pre class="prettyprint"&gt;from plone.app.testing import PloneSandboxLayer&lt;br /&gt;from plone.app.testing import PLONE_FIXTURE&lt;br /&gt;&lt;br /&gt;class MyLayer(PloneSandboxLayer):&lt;br /&gt;    defaultBases = (PLONE_FIXTURE, )&lt;br /&gt;&lt;br /&gt;    def setUpZope(self, app, configurationContext):&lt;br /&gt;        """Qui configuro l'istanza Zope importando, &lt;br /&gt;        per esempio, le direttive zcml del mio prodotto&lt;br /&gt;        """&lt;br /&gt;        import my.package&lt;br /&gt;        self.loadZCML(package=my.package)&lt;br /&gt;&lt;br /&gt;    def setUpPloneSite(self, portal):&lt;br /&gt;        """Qui posso gestire alcune impostazioni di base di Plone.&lt;br /&gt;        Per esempio installo il prodotto da testare&lt;br /&gt;        """&lt;br /&gt;        self.applyProfile(portal, 'my.package:default')&lt;br /&gt;&lt;br /&gt;    def tearDownZope(self, app):&lt;br /&gt;        """Qui posso inserire tutto quello che dev'essere&lt;br /&gt;        eseguito alla fine del test&lt;br /&gt;        """&lt;/pre&gt;
&lt;p&gt;a questo punto possiamo istanziare una serie di variabili per gestire test:&lt;/p&gt;
&lt;pre class="prettyprint"&gt;MYPACKAGE_FIXTURE = MyLayer()&lt;br /&gt;&lt;br /&gt;from plone.app.testing import IntegrationTesting&lt;br /&gt;MYPACKAGE_INTEGRATION_TESTING = IntegrationTesting(&lt;br /&gt;                                  bases=(MYPACKAGE_FIXTURE, ),&lt;br /&gt;                                  name="MyPackage:Integration")&lt;br /&gt;&lt;br /&gt;from plone.app.testing import FunctionalTesting&lt;br /&gt;MYPACKAGE_FUNCIONAL_TESTING = FunctionalTesting(&lt;br /&gt;                                  bases=(MYPACKAGE_FIXTURE, ),&lt;br /&gt;                                  name="MyPackage:Functional")&lt;/pre&gt;
&lt;p&gt;ed utilizzarle in un test:&lt;/p&gt;
&lt;pre class="prettyprint"&gt;import unittest&lt;br /&gt;&lt;br /&gt;class MyIntegrationTestClass(unittest.TestCase):&lt;br /&gt;    layer = MYPACKAGE_INTEGRATION_TESTING&lt;br /&gt;&lt;br /&gt;    def test_dummy(self):&lt;br /&gt;        """Un utile test!!"""&lt;br /&gt;        self.assertEquals(2+2, 4)&lt;/pre&gt;
&lt;h2&gt;Considerazioni&lt;/h2&gt;
&lt;p&gt;Penso che questo strumento sia eccezionale per la realizzazione dei test in Plone e consente di migliorare il processo di definizione degli stessi.&lt;/p&gt;
&lt;p&gt;Occorre però abituarsi ad alcune piccole cose dovute al meccanismo dei layer. I &lt;b&gt;layer&lt;/b&gt; di default si occupano infatti di configurare lo &lt;b&gt;stretto necessario&lt;/b&gt; e quindi dobbiamo essere noi stessi a &lt;b&gt;definire al loro interno tutto quello di cui abbiamo bisogno.&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;Ecco alcune cose da ricordare:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;se abbiamo un prodotto Zope2 che utilizza il metodo &lt;i&gt;initialize. &lt;/i&gt;Ovvero un classico prodotto per &lt;a class="external-link" href="http://plone.org/products/archetypes"&gt;Archetypes&lt;/a&gt; dobbiamo ricordarci di installarlo manualmente all'interno del layer.&lt;/li&gt;
&lt;li&gt;il plugin &lt;a class="external-link" href="http://pypi.python.org/pypi/z3c.autoinclude"&gt;zc.autoinclude&lt;/a&gt; non funziona all'interno dei layer quindi dobbiamo ricordarci di includere tutti i file zcml necessari&lt;/li&gt;
&lt;li&gt;&lt;i&gt;portal &lt;/i&gt;adesso è impostato come chiave di self.layer in questo modo: &lt;b&gt;&lt;i&gt;self.layer['portal']&lt;/i&gt;&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;per eseguire operazioni con un ruolo Plone particolare possiamo usare: &lt;i&gt;plone.app.testing.setRoles&lt;/i&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;h2&gt;Altre informazioni&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a class="external-link" href="http://pypi.python.org/pypi/plone.app.testing"&gt;Readme di plone.app.testing&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description>
                <author>Giorgio Borelli</author>

                
                    <category>sviluppo</category>
                
                
                    <category>test</category>
                
                
                    <category>howto</category>
                
                
                    <category>Plone</category>
                

                <pubDate>Sat, 07 May 2011 18:59:32 +0200</pubDate>

                
            </item>
        
        
            <item>
                <title>Lo ammetto, con il buildout ci farei anche la pasta!</title>
                <guid>http://www.giorgioborelli.it/blog/lo-ammetto-con-il-buildout-ci-farei-anche-la-pasta</guid>
                <link>http://www.giorgioborelli.it/blog/lo-ammetto-con-il-buildout-ci-farei-anche-la-pasta</link>
                <description>&lt;img src="http://www.giorgioborelli.it/blog/lo-ammetto-con-il-buildout-ci-farei-anche-la-pasta/leadImage" alt="Lo ammetto, con il buildout ci farei anche la pasta!" title="Lo ammetto, con il buildout ci farei anche la pasta!" height="897" width="1125" /&gt;&lt;p&gt;Quando si lavora ad un &lt;b&gt;progetto software&lt;/b&gt; all'interno di un gruppo è imprescindibile che l'&lt;b&gt;ambiente di lavoro sia condiviso.&lt;/b&gt; Condiviso non vuol dire necessariamente che tale ambiente risieda su una macchina comune bensì che l'ambiente debba &lt;b&gt;condividere le medesime caratteristiche&lt;/b&gt; quali le versioni del software installato, configurazioni ecc. Altra caratteristica imprescindibile è &lt;b&gt;che tale ambiente possa essere replicato&lt;/b&gt; su diverse macchine per facilitare le operazioni di &lt;b&gt;sviluppo, staging e deploy.&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;Per fare tutto questo, in ambito python (ma nulla ci vieta di utilizzarlo in altri ambiti) abbiamo un utilissimo strumento: &lt;a class="external-link" href="http://pypi.python.org/pypi/zc.buildout"&gt;zc.buildout&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;B&lt;/b&gt;&lt;b&gt;uildout&lt;/b&gt; è uno strumento che si compone di uno o più file di testo contenenti le configurazioni necessarie alla messa in opera del nostro ambiente lavoro. Ogni &lt;b&gt;file di configurazione è suddiviso in più sezioni&lt;/b&gt; e ad ogni sezione è associata una &lt;b&gt;specifica recipe&lt;/b&gt; che consente l'eseguzione di differenti istruzioni.&lt;/p&gt;
&lt;p&gt;Grazie e queste ricette possiamo qundi &lt;b&gt;compilare&lt;/b&gt; ed &lt;b&gt;installare&lt;/b&gt; software, &lt;b&gt;eseguire comandi&lt;/b&gt; ed ancora &lt;b&gt;configurare&lt;/b&gt; differenti parti del nostro ambiente di lavoro secondo le specifiche del progetto. Possiamo inoltre &lt;b&gt;differenziare l'ambiente di lavoro&lt;/b&gt; in base a &lt;b&gt;differenti necessità&lt;/b&gt;.&lt;/p&gt;
&lt;p&gt;Immaginiamo di dover installare una serie di egg ognuno ad una determinata versione, immaginiamo uno sviluppatore che debba utilizzare differenti versioni del medesimo software per differenti progetti o ancora differenti configurazioni del medesimo software; cosa gli conviene fare? sperare di trovare tutte le differenti versioni del software di cui ha bisogno disponibili per il suo sistema? compilare ogni volta tale software dai sorgenti? configurare manualmente tutto?&lt;/p&gt;
&lt;p&gt;E se per '&lt;i&gt;malaugurata sorte'&lt;/i&gt; un altro sviluppatore subentra in uno di questi progetti? Anche quest'ultimo deve ripetere nuovamente le medesime operazioni del collega sperando di non incorrere in nuovi problemi?&lt;/p&gt;
&lt;h3&gt;Nando, fatti un favore, usa il buildout!&lt;/h3&gt;
&lt;p&gt;Con &lt;b&gt;zc.buildout&lt;/b&gt; puoi installare quello che vuoi e configurarlo come vuoi, puoi condividere con il gruppo di lavoro solo pochi file di testo contenenti le configurazioni per replicare il medesimo ambiente di lavoro ed il giorno che tale ambiente non ti serve più devi solamente cancellare una directory.&lt;/p&gt;
&lt;p&gt;E se il tuo sistemista preferisce compilare a mano una determinata libreria piuttosto che utilizzare la versione fornita con il sistema operativo per installarlo sul server del momento? una semplice configurazione in più ed anche il tuo sistemista, già oberato di lavoro, sarà ben fece di snellire il processo di deploy.&lt;/p&gt;
&lt;p&gt;&lt;b&gt;La morale?&lt;/b&gt; Io uso il buildout per tutto quello che posso, anche per &lt;a class="external-link" href="http://svn.plone.org/svn/collective/buildout/python/"&gt;compilare una determinata versione di &lt;b&gt;python&lt;/b&gt;&lt;/a&gt; qualora essa non fosse più (o non fosse ancora) disponibile per un determinato sistema operativo.&lt;/p&gt;
&lt;p&gt;Nessuno ormai si sognerebbe di installare &lt;b&gt;Plone&lt;/b&gt; senza buildout (infatti lo stesso &lt;a class="external-link" href="http://plone.org/products/plone"&gt;unified installer&lt;/a&gt; lo utilizza) ed a volte mi chiedo come fanno gli sviluppatori di altri progetti in ambito python senza questo strumento.&lt;/p&gt;
&lt;p&gt;Spesso mi chiedo come soddisfano le esigenze descritte qui sopra gli sviluppatori di altri progetti quali &lt;a class="external-link" href="http://www.djangoproject.com"&gt;Django&lt;/a&gt;, &lt;a class="external-link" href="http://www.openerp.com"&gt;Openerp&lt;/a&gt; o ancora &lt;a class="external-link" href="http://turbogears.org"&gt;Turbogears&lt;/a&gt;. Configurano tutto manualmente a suon &lt;a class="external-link" href="http://pypi.python.org/pypi/virtualenv"&gt;virtualenv&lt;/a&gt; ed &lt;a class="external-link" href="http://pypi.python.org/pypi/setuptools"&gt;easy_install&lt;/a&gt;? Trovano questa modalità appropriata? Facilmente condivisibile? E ancora mi chiedo come e quanto incide l'eventuale difficoltà d'installazione nel processo di sviluppo e rilascio di un software?&lt;/p&gt;
&lt;h2&gt;Altre informazioni&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a class="external-link" href="http://www.buildout.org"&gt;buildout.org&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="external-link" href="http://plone.org/documentation/manual/plone-community-developer-documentation/tutorials/buildout/recipes"&gt;interessanti recipe per zc.buildout&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.giorgioborelli.it/blog/gestire-i-propri-progetti-con-zc.buildout" class="internal-link"&gt;Gestire i propri progetti con zc.buildout&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description>
                <author>Giorgio Borelli</author>

                
                    <category>python</category>
                
                
                    <category>sviluppo</category>
                
                
                    <category>configurazione</category>
                
                
                    <category>Plone</category>
                

                <pubDate>Sat, 07 May 2011 16:37:49 +0200</pubDate>

                
            </item>
        
        
            <item>
                <title>Plone testbrowser ed AmbiguityError</title>
                <guid>http://www.giorgioborelli.it/blog/plone-testbrowser-ed-ambiguityerror</guid>
                <link>http://www.giorgioborelli.it/blog/plone-testbrowser-ed-ambiguityerror</link>
                <description>&lt;img src="http://www.giorgioborelli.it/blog/plone-testbrowser-ed-ambiguityerror/leadImage" alt="Plone testbrowser ed AmbiguityError" title="Plone testbrowser ed AmbiguityError" height="268" width="332" /&gt;&lt;p&gt;Quando stiamo scrivendo dei &lt;b&gt;test&lt;/b&gt; per &lt;b&gt;Plone&lt;/b&gt; utilizzando &lt;b&gt;testbrowser&lt;/b&gt; (solitamente &lt;i&gt;Products.Five.testbrowser.Browser&lt;/i&gt;) può capitare che all'interno di una pagina web coesistano &lt;b&gt;due elementi con lo stesso nome.&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;Per esempio, dato questo sorgente html:&lt;/p&gt;
&lt;pre class="prettyprint"&gt;...&lt;br /&gt; &amp;lt;form ...&amp;gt;&lt;br /&gt;  &amp;lt;input type="text" name="nome"/&amp;gt;&lt;br /&gt; ...&lt;br /&gt; &amp;lt;/form&amp;gt;&lt;br /&gt;...&lt;br /&gt; &amp;lt;form ...&amp;gt;&lt;br /&gt;  &amp;lt;input type="text" name="nome"/&amp;gt;&lt;br /&gt; ...&lt;br /&gt;&amp;lt;/form&amp;gt;&lt;br /&gt;...&lt;br /&gt;&lt;/pre&gt;
&lt;p&gt;e volendo eseguire un test che verifichi il funzionamento di una delle due form, potremmo incappare in &lt;b&gt;AmbiguityError:&lt;/b&gt;&lt;/p&gt;
&lt;pre class="prettyprint"&gt;&amp;gt;&amp;gt;&amp;gt; from Products.Five.testbrowser import Browser&lt;br /&gt;&amp;gt;&amp;gt;&amp;gt; browser = Browser()&lt;br /&gt;&amp;gt;&amp;gt;&amp;gt; browser.open('url_della_pagina')&lt;br /&gt;&amp;gt;&amp;gt;&amp;gt; browser.getControl(name='nome')&lt;br /&gt;*** AmbiguityError: name 'nome'&lt;/pre&gt;
&lt;p&gt;tutto ciò è frustrante ma ha una soluzione; è sufficiente passare un parametro &lt;i&gt;index&lt;/i&gt; al metodo &lt;i&gt;getControl&lt;/i&gt; in modo da discernere uno dei due elementi trovati.&lt;/p&gt;
&lt;p&gt;Quindi:&lt;/p&gt;
&lt;pre class="prettyprint"&gt;&amp;gt;&amp;gt;&amp;gt; browser.getControl(name='nome', index=0)&lt;br /&gt;&amp;lt;Control name='nome' type='text'&amp;gt;&lt;/pre&gt;
&lt;p&gt;ci restituirà il primo elemento trovato mentre:&lt;/p&gt;
&lt;pre class="prettyprint"&gt;&amp;gt;&amp;gt;&amp;gt; browser.getControl(name='nome', index=1)&lt;br /&gt;&amp;lt;Control name='nome' type='text'&amp;gt;&lt;/pre&gt;
&lt;p&gt;ci restituirà il secondo elemento.&lt;/p&gt;</description>
                <author>Giorgio Borelli</author>

                
                    <category>test</category>
                
                
                    <category>tips and tricks</category>
                
                
                    <category>Plone</category>
                

                <pubDate>Mon, 28 Feb 2011 18:51:31 +0100</pubDate>

                
            </item>
        
        
            <item>
                <title>Plone.it - lavori in corso</title>
                <guid>http://www.giorgioborelli.it/blog/plone.it-lavori-in-corso</guid>
                <link>http://www.giorgioborelli.it/blog/plone.it-lavori-in-corso</link>
                <description>&lt;img src="http://www.giorgioborelli.it/blog/plone.it-lavori-in-corso/leadImage" alt="Plone.it - lavori in corso" title="Plone.it - lavori in corso" height="866" width="1030" /&gt;&lt;p&gt;All'ultimo symposium di Sorrento ci siamo impegnati a rinnovare la &lt;a class="external-link" href="http://www.plone.it/scopri"&gt;sezione &lt;b&gt;scopri&lt;/b&gt; del sito italiano di Plone&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;In occasione della &lt;a class="external-link" href="http://ploneconf2010.org"&gt;Plone conference di Bristol&lt;/a&gt; io e Maurizio Delmonte siamo finalmente riusciti a presentare il lavoro svolto negli ultimi mesi che si è basato su pochi concetti fondamentali:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;incentrare la comunicazione sull'utente in prima persona. &lt;b&gt;Cosa può fare per me Plone&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;creare un hub comunicativo facilmente manutenibile con poche risorse che porti l'utente a trovare informazioni aggiornate all'interno degli altri siti della comunità&lt;/li&gt;
&lt;li&gt;dare risalto ai progetti internazionali legati a Plone, come &lt;a class="external-link" href="http://www.plonegov.it"&gt;Plonegov&lt;/a&gt;, &lt;a class="external-link" href="http://weblion.psu.edu/ploneedu"&gt;PloneEdu&lt;/a&gt; ecc.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Ecco il risultato confrontato con l'originale&lt;span class="discreet"&gt; (clicca sulle immagini per ingrandirle)&lt;/span&gt;:&lt;/p&gt;
&lt;p style="text-align: center;"&gt;&lt;a href="http://www.giorgioborelli.it/blog/uploads/scopri_ploneitalia_new.jpg" class="internal-link"&gt;&lt;img src="http://www.giorgioborelli.it/blog/uploads/scopri_ploneitalia_new.jpg/image_preview" alt="Nuova sezione scopri" class="image-inline" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt; &lt;/p&gt;
&lt;p style="text-align: center;"&gt;&lt;a href="http://www.giorgioborelli.it/blog/uploads/scopri_ploneitalia.jpg" class="internal-link"&gt;&lt;img src="http://www.giorgioborelli.it/blog/uploads/scopri_ploneitalia.jpg/image_preview" alt="Sezione scopri originale" class="image-inline" /&gt;&lt;/a&gt;&lt;/p&gt;</description>
                <author>Giorgio Borelli</author>

                
                    <category>ploneconf2010</category>
                
                
                    <category>Plone</category>
                

                <pubDate>Sat, 30 Oct 2010 17:18:27 +0200</pubDate>

                
            </item>
        
        
            <item>
                <title>Cinque minuti di JQuery Tools e Plone 4</title>
                <guid>http://www.giorgioborelli.it/blog/cinque-minuti-di-jquery-tools-e-plone-4</guid>
                <link>http://www.giorgioborelli.it/blog/cinque-minuti-di-jquery-tools-e-plone-4</link>
                <description>&lt;img src="http://www.giorgioborelli.it/blog/cinque-minuti-di-jquery-tools-e-plone-4/leadImage" alt="Cinque minuti di JQuery Tools e Plone 4" title="Cinque minuti di JQuery Tools e Plone 4" height="346" width="721" /&gt;&lt;p&gt;L'ultima versione di Plone sfrutta le possibilità offerte da &lt;a class="external-link" href="http://flowplayer.org/tools/index.html"&gt;JQuery Tools&lt;/a&gt; per creare dei notevoli miglioramenti della sua interfaccia utente.&lt;/p&gt;
&lt;p&gt;Molte delle form usate più frequentemente, tra le tante la form dei contatti, ora vengono visualizzate all'interno di popup migliorandone l'aspetto a l'usabilità.&lt;/p&gt;
&lt;p&gt;Il punto di partenza risiede nel pacchetto &lt;a class="external-link" href="http://plone.org/products/plone.app.jquerytools"&gt;plone.app.jquerytools&lt;/a&gt; che include la libreria JQuery Tools fornendo alcuni utili javascript che ci permettono in pochi passi di creare questi overlay.&lt;/p&gt;
&lt;h2&gt;Un esempio pratico&lt;/h2&gt;
&lt;p&gt;Nel nuovo tema di default di Plone, Sunburst, cliccando sul link in alto a destra &lt;i&gt;fatti riconoscere&lt;/i&gt;, vedremo apparire un popup contenente la form per il login al sito.&lt;/p&gt;
&lt;p&gt;Analizzando il sorgente html non notiamo nulla di &lt;i&gt;strano&lt;/i&gt;:&lt;/p&gt;
&lt;pre class="prettyprint"&gt;...&lt;br /&gt;&amp;lt;dl id="portal-personaltools"&amp;gt;&lt;br /&gt;   &amp;lt;dt id="anon-personalbar"&amp;gt;&lt;br /&gt;     &amp;lt;a href="http://.../login_form"&amp;gt;Fatti riconoscere&amp;lt;/a&amp;gt;&lt;br /&gt;   &amp;lt;/dt&amp;gt;&lt;br /&gt;&amp;lt;/dl&amp;gt;&lt;br /&gt;...&lt;br /&gt;&lt;/pre&gt;
&lt;p&gt;ma se andiamo a vedere tra i javascript troviamo un qualcosa di interessante (Products/CMFPlone/skins/plone_ecmascript/popupforms.js):&lt;/p&gt;
&lt;pre class="prettyprint"&gt;// login form&lt;br /&gt;$('#portal-personaltools a[href$=/login],&lt;br /&gt; #portal-personaltools a[href$=/login_form],&lt;br /&gt; .discussion a[href$=/login_form]').prepOverlay({&lt;br /&gt;    subtype: 'ajax',&lt;br /&gt;    filter: common_content_filter,&lt;br /&gt;    formselector: 'form#login_form',&lt;br /&gt;    ...&lt;br /&gt; });&lt;/pre&gt;
&lt;p&gt;Questo breve javascript permette di intercettare il link della form di login e trasformarlo in un popup con la funzione prepOverlay.&lt;/p&gt;
&lt;p&gt;Le parti importanti del javascript riguardano la configurazione di base dove possiamo definire:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;b&gt;subtype:&lt;/b&gt; il tipo di overlay a scelta tra image, iframe, ajax&lt;/li&gt;
&lt;li&gt;&lt;b&gt;filter:&lt;/b&gt; possiamo filtrare alcune parti di html che non ci interessano&lt;/li&gt;
&lt;li&gt;&lt;b&gt;formselector:&lt;/b&gt; l'elemento univoco che rappresenta la form da visualizzare all'interno del popup.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;La definizione di prepOverlay la troviamo all'interno di un altro javascript, overlayhelpers.js  (plone/app/jquerytools/browser/overlayhelpers.js):&lt;/p&gt;
&lt;p&gt;La prima cosa &lt;b&gt;&lt;i&gt;importante&lt;/i&gt;&lt;/b&gt; da ricordare è che il parametro &lt;i&gt;&lt;b&gt;formselector&lt;/b&gt;&lt;/i&gt; deve identificare una form in&lt;br /&gt;modo univoco in quando il corretto funzionamento dell'overlay deriva dalla presenza o meno della form all'interno del contenuto dell'html.&lt;/p&gt;
&lt;p&gt;La seconda parte del javascript riguardante la login form prosegue nel seguente modo:&lt;/p&gt;
&lt;pre class="prettyprint"&gt;   ...&lt;br /&gt;   formselector: 'form#login_form',&lt;br /&gt;   noform: function () {&lt;br /&gt;         if (location.href.search(/pwreset_finish$/) &amp;gt;= 0) {&lt;br /&gt;            return 'redirect';&lt;br /&gt;         } else {&lt;br /&gt;            return 'reload';&lt;br /&gt;         }&lt;br /&gt;   },&lt;br /&gt;   ...&lt;/pre&gt;
&lt;p&gt;Tale sezione indica a prepOverlay quali funzioni intraprendere dopo l'invio della form.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;b&gt;noform:&lt;/b&gt; viene preso in considerazione da quando, come dicevo prima quando la form viene inviata senza errori e discrimina le azioni da intraprendere.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Possiamo quindi definire alcune azioni dopo l'invio della form quali:&lt;b&gt; &lt;/b&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;b&gt;redirect:&lt;/b&gt; reindirizza l'utente ad uno specifico indirizzo&lt;/li&gt;
&lt;li&gt;&lt;b&gt;reload:&lt;/b&gt; ricarica la pagina&lt;/li&gt;
&lt;li&gt;&lt;b&gt;close&lt;/b&gt;: chiude semplicemente il popup&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Consiglio a tutti di leggere la pagina riguardante plone.app.jquerytools su plone.org dove vengono specificati gli altri parametri che possono essere utilizzati, nonché di trarre spunto dal javascript popupforms.js che contiene tutti i javascript utilizzati per i popup delle form.&lt;/p&gt;
&lt;h2&gt;Uso Avanzato&lt;/h2&gt;
&lt;p&gt;Purtroppo non è mai tutto rose e fiori (soprattutto con il javascript). Immaginiamo che all'interno del mio popup devo richiamare, per una particolare esigenza un javascript che venga attivato su di un particolare elemento del popup.&lt;/p&gt;
&lt;p&gt;Nel mio caso mi occorre un plugin per l'autocomplete di un campo di testo che fa una richiesta asincrona al server.&lt;/p&gt;
&lt;p&gt;In una pagina normale avrei scritto qualcosa del genere:&lt;/p&gt;
&lt;pre class="prettyprint"&gt;$(document).ready(function(){&lt;br /&gt;    $("#il-mio-input-text").Foo(&lt;br /&gt;        ...&lt;br /&gt;    );&lt;br /&gt;});&lt;/pre&gt;
&lt;p&gt;Questo però non può funzionare all'interno del mio popup in quanto quando la pagina viene caricata il contenuto del popup, e quindi l'elemento con id &lt;i&gt;il-mio-input-text&lt;/i&gt;, non esiste ancora.&lt;/p&gt;
&lt;p&gt;Devo fare in modo che il metodo &lt;i&gt;Foo&lt;/i&gt; venga chiamato al caricamento del popup.&lt;/p&gt;
&lt;p&gt;Fortunatamente chi ha scritto overlayhelpers.js ha fatto un buon lavoro e quindi studiando un po' &lt;br /&gt;capisco che posso passare un ulteriore parametro di configurazione a &lt;i&gt;prepOverlay&lt;/i&gt;.&lt;/p&gt;
&lt;p&gt;L'attributo &lt;i&gt;&lt;b&gt;config&lt;/b&gt;&lt;/i&gt; permette di passare tutte le configurazioni accettate dagli &lt;a class="external-link" href="http://static.flowplayer.org/tools/overlay/index.html"&gt;overlay di JQuery Tools&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Posso quindi sfruttare l'evento &lt;i&gt;&lt;b&gt;onLoad &lt;/b&gt;&lt;/i&gt;dell'overlay e modificare il javascript del popup nel modo seguente:&lt;/p&gt;
&lt;pre class="prettyprint"&gt;$('#link-per-attivare-il-popup').prepOverlay({&lt;br /&gt;    ...&lt;br /&gt;    config: {&lt;br /&gt;         onLoad: function(){&lt;br /&gt;              $("#il-mio-input-text").Foo(&lt;br /&gt;              ... )}&lt;br /&gt;    }&lt;br /&gt;});&lt;br /&gt;&lt;/pre&gt;</description>
                <author>Giorgio Borelli</author>

                
                    <category>jquery</category>
                
                
                    <category>tips and tricks</category>
                
                
                    <category>html</category>
                
                
                    <category>Plone</category>
                

                <pubDate>Thu, 09 Sep 2010 22:49:05 +0200</pubDate>

                
            </item>
        
        
            <item>
                <title>Needle in an enterprise haystack - Plone search engine integrations</title>
                <guid>http://www.giorgioborelli.it/blog/needle-in-an-enterprise-haystack-plone-search-engine-integrations</guid>
                <link>http://www.giorgioborelli.it/blog/needle-in-an-enterprise-haystack-plone-search-engine-integrations</link>
                <description>&lt;img src="http://www.giorgioborelli.it/blog/needle-in-an-enterprise-haystack-plone-search-engine-integrations/leadImage" alt="Needle in an enterprise haystack - Plone search engine integrations" title="Needle in an enterprise haystack - Plone search engine integrations" height="350" width="569" /&gt;&lt;p&gt;A Sorrento Andrew Mleczko porta la discussione su un importante argomento ovvero l'integrazione di Plone con sistemi di ricerca ed indicizzazione esterni.&lt;/p&gt;
&lt;p&gt;Il sistema di indicizzazione interno di Plone, il portal catalog, è un ottimo strumento che permette una rapida ed efficiente ricerca di contenuti all'interno di Plone. Tale strumento ha comunque alcune limitazioni che riguardano la diminuzione delle performance in sistemi di grosse dimensioni ovvero quando vengono indicizzate centinaia di migliaia di contenuti al suo interno.&lt;/p&gt;
&lt;p&gt;Per ovviare a questo sono state proposte differenti soluzioni alternative al "catalog" che permettono di spostare all'esterno l'indicizzazione dei contenuti in modo da utilizzare sistemi dedicati esclusivamente alla ricerca.&lt;/p&gt;
&lt;p&gt;A tal proposito vengono proposti due casi d'uso dove l'integrazione di un servizio esterno per la ricerca è stata la soluzione ideale per risolvere alcuni problemi.&lt;/p&gt;
&lt;p&gt;Il primo caso interessante riuarda la realizzazione del progetto &lt;a class="external-link" href="http://bibliotecaccessibile.cab.unipd.it"&gt;Biblioteca Accessibile dell'Università di Padova.&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Il progetto, iniziato nel 2009, vuole condurre uno studio sui materiali in formato alternativo presenti nelle biblioteche italiane nonché realizzare un meta motore di ricerca che racchiuda le pubblicazioni di questo tipo presenti nelle biblioteche aderenti al progetto.&lt;/p&gt;
&lt;p&gt;Le risorse bibliografiche possono essere raccolte in modo automatico interrogando i rispettivi cataloghi delle biblioteche piuttosto che essere creati direttamente in Plone dai bibliotecari stessi.&lt;/p&gt;
&lt;p&gt;Un servizio automatizzato permette di raccogliere le informazioni dalle fonti precedentemente definite e popolare il catalogo esterno.&lt;/p&gt;
&lt;p&gt;Per tale catalogo è stato usato &lt;a class="external-link" href="http://lucene.apache.org/solr"&gt;solr,&lt;/a&gt; un software scritto in java open source. Tale software  può essere utilizzato con Plone attraverso il pacchetto &lt;a class="external-link" href="http://plone.org/products/collective.solr"&gt;collective.solr&lt;/a&gt; che fornisce la struttura dell'integrazione.&lt;/p&gt;
&lt;p&gt;Un altro progetto interessante riguarda l'indicizzazione di un insieme di siti Plone per la realizzazione del sistema di &lt;a class="external-link" href="http://www.informagiovanionline.it"&gt;siti web dell'informagiovani dell'emilia romagna&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Punto fondamentale del progetto, che, partendo dall'Emilia Romagna si estenderà a tutte le regioni italiane, è la realizzazione di un insieme di siti Plone che possano esssere consultati dall'utente finale come fossero un unico sito.&lt;/p&gt;
&lt;p&gt;La soluzione del problema consiste nell'indicizzazione di ogni sito all'interno di un database centrale realizzato con Postgresql. Tale operazione viene eseguita con il pacchetto &lt;a class="external-link" href="http://pypi.python.org/pypi/ore.contentmirror"&gt;ore.contentmirror&lt;/a&gt; che prende il contenuto da Plone e lo  &lt;i&gt;rispecchia&lt;/i&gt; in un database relazionale. Per preservare la ricerca fulltext è stato aggiunto un plugin a postgresql che consenta tale funzionalita: &lt;a class="external-link" href="http://www.sai.msu.su/~megera/postgres/gist/tsearch/V2/"&gt;tsearch2.&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Sono questi due casi che rendono evidente come Plone si rivela un ottimo sistema che può essere integrato con altri per la realizzazione di soluzioni differenti che si adattano a differenti casi d'uso.&lt;/p&gt;
&lt;p&gt;Grazie ad Andrew le slide dell'intervento sono già &lt;a class="external-link" href="http://www.slideshare.net/amleczko/needle-in-an-enterprise-haystack"&gt;disponibili su slideshare.&lt;/a&gt;&lt;/p&gt;</description>
                <author>Giorgio Borelli</author>

                
                    <category>eps2010</category>
                
                
                    <category>Plone</category>
                

                <pubDate>Thu, 27 May 2010 17:56:57 +0200</pubDate>

                
            </item>
        
        
            <item>
                <title>collective.amberjack all'European Plone Symposium 2010</title>
                <guid>http://www.giorgioborelli.it/blog/collective.amberjack-alleuropean-plone-symposium-2010</guid>
                <link>http://www.giorgioborelli.it/blog/collective.amberjack-alleuropean-plone-symposium-2010</link>
                <description>&lt;p&gt;A Sorrento il primo talk della seconda giornata viene tenuto da Massimo Azzolini di &lt;a class="external-link" href="http://redturtle.it"&gt;Redturtle&lt;/a&gt; che presenta il prodotto &lt;a class="external-link" href="http://plone.org/products/collective.amberjack"&gt;collective.amberjack.&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Questo interessante prodotto aggiuntivo contiene una serie di strumenti che permettono di creare dei tour guidati all'interno di Plone; tali tour possono essere utilizzati come supporto alla documentazione tradizionale e consentono agli utenti di toccare con mano le funzionalità di Plone.&lt;/p&gt;
&lt;p&gt;Allo stesso modo un tour guidato può essere utilizzato all'interno del sito per spiegare agli utenti alcune procedure guidandoli nell'esecuzione dei singoli passaggi.&lt;/p&gt;
&lt;p&gt;Il prodotto presentato si basa su un tool &lt;a class="external-link" href="http://amberjack.org"&gt;javascript&lt;/a&gt; che viene integrato in Plone attraverso una serie di pacchetti che forniscono un'infrastruttura che facilita la creazione di tuor personalizzati.&lt;/p&gt;
&lt;p&gt;Ogni tour può essere creato attraverso la registrazione di una configurazione &lt;i&gt;zcml&lt;/i&gt; e la definizione di una serie di dizionari che specificano alcuni parametri di base nonché descrivono i vari step dello stesso.&lt;/p&gt;
&lt;p&gt;Un tour così definito può avere un numero differente di step che eseguono azioni sulle pagine html semplicemente discriminando gli elementi della pagina con una serie di regole definite con &lt;i&gt;xpath&lt;/i&gt; o &lt;i&gt;selettori css.&lt;/i&gt;&lt;/p&gt;</description>
                <author>Giorgio Borelli</author>

                
                    <category>eps2010</category>
                
                
                    <category>Plone</category>
                

                <pubDate>Thu, 27 May 2010 12:41:17 +0200</pubDate>

                
            </item>
        
        
            <item>
                <title>Doctor Jekyll and mister transform</title>
                <guid>http://www.giorgioborelli.it/blog/dottor-jekyll-and-mister-transform</guid>
                <link>http://www.giorgioborelli.it/blog/dottor-jekyll-and-mister-transform</link>
                <description>&lt;img src="http://www.giorgioborelli.it/blog/dottor-jekyll-and-mister-transform/leadImage" alt="Doctor Jekyll and mister transform" title="Doctor Jekyll and mister transform" height="299" width="230" /&gt;&lt;p&gt;Proseguono i talk all'European Plone Symposium 2010 e &lt;i&gt;finalmente&lt;/i&gt; si parla di due interessanti prodotti:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a class="external-link" href="http://plone.org/products/collective.xdv"&gt;collective.xdv&lt;/a&gt; - presentato da Laurence Rowe&lt;/li&gt;
&lt;li&gt;&lt;a class="external-link" href="http://pypi.python.org/pypi/collective.transmogrifier"&gt;collective.transmogrifier&lt;/a&gt; - presentato da Rok Garbas&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Sono due prodotti che reputo assolutamente imprescindibili per molti aspetti del mio lavoro quotidiano.&lt;/p&gt;
&lt;p&gt;Il primo prodotto permette di realizzare in maniera abbastanza semplice dei temi grafici per Plone dove l'aspetto puramente grafico è nettamente separato dal resto del sistema; possiamo in questo modo consentire a grafici specializzati non esperti in Plone di realizzare dei template in html statico e css e, successivamente, affidare ad un integratore il compito di creare una serie di configurazioni che permettono di prendere il contenuto da Plone ed inserirlo all'interno del template grafico.&lt;/p&gt;
&lt;p&gt;Il funzionamento di collective.xdv è abbastanza semplice e &lt;a class="external-link" href="http://plone.org/products/collective.xdv/documentation"&gt;ben documentato&lt;/a&gt;; la tecnologia utilizzata si lega ad altri progetti che implementano concetti molto simili in contesti non strettamente legati a Plone: &lt;a class="external-link" href="http://packages.python.org/Deliverance/index.html"&gt;Deliverance&lt;/a&gt; e &lt;a class="external-link" href="http://pypi.python.org/pypi/xdv"&gt;xdv.&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Riguardo questi due ultimi progetti troviamo documentazione e differenti esempi sul web.&lt;/p&gt;
&lt;p&gt;A tal proposito posso citare un interessante &lt;a class="external-link" href="http://blog.mfabrik.com/2010/03/28/integrating-and-theming-wordpress-with-your-cms-site-using-xdv/"&gt;post di Mikko Ohtamaa sull'integrazione di wordpress all'interno di Plone&lt;/a&gt; e le &lt;a class="external-link" href="http://www.slideshare.net/hammertoe/lipstick-on-a-pig"&gt;slide sull'uso di Deliverance in un caso d'uso molto interessante presentato l'anno scorso a Sorrento&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Il secondo prodotto presentato, collective.transmogrifier consente di creare complesse configurazioni per la manipolazione di catene di dati. Il caso d'uso più comune è l'esportazione e l'importazione di contenuti per la migrazione di sistemi informativi.&lt;/p&gt;
&lt;p&gt;Questo prodotto, di cui si sta parlando molto ultimamente, consiste in realtà in &lt;a class="external-link" href="http://pypi.python.org/pypi?%3Aaction=search&amp;term=transmogrifier"&gt;una serie di pacchetti&lt;/a&gt; che, utilizzati insieme, possono essere d'aiuto per la migrazione  verso Plone 4 quando il normale processo di migrazione fallisce ovvero quando, per svariati motivi, non è possibile  avere la medesima struttura di prodotti preesistente e quindi si rende necessaria un'aricolata manipolazione dei dati e dei contenuti esistenti.&lt;/p&gt;
&lt;p&gt;Una parte  interessante del talk riguarda la lezione imparata dallo stesso relatore quando, la presenza di un Data.fs di dimensioni importanti (&amp;gt;10Gb) e la necessità di dismettere codice creato ad hoc non più aggiornato ha reso necessario, per la migrazione dei contenuti da un vecchio Plone 2.x a Plone 4, l'utilizzo di collective.transmogrifier.&lt;/p&gt;
&lt;p&gt;Rok Garbas ha identificato quindi i punti fondamentali da prendere in considerazione nella realizzazione di un sistema di migrazione:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;fare in modo che la migrazione sia ripetibile (per esempio attraverso l'uso di Genericsetup)&lt;/li&gt;
&lt;li&gt;la migrazione di differenti parti di una pagina possono essere fatti separatamente&lt;/li&gt;
&lt;li&gt;è importante separare la migrazione in step separati import-export&lt;/li&gt;
&lt;li&gt;il monitoraggio della migrazione è un passo fondamentale per il successo della stessa&lt;/li&gt;
&lt;li&gt;il processo di creazione di un blueprint è talmente immediato è inutile complicarsi la vita creando codice totalmente riutilizzabile&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Purtroppo, a differenza del prodotto precedente, nel caso di collective.transmogrifier la documentazione online è piuttosto scarsa. Consiglio a tutti coloro che intendono cimentarsi di leggere attentamente la documentazione presente all'interno dei vari pacchetti di transmogrifier ovvero i differenti doctest.&lt;/p&gt;
&lt;p&gt;In italiano potete trovare due post:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a class="external-link" href="http://redomino.com/it/labs/blog/giorgio-borelli/con-tutti-questi-tubi-rischio-di-non-capirci-un-tubo"&gt;Con tutti questi tubi rischio di non capirci un tubo&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="external-link" href="http://miziodel.wordpress.com/2010/02/28/transmogrifier-una-catena-di-montaggio-per-generare-contenuti/"&gt;Transmogrifier: una catena di montaggio per generare contenuti&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description>
                <author>Giorgio Borelli</author>

                
                    <category>sviluppo</category>
                
                
                    <category>configurazione</category>
                
                
                    <category>eps2010</category>
                
                
                    <category>Plone</category>
                

                <pubDate>Wed, 26 May 2010 17:34:17 +0200</pubDate>

                
            </item>
        
        
            <item>
                <title>Matt Hamilton - Event driven Programming</title>
                <guid>http://www.giorgioborelli.it/blog/matt-hamilton-event-driven-programming</guid>
                <link>http://www.giorgioborelli.it/blog/matt-hamilton-event-driven-programming</link>
                <description>&lt;img src="http://www.giorgioborelli.it/blog/matt-hamilton-event-driven-programming/leadImage" alt="Matt Hamilton - Event driven Programming" title="Matt Hamilton - Event driven Programming" height="468" width="468" /&gt;&lt;p&gt;L'European Plone Symposium 2010 entra nel vivo, dopo il talk di Simone De Ponti sull'uso di Plone all'interno di un complesso sistema di pubblicazione aziendale dove Plone è stato integrato con differenti sistemi per realizzare uno specifico caso d'uso.&lt;/p&gt;
&lt;p&gt;È tempo di&lt;b&gt; Matt Hamilton,&lt;/b&gt; di &lt;a class="external-link" href="http://www.netsight.co.uk"&gt;Netsight&lt;/a&gt;, che ci presenta quale è il ruolo dei&lt;i&gt; 'Plone integrators'&lt;/i&gt; e di come essi possono operare all'interno di Plone. A differenza degli sviluppatori essi usano Plone integrandolo con altri sistemi attraverso l'utilizzo di differenti prodotti aggiuntivi evitando di modificare parti sostanziali di codice.&lt;/p&gt;
&lt;p&gt;Un problema fondamentale di questo lavoro riguarda la personalizzazione di prodotti già esistenti per lo sviluppo di nuove funzionalità senza dover per forza modificare il codice del prodotto stesso.&lt;/p&gt;
&lt;p&gt;Il caso reale discusso nel talk presenta l'integrazione del prodotto &lt;a class="external-link" href="http://plone.org/products/plone.app.discussion"&gt;plone.app.discussion&lt;/a&gt; con sistema esterno di anti-spam. Il prodotto in questione, che consente di gestire i commenti in Plone,  comprende già al suo interno un sistema di &lt;a class="external-link" href="http://it.wikipedia.org/wiki/CAPTCHA"&gt;captcha&lt;/a&gt; ma in questo caso si ha la necessità di aggiungere il supporto ad &lt;a class="external-link" href="http://akismet.com"&gt;Akismet&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Per risolvere il problema è possibile seguire differenti strade:&lt;/p&gt;
&lt;p&gt;Una prima soluzione possibile consiste nel rifacimento di alcune parti sostanziali del prodotto originale piuttosto che la sovrascrittura diretta di alcune parti di codice attraverso un sistema di sottoclassi. Ma questa soluzione potrebbe risultare piuttosto invasiva e dispendiosa in termini di tempo.&lt;/p&gt;
&lt;p&gt;Un'altra via consiste nell'utilizzo della Zope Component Architecture per sovrascrivere solo alcuni componenti in modo da modificarne il comportamento standard.&lt;/p&gt;
&lt;p&gt;La scelta finale però ricade sull'uso degli &lt;b&gt;eventi;&lt;/b&gt; in questo modo è possibile aggiungere la funzionalità desiderata senza modificare in alcun modo il codice esistente. Ulteriori vantaggi consistono in una notevole facilità di implementazione del codice aggiuntivo all'interno di un piccolo prodotto.&lt;/p&gt;
&lt;p&gt;Ma come funziona il tutto?&lt;/p&gt;
&lt;p&gt;All'interno di plone.app.discussion sono presenti degli eventi che vengono attivati alla creazione di un commento. Dato questo presupposto possiamo quindi sviluppare una piccola porzione di codice che intercetta l'evento ed esegue una determinata azione.&lt;/p&gt;
&lt;p&gt;La registrazione di un semplice &lt;b&gt;subscriber&lt;/b&gt; in zcml permette quindi di realizzare la nostra funzionalità aggiuntiva.&lt;/p&gt;
&lt;pre class="prettyprint"&gt;&amp;lt;subscriber&lt;br /&gt;    for = ".interfaces.IMyOBject&lt;br /&gt;           .interfaces.IMyEvent"&lt;br /&gt;    factory = ".event.myEventHandler" /&amp;gt;&lt;/pre&gt;
&lt;p&gt;L'azione vera e propria verrà realizzata all'interno della classe &lt;i&gt;myEventHandler&lt;/i&gt;.&lt;/p&gt;
&lt;p&gt;Soluzioni di questo tipo possono essere realizzate in molteplici casi d'uso; a seconda dell'evento intercettato possiamo infatti configurare particolari comportamenti in base alle nostre esigenze.&lt;/p&gt;
&lt;p&gt;Per es.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;alla creazione di una cartella è possibile aggiungervi altri contenuti&lt;/li&gt;
&lt;li&gt;alla creazione di un particolare tipo contenuto è possibile modificarne alcuni metatdata in base alle proprie esigenze&lt;/li&gt;
&lt;li&gt;alla modifica di un contenuto possiamo verificare l'effettiva validità dei suoi parametri in base a determinate condizioni&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Personalmente credo che la cosa più difficile in questo caso possa essere l'abitudine a lavorare in questo modo, dal punto di vista dello sviluppatore ci dev'essere la capacità di integrare un sistema coerente di eventi all'interno del proprio prodotto.&lt;/p&gt;
&lt;p&gt;Da parte degli integratori ci vuole la capacità di conoscere gli eventi disponibili in modo tale da poterli intercettare per estendere le funzionalità dei prodotti utilizzati.&lt;/p&gt;</description>
                <author>Giorgio Borelli</author>

                
                    <category>sviluppo</category>
                
                
                    <category>eps2010</category>
                
                
                    <category>Plone</category>
                

                <pubDate>Wed, 26 May 2010 15:02:57 +0200</pubDate>

                
            </item>
        
        
            <item>
                <title>European Plone Symposium 2010</title>
                <guid>http://www.giorgioborelli.it/blog/european-plone-symposium-2010</guid>
                <link>http://www.giorgioborelli.it/blog/european-plone-symposium-2010</link>
                <description>&lt;img src="http://www.giorgioborelli.it/blog/european-plone-symposium-2010/leadImage" alt="European Plone Symposium 2010" title="European Plone Symposium 2010" height="193" width="300" /&gt;&lt;p style="font-size: 12.1333px; line-height: 18.2px;"&gt;Nella splendida cornice di Sorrento è iniziato l'European Plone Symposium 2010. L'evento, organizzato da &lt;a class="external-link" href="http://www.abstract.it" style="font-size: 12.1333px; line-height: 18.2px;"&gt;Abstract&lt;/a&gt;, è ormai un appuntamento annuale importante per tutti coloro che vogliono rimanere aggiornati sulle ultime novità riguardanti Plone.&lt;/p&gt;
&lt;p style="font-size: 12.1333px; line-height: 18.2px;"&gt;Proprio in quest'ottica il symposium viene aperto da &lt;a class="external-link" href="http://www.jarn.com" style="font-size: 12.1333px; line-height: 18.2px;"&gt;Geir Bækholt di Jarn&lt;/a&gt; con il talk &lt;b style="font-size: 12.1333px; line-height: 18.2px;"&gt;Plone 4 and beyond&lt;/b&gt; che riassume il lavoro svolto negli ultimi mesi per la realizzazione di Plone 4.&lt;/p&gt;
&lt;p style="font-size: 12.1333px; line-height: 18.2px;"&gt;Ad un anno di distanza dalla sua presentazione molte sono le &lt;a href="http://www.giorgioborelli.it/blog/un-rapido-sguardo-a-plone-4" class="internal-link"&gt;funzionalità integrate&lt;/a&gt; nella nuova versione e tanto il lavoro che è stato fatto sino ad ora soprattuto dal punto di vista delle performance e dell'interfaccia utente. Il rilascio ufficiale è previsto per quest'estate e quindi viene sottolineata l'esigenza che gli sforzi di tutti si concentrino nel test delle funzionalità di Plone e dei prodotti aggiuntivi.&lt;/p&gt;
&lt;p style="font-size: 12.1333px; line-height: 18.2px;"&gt;Se Plone 4.0 è pronto per gli ultimi test ed il rilascio, lo sguardo degli sviluppatori si è già spostato verso la release 4.1 dove verranno integrate alcune funzionalità non ancora pronte per la prima uscita quali:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a class="external-link" href="http://pypi.python.org/pypi/plone.app.registry"&gt;plone.app.registry,&lt;/a&gt; un sistema per concentrare ed uniformare le configurazioni di Plone&lt;/li&gt;
&lt;li&gt;&lt;a class="external-link" href="http://plone.org/products/plone.app.discussion"&gt;plone.app.discussion,&lt;/a&gt; un nuovo sistema di gestione dei commenti che già è utilizzabiile come prodotto aggiuntivo su Plone 3&lt;/li&gt;
&lt;li&gt;&lt;a class="external-link" href="http://plone.org/products/collective.amberjack"&gt;collective.amberjack,&lt;/a&gt; uno strumento promosso da &lt;a class="external-link" href="http://www.redturtle.it"&gt;redturtle&lt;/a&gt; per creare tour guidati in Plone&lt;/li&gt;
&lt;/ul&gt;
&lt;p style="font-size: 12.1333px; line-height: 18.2px;"&gt;Le novità non finiscono qui in quanto altre saranno le migliorie che porteranno ad un rifacimento degli oggetti di tipo evento ed a una ristrutturazione degli oggetti collezione di cui verrà migliorato sia il backend di ricerca che l'interfaccia di gestione.&lt;/p&gt;</description>
                <author>Giorgio Borelli</author>

                
                    <category>eps2010</category>
                
                
                    <category>Plone</category>
                

                <pubDate>Wed, 26 May 2010 11:40:13 +0200</pubDate>

                
            </item>
        
        
            <item>
                <title>World Plone Day 2010 - Università di Macerata</title>
                <guid>http://www.giorgioborelli.it/blog/world-plone-day-2010-universita-di-macerata</guid>
                <link>http://www.giorgioborelli.it/blog/world-plone-day-2010-universita-di-macerata</link>
                <description>&lt;img src="http://www.giorgioborelli.it/blog/world-plone-day-2010-universita-di-macerata/leadImage" alt="World Plone Day 2010 - Università di Macerata" title="World Plone Day 2010 - Università di Macerata" height="600" width="800" /&gt;&lt;p&gt;Il 28 aprile 2010, in occasione del &lt;a class="external-link" href="http://worldploneday.org"&gt;World Plone Day,&lt;/a&gt; è stata organizzata presso&lt;b&gt; l'Università di Macerata&lt;/b&gt; una giornata di discussione su Plone facendo un particolare riferimento agli ambiti d'applicazione in campo accademico e universitario.&lt;/p&gt;
&lt;p&gt;L'evento, organizzato dall'Università sotto la spinta di &lt;a class="external-link" href="http://miziodel.wordpress.com"&gt;Maurizio Delmonte&lt;/a&gt; e di &lt;a class="external-link" href="http://www.abstract.it"&gt;Abstract,&lt;/a&gt; è riuscito a  richiamare più di cinquanta persone interessate alla discussione. Sicuramente un buon risultato considerato che è la prima volta che viene organizzato un evento su questo argomento a Macerata.&lt;/p&gt;
&lt;p&gt;L'introduzione alla giornata del professor PG Rossi chiarisce subito le linee guida della discussione delineando quali siano le necessità intrinseche dei sistemi informativi web all'interno di un'università.&lt;/p&gt;
&lt;p&gt;Da un punto di vista strutturale possiamo immaginare le università come delle &lt;i&gt;aziende &lt;/i&gt;suddivise in differenti settori e dipartimenti dove ognuno di questi necessita di uno spazio ben definito con differenti peculiarità ed esigenze comunicative specifiche.&lt;/p&gt;
&lt;p&gt;Il sistema di portali web dell'università è quindi un ecosistema complesso che ha assunto negli anni un'importanza sempre maggiore come fonte di informazione sia rivolta verso l'università stessa che verso l'esterno. Da qui nasce l'esigenza di &lt;b&gt;dotarsi di un strumento flessibile&lt;/b&gt; che si adatti ai bisogni di ogni facoltà nonché si integri con differenti ed eterogenei sistemi informativi.&lt;/p&gt;
&lt;p&gt;Proprio per queste caratteristiche &lt;b&gt;a Macerata è stato scelto Plone&lt;/b&gt; per la realizzazione dei portali web dell'Università  con la consapevolezza inoltre che sarà uno strumento adeguato alle esigenze dell'università negli anni a venire.&lt;/p&gt;
&lt;p&gt;La scelta dello strumento tecnico è però solo il primo passo per l'organizzazione dell'informazione e l'erogazione dei  servizi dell'ateneo. La continua formazione del personale coinvolto in questo processo è un momento fondamentale perché si  definisca una &lt;i&gt;consuetudine d'azione&lt;/i&gt; che evolve nel tempo per un progressivo miglioramento della comunicazione.&lt;/p&gt;
&lt;p&gt;Sono questi i passi obbligati che trasformano un &lt;i&gt;semplice&lt;/i&gt; sistema informativo in un vero e proprio strumento di lavoro  consentendone l'evoluzione verso un sistema di knowledge management.&lt;/p&gt;
&lt;p&gt;I miei sinceri complimenti a tutti gli organizzatori dell'evento per le ottime capacità organizzative nonché l'ospitalità e la cordialità dimostrata.&lt;/p&gt;
&lt;p&gt;&lt;a class="external-link" href="http://www.unimc.it/ciem/notizie/world-plone-day-28-aprile-2010-a-unimc"&gt;Vai la pagina dell'evento&lt;/a&gt;&lt;/p&gt;</description>
                <author>Giorgio Borelli</author>

                
                    <category>wpd</category>
                
                
                    <category>Plone</category>
                

                <pubDate>Tue, 11 May 2010 10:12:05 +0200</pubDate>

                
            </item>
        
        
            <item>
                <title>Aggiungere una patch da buildout</title>
                <guid>http://www.giorgioborelli.it/blog/aggiungere-una-patch-da-buildout</guid>
                <link>http://www.giorgioborelli.it/blog/aggiungere-una-patch-da-buildout</link>
                <description>&lt;img src="http://www.giorgioborelli.it/blog/aggiungere-una-patch-da-buildout/leadImage" alt="Aggiungere una patch da buildout" title="Aggiungere una patch da buildout" height="270" width="352" /&gt;&lt;p&gt;Ho modifiato un prodotto di terzi e non ho accesso al repository dove risiede, non voglio quindi duplicare il prodotto su un mio repository e ho inviato agli autori la patch dei file modificati.&lt;/p&gt;
&lt;p&gt;Coma fare ad utilizzare il prodotto modificato da me in attesa che vengano (o non vengano) accetta le modifiche da me apportate?&lt;/p&gt;
&lt;p&gt;La ricetta &lt;a class="external-link" href="http://pypi.python.org/pypi/collective.recipe.patch"&gt;collective.recipe.patch&lt;/a&gt; fa al caso mio; due righe in più al buildout e posso applicare la mia patch all'esecuzione del buildout.&lt;/p&gt;
&lt;pre class="prettyprint"&gt;[buildout]&lt;br /&gt;parts = &lt;br /&gt;   patch-prodotto&lt;br /&gt;...&lt;br /&gt;&lt;br /&gt;[patch-prodotto]&lt;br /&gt;recipe = collective.recipe.patch&lt;br /&gt;egg = nome.pacchetto_python == 0.3.1&lt;br /&gt;patches = nome_del_file.patch&lt;/pre&gt;</description>
                <author>Giorgio Borelli</author>

                
                    <category>python</category>
                
                
                    <category>sviluppo</category>
                

                <pubDate>Thu, 15 Apr 2010 10:31:14 +0200</pubDate>

                
            </item>
        
        
            <item>
                <title>Errore nella reimpostazione della pasword</title>
                <guid>http://www.giorgioborelli.it/blog/errore-nella-reimpostazione-della-pasword</guid>
                <link>http://www.giorgioborelli.it/blog/errore-nella-reimpostazione-della-pasword</link>
                <description>&lt;p&gt;Utilizzando &lt;a class="external-link" href="http://plone.org/products/collective.xdv"&gt;collective.xdv&lt;/a&gt; mi sono accordo di uno spiacevole errore quando gli utenti volevano resettare la propria password.&lt;/p&gt;
&lt;p&gt;Il sistema dava un errore generico nella reimpostazione della password. Questo errore però capitava solamente nel sito dove è stato applicato il tema grafico realizzato con collextive.xdv.&lt;/p&gt;
&lt;p&gt;Una piccola ricerca mi porta a &lt;a class="external-link" href="http://n2.nabble.com/Password-Reset-not-working-via-XDV-theme-td4251283.html#a4251283"&gt;questa discussione&lt;/a&gt; e scopro che la soluzione è semplice:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;ricordarsi sempre di inserire una regola per il tag &lt;b&gt;&amp;lt;base ... /&amp;gt;&lt;/b&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Per esempio nel file delle regole inserire:&lt;/p&gt;
&lt;pre class="prettyprint"&gt;...&lt;br /&gt;&amp;lt;replace content="/html/head/base" theme="/html/head/base"/&amp;gt;&lt;br /&gt;...&lt;br /&gt;&lt;/pre&gt;
&lt;p&gt;e nel tema:&lt;/p&gt;
&lt;pre class="prettyprint"&gt;&amp;lt;html&amp;gt;&lt;br /&gt;  &amp;lt;head&amp;gt;&lt;br /&gt;    &amp;lt;base /&amp;gt;&lt;br /&gt;...&lt;/pre&gt;</description>
                <author>Giorgio Borelli</author>

                
                    <category>Plone</category>
                
                
                    <category>theming</category>
                

                <pubDate>Wed, 14 Apr 2010 11:25:21 +0200</pubDate>

                
            </item>
        
        
            <item>
                <title>Creare un widget personalizzato con Archetypes</title>
                <guid>http://www.giorgioborelli.it/blog/creare-un-widget-personalizzato-con-archetypes</guid>
                <link>http://www.giorgioborelli.it/blog/creare-un-widget-personalizzato-con-archetypes</link>
                <description>&lt;img src="http://www.giorgioborelli.it/blog/creare-un-widget-personalizzato-con-archetypes/leadImage" alt="Creare un widget personalizzato con Archetypes" title="Creare un widget personalizzato con Archetypes" height="419" width="300" /&gt;&lt;p&gt;Mi occorreva un widget personalizzato per un mio &lt;i&gt;content type &lt;/i&gt;quindi mi sono dovuto studiare il funzionamento del modulo Products.Archetypes.widget&lt;/p&gt;
&lt;p&gt;Con piacevole sorpresa ho capito che la creazione di un widget personalizzato non è troppo complicato.&lt;/p&gt;
&lt;p&gt;Buona parte delle funzionalità del mio widgets sono già presenti in StringWidget, uno dei widget più comuni.&lt;/p&gt;
&lt;h2&gt;Premesse&lt;/h2&gt;
&lt;p&gt;Quando ci si aproccia ai widget di Archetypes bisogna tenere presente alcune cose fondamenteali:&lt;/p&gt;
&lt;p&gt;La prima è che ciascun widget può essere associato a uno o più Field di Archetypes.&lt;/p&gt;
&lt;p&gt;La seconda è che ogni widget può avere principalmente due modalità: edit e view. La prima viene utilizzata per visualizzare il widget per l'inserimento e la modifica dei dati il secondo per la loro visualizzazione.&lt;/p&gt;
&lt;p&gt;Per fare questo i procedimenti da seguire sono esattamente tre:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;creare una classe widget che contenga le proprietà ed i metodi necessari al suo funzionamento&lt;/li&gt;
&lt;li&gt;registrare il widget per uno o più tipi di campo&lt;/li&gt;
&lt;li&gt;realizzare un template contenente una particolare macro per ogni modalità del widget&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Realizzazione&lt;/h2&gt;
&lt;p&gt;All'interno del mio pacchetto creo un modulo widget.py che contiene la definizione del widget:&lt;/p&gt;
&lt;pre class="prettyprint"&gt;from Products.Archetypes.Widget import StringWidget&lt;br /&gt;from Products.Archetypes.Registry import registerWidget&lt;br /&gt;&lt;br /&gt;class MyStringWidget(StringWidget):&lt;br /&gt;    """Un widget personalizzato basato su StringWidget"""&lt;br /&gt;&lt;br /&gt;    # copio le proprietà del widget originario&lt;br /&gt;    _properties = StringWidget._properties.copy()&lt;br /&gt;&lt;br /&gt;    # qui posso aggiungere tutte le proprietà che voglio&lt;br /&gt;    # esse potranno essere impostate alla definizione dello &lt;br /&gt;    # schema del mio archetype&lt;br /&gt;    _properties.update({&lt;br /&gt;        'macro' : "mystring_widget", # questo è il page template &lt;br /&gt;                                   # che verrà utilizzato dal widget&lt;br /&gt;        'mia_proprieta' : 'una proprietà personalizzata'&lt;br /&gt;    })&lt;br /&gt;&lt;br /&gt;    def simpleValue(self):&lt;br /&gt;        """Oltre a personalizzare ogni metodo originario &lt;br /&gt;           posso creare tutti i metodi che voglio"""&lt;br /&gt;        return u"Troppo fico questo tutorial!!!"&lt;br /&gt;&lt;br /&gt;# alla fine posso registrare il widget per un campo particolare&lt;br /&gt;registerWidget(MyStringWidget,&lt;br /&gt;               title='MyWidget',&lt;br /&gt;               description=('Descrizione del mio widget'),&lt;br /&gt;               used_for=('Products.Archetypes.Field.StringField'))&lt;br /&gt;&lt;/pre&gt;
&lt;p&gt;Adesso posso registrare il template &lt;i&gt;-- mystring_widget.pt&lt;/i&gt; -- per il mio widget in uno skin layer copiando alla grande da string.pt ;-)&lt;/p&gt;
&lt;pre class="prettyprint"&gt;...&lt;br /&gt;&amp;lt;!-- macro per la modalità view --&amp;gt;&lt;br /&gt;&amp;lt;metal:view_macro define-macro="view"&lt;br /&gt;  tal:define="kssClassesView context/@@kss_field_decorator_view;&lt;br /&gt;              getKssClasses nocall:kssClassesView/getKssClassesInlineEditable;"&amp;gt;&lt;br /&gt;&lt;br /&gt;  &amp;lt;span metal:define-macro="string-field-view"&lt;br /&gt;      tal:define="kss_class python:getKssClasses(fieldName,&lt;br /&gt;               templateId='widgets/mystring_widget', macro='string-field-view');"&lt;br /&gt;      tal:attributes="class kss_class;&lt;br /&gt;                      id string:parent-fieldname-$fieldName"&amp;gt;&lt;br /&gt;&lt;br /&gt;     &amp;lt;!-- richiamando accessor() visualizzo &lt;br /&gt;          il valore del campo associato al widget --&amp;gt;       &lt;br /&gt;     &amp;lt;span metal:define-slot="inside" &lt;br /&gt;           tal:replace="accessor"&amp;gt;string&amp;lt;/span&amp;gt;&lt;br /&gt;&lt;br /&gt;     &amp;lt;!-- posso richiamare i metodi del mio widget nel seguente modo --&amp;gt;&lt;br /&gt;     &amp;lt;span tal:replace="widget/simpleValue"&amp;gt;valore del metodo simpleValue&amp;lt;/span&amp;gt;&lt;br /&gt;&lt;br /&gt;  &amp;lt;/span&amp;gt;&lt;br /&gt;&amp;lt;/metal:view_macro&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;!-- macro per la modalità di edit&lt;br /&gt;     l'ho lasciata uguale all'originale cfr. string.pt --&amp;gt;&lt;br /&gt;&amp;lt;metal:define define-macro="edit"&amp;gt;&lt;br /&gt;  &amp;lt;metal:use use-macro="field_macro | here/widgets/field/macros/edit"&amp;gt;&lt;br /&gt;     &amp;lt;input metal:fill-slot="widget_body"&lt;br /&gt;        ... &lt;br /&gt;     /&amp;gt;&lt;br /&gt;  &amp;lt;/metal:use&amp;gt;&lt;br /&gt;&amp;lt;/metal:define&amp;gt;&lt;br /&gt;...&lt;br /&gt;&lt;/pre&gt;
&lt;p&gt;Partendo da questa base posso quindi creare i widget che voglio a seconda del caso; consiglio di guardare cosa fanno i widget di default di Archetypes piuttosto che guardare il funzionamento di quelli nella &lt;a class="external-link" href="http://plone.org/products/by-category/widgets"&gt;sezione prodotti di plone.org&lt;/a&gt;.&lt;/p&gt;</description>
                <author>Giorgio Borelli</author>

                
                    <category>sviluppo</category>
                
                
                    <category>howto</category>
                
                
                    <category>Plone</category>
                

                <pubDate>Thu, 18 Mar 2010 17:53:13 +0100</pubDate>

                
            </item>
        

    </channel>
</rss>



