SlideShare ist ein Scribd-Unternehmen logo
1 von 29
DRUPAL 8:
I CAMBIAMENTI CHE CI
     ASPETTANO
  Marco Pagliarulo (@Morpheus80ta)
    Corrado Grimoldi (@coreykck)
Indice
• In & Out
• Theming con Twig
• HTML5
• Responsive Layout + Mobile
• CMI: la proposta
• Punti di contatto con Symfony
•   Views
                 In & Out
                                        •   Blog

                                    •    Profile

•   Date API

•   DrupalUnitTestBase

                            •   Dashboard

•   Breakpoint

•   Picture

                                •       Garland
Theming con Twig

  I motivi della scelta:
  "We hand themers a loaded gun and tell
  them to hammer in a nail with it. Oh,
  and be careful" (John Albin)
• Sicurezza sopra ogni altra cosa
Theming con Twig
    I vantaggi:

•   Maggiore sicurezza

•   Separazione tra le logiche applicative e la
    presentazione

•   Codice pulito, manutenibile, riusabile

•   Non è necessario conoscere PHP

•   Estendibile

•   Template engine di Symfony
Theming con Twig
              NODE.TPL.PHP                                                           NODE.TWIG
                                                                      <article id="node-{{ node.nid }}" class="{{ attributes.class
 <article id="node-<?php print $node->nid; ?>" class="<?php print     }} clearfix"{{ attributes }}>
 $attributes['class']; ?> clearfix"<?php print $attributes; ?>>
   <?php print render($title_prefix); ?>                                {{ title_prefix }}
   <?php if (!$page): ?>                                                {% if not page %}
     <h2<?php print $title_attributes; ?>><a href="<?php print            <h2{{ title_attributes }}>
 $node_url; ?>" rel="bookmark"><?php print $label; ?></a></h2>              <a href="{{ node_url }}"
   <?php endif; ?>                                                    rel="bookmark">{{ label }}</a>
   <?php print render($title_suffix); ?>                                  </h2>
                                                                        {% endif %}
   <?php if ($display_submitted): ?>                                    {{ title_suffix }}
     <footer>
        <?php print render($user_picture); ?>                           {% if display_submitted %}
        <p class="submitted"><?php print $submitted; ?></p>               <footer>
     </footer>                                                              {{ user_picture }}
   <?php endif; ?>                                                          <p class="submitted">{{ submitted }}</p>
   <div class="content"<?php print $content_attributes; ?>>               </footer>
     <?php                                                              {% endif %}
        // We hide the comments and links now so that we can render
 them later.                                                            <div class="content"{{ content_attributes }}>
        hide($content['comments']);                                       {# We hide the comments and links now so that we can
        hide($content['links']);                                      render them later. #}
        print render($content);                                           {% hide(content.comments) %}
     ?>                                                                   {% hide(content.links) %}
   </div>                                                                 {{ content }}
                                                                        </div>
   <?php print render($content['links']); ?>
   <?php print render($content['comments']); ?>                         {{ content.links }}
                                                                        {{ content.comments }}
 </article>
                                                                      </article>
Theming con Twig
    I vantaggi:

•   Maggiore sicurezza

•   Separazione tra le logiche applicative e la
    presentazione

•   Codice pulito, manutenibile, riusabile

•   Non è necessario conoscere PHP

•   Estendibile

•   Template engine di Symfony
Theming con Twig
    Componenti estendibili:

•   Loaders

•   Extension

    •   Tags (for, if, include,import, block ...)

    •   Filters (date, format, replace, capitalize ...)

    •   Functions (range, constant, cycle …)

    •   Tests ( even, odd, divisibleby, empty)
Theming con Twig

  Gli svantaggi:
• Minori performance
• Apprendere il markup
• Non poter usare il theming come base
  di formazione per i nuovi developer
HTML5
• Garantire la retro compatibilità
 • HTML5shiv
• Nuovi elementi HTML5 nelle Form API
• Re-factor dei template
• Codice generato piùsnello e
  comprensibile
• Normalize, Modernizr
HTML5

• Nuovi elementi HTML5 nelle Form API
 • Color *              • Date
 • Email *              • Number *
 • Range *              • Search
 • Tel *                • Url *
* Anche nuovi field Widget
Responsive Layout
     + Mobile
• Moduli Breakpoint e Picture
• Nuona architettura blocchi plugin-based
• Nuovo container layout nel theming
• Web services RESTful nel core
Layout
Layout
CMI: la proposta

• Problemi attuali:
 • migrazione configurazione
 • versionamento e revert delle revisioni
    di configurazione
CMI: la proposta
cos'è
• un set riutilizzabile di componenti php
• un framework request/response che
  astrae le specifiche http
• un "facilitatore" per la standardizzazione
  del codice, l'interoperabilità il riutilizzo
• e buon ultimo una nutrita comunità di
  sviluppatori
Perchè usarlo?
• Standardizzare
• Strutturare
• codice maggiormente leggibile
• codice maggiormente manutenibile
• costo di sviluppo contenuto
• Accuratezza stima
Perchè usarlo?

• In pratica, CON I DOVUTI
  ACCORGIMENTI, è più facile non
  produrre STUPID code
• Singleton Tight coupling Untestability
  Premature optimization Indescriptive
  naming Duplication
Tutto?
• Non tutto Symfony entrerà a far parte
  del core di drupal
 • Class loader
 • Service container
 • Event dispatcher
 • HTTP foundation
 • Http kernel
Class loader

• Le classi non ancora definite vengono
  caricate da un meccanismo di
  autoloading
• Convenzione PSR-0
Service container
            (Dependency Injection)

• Consente di standardizzare e
  centralizzare il modo in cui sono costruiti
  gli oggetti nell'applicazione
• architettura orientata ai servizi
• Gestione centralizzata
  opzioni/dipendenze
• testing
Event dispatcher

• Implementa il pattern Observer
• Tecnologia “simile” agli hook
• Oggetti si sottoscrivono e ricevono
  notifica di cambiamento di stato
  dall'oggetto osservato
HTTP foundation

•   definisce un livello orientato agli oggetti
    per le specifiche HTTP.
Http kernel
• Core di Symfony
• Basato su Foundation
• Request
  → Controller
     → Response
Quindi?
No PANIC

• Sistema hook
• TODO
 • Gestione degli environment
Bibliografia
•   http://nikic.github.com/2011/12/27/Dont-be-STUPID-GRASP-SOLID.html

•   http://symfony.com/it/doc/2.0/components/

•   http://groups.drupal.org/node/191283

•   http://drupal.org/community-initiatives/drupal-core

•   http://drupal.org/node/1022338

•   http://drupal.org/node/1193054

•   http://twig.sensiolabs.org/

•   http://drupal.org/node/1841584
DICE GRAZIE A SPONSOR




       MEDIA PARTNER




  IN COLLABORAZIONE CON




FIRMATO: GLI ORGANIZZATORI ;)

Weitere ähnliche Inhalte

Andere mochten auch

Andere mochten auch (9)

Drupal Day 2011 - Drupal: stand alone VS integrazione con altri software
Drupal Day 2011 - Drupal: stand alone VS integrazione con altri softwareDrupal Day 2011 - Drupal: stand alone VS integrazione con altri software
Drupal Day 2011 - Drupal: stand alone VS integrazione con altri software
 
DDAY2014 - Costruire temi con Foundation: facile, riusabile, responsive.
DDAY2014 - Costruire temi con Foundation: facile, riusabile, responsive.DDAY2014 - Costruire temi con Foundation: facile, riusabile, responsive.
DDAY2014 - Costruire temi con Foundation: facile, riusabile, responsive.
 
DDAY 2014 - Drupal & Venezia: cinque anni dopo
DDAY 2014 - Drupal & Venezia: cinque anni dopo DDAY 2014 - Drupal & Venezia: cinque anni dopo
DDAY 2014 - Drupal & Venezia: cinque anni dopo
 
Drupal Day 2011 - Drupal Commerce
Drupal Day 2011 - Drupal CommerceDrupal Day 2011 - Drupal Commerce
Drupal Day 2011 - Drupal Commerce
 
Drupal Day 2012 - Automating Drupal Development: Make!les, Features and Beyond
Drupal Day 2012 - Automating Drupal Development: Make!les, Features and BeyondDrupal Day 2012 - Automating Drupal Development: Make!les, Features and Beyond
Drupal Day 2012 - Automating Drupal Development: Make!les, Features and Beyond
 
Drupal Day 2011 - Drupal and the rise of the documents
Drupal Day 2011 - Drupal and the rise of the documentsDrupal Day 2011 - Drupal and the rise of the documents
Drupal Day 2011 - Drupal and the rise of the documents
 
Da X a Drupal 8, migra tutto e vivi sereno
Da X a Drupal 8, migra tutto e vivi serenoDa X a Drupal 8, migra tutto e vivi sereno
Da X a Drupal 8, migra tutto e vivi sereno
 
Once you go cloud you never go down
Once you go cloud you never go downOnce you go cloud you never go down
Once you go cloud you never go down
 
Your Entity, Your Code
Your Entity, Your CodeYour Entity, Your Code
Your Entity, Your Code
 

Ähnlich wie Drupal Day 2012 - DRUPAL 8: I CAMBIAMENTI CHE CI ASPETTANO

AngularJS – Reinventare le applicazioni web
AngularJS – Reinventare le applicazioni webAngularJS – Reinventare le applicazioni web
AngularJS – Reinventare le applicazioni web
Luca Milan
 

Ähnlich wie Drupal Day 2012 - DRUPAL 8: I CAMBIAMENTI CHE CI ASPETTANO (20)

Simple Cloud API: accesso semplificato al cloud computing
Simple Cloud API: accesso semplificato al cloud computingSimple Cloud API: accesso semplificato al cloud computing
Simple Cloud API: accesso semplificato al cloud computing
 
Laravel Framework PHP
Laravel Framework PHPLaravel Framework PHP
Laravel Framework PHP
 
Come portare il profiler di symfony2 in drupal8
Come portare il profiler di symfony2 in drupal8Come portare il profiler di symfony2 in drupal8
Come portare il profiler di symfony2 in drupal8
 
Come sfruttare tutte le potenzialità di Symfony in Drupal 8
Come sfruttare tutte le potenzialità di Symfony in Drupal 8Come sfruttare tutte le potenzialità di Symfony in Drupal 8
Come sfruttare tutte le potenzialità di Symfony in Drupal 8
 
Come sfruttare tutte le potenzialità di Symfony in Drupal 8
Come sfruttare tutte le potenzialità di Symfony in Drupal 8Come sfruttare tutte le potenzialità di Symfony in Drupal 8
Come sfruttare tutte le potenzialità di Symfony in Drupal 8
 
Html5 e css3 nuovi strumenti per un nuovo web
Html5 e css3 nuovi strumenti per un nuovo webHtml5 e css3 nuovi strumenti per un nuovo web
Html5 e css3 nuovi strumenti per un nuovo web
 
react-it.pdf
react-it.pdfreact-it.pdf
react-it.pdf
 
Case study: un approccio modulare in un progetto legacy
Case study: un approccio modulare in un progetto legacyCase study: un approccio modulare in un progetto legacy
Case study: un approccio modulare in un progetto legacy
 
Best practices per lo sviluppo Frontend
Best practices per lo sviluppo FrontendBest practices per lo sviluppo Frontend
Best practices per lo sviluppo Frontend
 
Matteo Bicocchi - Introducing HTML5
Matteo Bicocchi - Introducing HTML5Matteo Bicocchi - Introducing HTML5
Matteo Bicocchi - Introducing HTML5
 
Drupal 7 : theming avanzato
Drupal 7 : theming avanzatoDrupal 7 : theming avanzato
Drupal 7 : theming avanzato
 
Introduzione ad angular 7/8
Introduzione ad angular 7/8Introduzione ad angular 7/8
Introduzione ad angular 7/8
 
jQuery - 1 | WebMaster & WebDesigner
jQuery - 1 | WebMaster & WebDesignerjQuery - 1 | WebMaster & WebDesigner
jQuery - 1 | WebMaster & WebDesigner
 
AngularJS – Reinventare le applicazioni web
AngularJS – Reinventare le applicazioni webAngularJS – Reinventare le applicazioni web
AngularJS – Reinventare le applicazioni web
 
DNM19 Sessione1 Orchard Primo Impatto (ita)
DNM19 Sessione1 Orchard Primo Impatto (ita)DNM19 Sessione1 Orchard Primo Impatto (ita)
DNM19 Sessione1 Orchard Primo Impatto (ita)
 
Meetup ASP.NET Core Angular
Meetup ASP.NET Core AngularMeetup ASP.NET Core Angular
Meetup ASP.NET Core Angular
 
Alessandro Forte - ASP.Net 4.0
Alessandro Forte - ASP.Net 4.0Alessandro Forte - ASP.Net 4.0
Alessandro Forte - ASP.Net 4.0
 
DDAY2014 - Performance in Drupal 8
DDAY2014 - Performance in Drupal 8DDAY2014 - Performance in Drupal 8
DDAY2014 - Performance in Drupal 8
 
HTML e CSS
HTML e CSSHTML e CSS
HTML e CSS
 
Asp.net 4 Community Tour VS2010
Asp.net 4 Community Tour VS2010Asp.net 4 Community Tour VS2010
Asp.net 4 Community Tour VS2010
 

Mehr von DrupalDay

Mehr von DrupalDay (20)

[drupalday 2017] - Accessibilità Web: Finalità, metodologie e strumenti.
[drupalday 2017] - Accessibilità Web: Finalità, metodologie e strumenti.[drupalday 2017] - Accessibilità Web: Finalità, metodologie e strumenti.
[drupalday 2017] - Accessibilità Web: Finalità, metodologie e strumenti.
 
[drupalday2017] - Cloud e integrazione per la PA: la sfida dell'Open Source t...
[drupalday2017] - Cloud e integrazione per la PA: la sfida dell'Open Source t...[drupalday2017] - Cloud e integrazione per la PA: la sfida dell'Open Source t...
[drupalday2017] - Cloud e integrazione per la PA: la sfida dell'Open Source t...
 
[drupalday2017] - Drupal come frontend che consuma servizi: HTTP Client Manager
[drupalday2017] - Drupal come frontend che consuma servizi: HTTP Client Manager[drupalday2017] - Drupal come frontend che consuma servizi: HTTP Client Manager
[drupalday2017] - Drupal come frontend che consuma servizi: HTTP Client Manager
 
[drupalday2017] - Drupal & Patternlab: un nuovo approccio al theming
[drupalday2017] - Drupal & Patternlab: un nuovo approccio al theming[drupalday2017] - Drupal & Patternlab: un nuovo approccio al theming
[drupalday2017] - Drupal & Patternlab: un nuovo approccio al theming
 
[drupalday2017] - Decoupled frontend con Drupal 8 e OpenUI 5
[drupalday2017] - Decoupled frontend con Drupal 8 e OpenUI 5[drupalday2017] - Decoupled frontend con Drupal 8 e OpenUI 5
[drupalday2017] - Decoupled frontend con Drupal 8 e OpenUI 5
 
[drupalday2017] - Open Data con Drupal nella PA: considerazioni su licensing ...
[drupalday2017] - Open Data con Drupal nella PA: considerazioni su licensing ...[drupalday2017] - Open Data con Drupal nella PA: considerazioni su licensing ...
[drupalday2017] - Open Data con Drupal nella PA: considerazioni su licensing ...
 
[drupalday2017] - Behat per Drupal: test automatici e molto di più
[drupalday2017] - Behat per Drupal: test automatici e molto di più[drupalday2017] - Behat per Drupal: test automatici e molto di più
[drupalday2017] - Behat per Drupal: test automatici e molto di più
 
[drupalday2017] - Drupal 4 Stakeholders
[drupalday2017] - Drupal 4 Stakeholders[drupalday2017] - Drupal 4 Stakeholders
[drupalday2017] - Drupal 4 Stakeholders
 
[drupalday2017] - DRUPAL per la PA: il modello della Trasparenza di Sapienza
[drupalday2017] - DRUPAL per la PA: il modello della Trasparenza di Sapienza[drupalday2017] - DRUPAL per la PA: il modello della Trasparenza di Sapienza
[drupalday2017] - DRUPAL per la PA: il modello della Trasparenza di Sapienza
 
[drupalday2017] - Venezia & Drupal. Venezia è Drupal!
[drupalday2017] - Venezia & Drupal. Venezia è Drupal![drupalday2017] - Venezia & Drupal. Venezia è Drupal!
[drupalday2017] - Venezia & Drupal. Venezia è Drupal!
 
[drupalday2017] - Quando l’informazione è un servizio
[drupalday2017] - Quando l’informazione è un servizio[drupalday2017] - Quando l’informazione è un servizio
[drupalday2017] - Quando l’informazione è un servizio
 
[drupalday2017] - Cosa significa convertire un modulo da D7 a D8
[drupalday2017] - Cosa significa convertire un modulo da D7 a D8[drupalday2017] - Cosa significa convertire un modulo da D7 a D8
[drupalday2017] - Cosa significa convertire un modulo da D7 a D8
 
[drupalday2017 - KEYNOTE] - Saving the world one Open Source project at a time
[drupalday2017 - KEYNOTE] - Saving the world one Open Source project at a time[drupalday2017 - KEYNOTE] - Saving the world one Open Source project at a time
[drupalday2017 - KEYNOTE] - Saving the world one Open Source project at a time
 
[drupalday2017] - Async navigation with a lightweight ES6 framework
[drupalday2017] - Async navigation with a lightweight ES6 framework[drupalday2017] - Async navigation with a lightweight ES6 framework
[drupalday2017] - Async navigation with a lightweight ES6 framework
 
[drupalday2017] - Devel - D8 release party
[drupalday2017] - Devel - D8 release party[drupalday2017] - Devel - D8 release party
[drupalday2017] - Devel - D8 release party
 
[drupalday2017] - Speed-up your Drupal instance!
[drupalday2017] - Speed-up your Drupal instance![drupalday2017] - Speed-up your Drupal instance!
[drupalday2017] - Speed-up your Drupal instance!
 
[drupalday2017] - DevOps: strumenti di automazione per Drupal8
[drupalday2017] - DevOps: strumenti di automazione per Drupal8[drupalday2017] - DevOps: strumenti di automazione per Drupal8
[drupalday2017] - DevOps: strumenti di automazione per Drupal8
 
[drupalday2017] - DevOps: strumenti di automazione per Drupal8
[drupalday2017] - DevOps: strumenti di automazione per Drupal8[drupalday2017] - DevOps: strumenti di automazione per Drupal8
[drupalday2017] - DevOps: strumenti di automazione per Drupal8
 
[drupalday2017] - REST in pieces
[drupalday2017] - REST in pieces[drupalday2017] - REST in pieces
[drupalday2017] - REST in pieces
 
[drupalday2017] - Contenuti educativi digitali aperti, creare contenuti e dis...
[drupalday2017] - Contenuti educativi digitali aperti, creare contenuti e dis...[drupalday2017] - Contenuti educativi digitali aperti, creare contenuti e dis...
[drupalday2017] - Contenuti educativi digitali aperti, creare contenuti e dis...
 

Drupal Day 2012 - DRUPAL 8: I CAMBIAMENTI CHE CI ASPETTANO

  • 1. DRUPAL 8: I CAMBIAMENTI CHE CI ASPETTANO Marco Pagliarulo (@Morpheus80ta) Corrado Grimoldi (@coreykck)
  • 2. Indice • In & Out • Theming con Twig • HTML5 • Responsive Layout + Mobile • CMI: la proposta • Punti di contatto con Symfony
  • 3. Views In & Out • Blog • Profile • Date API • DrupalUnitTestBase • Dashboard • Breakpoint • Picture • Garland
  • 4. Theming con Twig I motivi della scelta: "We hand themers a loaded gun and tell them to hammer in a nail with it. Oh, and be careful" (John Albin) • Sicurezza sopra ogni altra cosa
  • 5. Theming con Twig I vantaggi: • Maggiore sicurezza • Separazione tra le logiche applicative e la presentazione • Codice pulito, manutenibile, riusabile • Non è necessario conoscere PHP • Estendibile • Template engine di Symfony
  • 6. Theming con Twig NODE.TPL.PHP NODE.TWIG <article id="node-{{ node.nid }}" class="{{ attributes.class <article id="node-<?php print $node->nid; ?>" class="<?php print }} clearfix"{{ attributes }}> $attributes['class']; ?> clearfix"<?php print $attributes; ?>> <?php print render($title_prefix); ?> {{ title_prefix }} <?php if (!$page): ?> {% if not page %} <h2<?php print $title_attributes; ?>><a href="<?php print <h2{{ title_attributes }}> $node_url; ?>" rel="bookmark"><?php print $label; ?></a></h2> <a href="{{ node_url }}" <?php endif; ?> rel="bookmark">{{ label }}</a> <?php print render($title_suffix); ?> </h2> {% endif %} <?php if ($display_submitted): ?> {{ title_suffix }} <footer> <?php print render($user_picture); ?> {% if display_submitted %} <p class="submitted"><?php print $submitted; ?></p> <footer> </footer> {{ user_picture }} <?php endif; ?> <p class="submitted">{{ submitted }}</p> <div class="content"<?php print $content_attributes; ?>> </footer> <?php {% endif %} // We hide the comments and links now so that we can render them later. <div class="content"{{ content_attributes }}> hide($content['comments']); {# We hide the comments and links now so that we can hide($content['links']); render them later. #} print render($content); {% hide(content.comments) %} ?> {% hide(content.links) %} </div> {{ content }} </div> <?php print render($content['links']); ?> <?php print render($content['comments']); ?> {{ content.links }} {{ content.comments }} </article> </article>
  • 7. Theming con Twig I vantaggi: • Maggiore sicurezza • Separazione tra le logiche applicative e la presentazione • Codice pulito, manutenibile, riusabile • Non è necessario conoscere PHP • Estendibile • Template engine di Symfony
  • 8. Theming con Twig Componenti estendibili: • Loaders • Extension • Tags (for, if, include,import, block ...) • Filters (date, format, replace, capitalize ...) • Functions (range, constant, cycle …) • Tests ( even, odd, divisibleby, empty)
  • 9. Theming con Twig Gli svantaggi: • Minori performance • Apprendere il markup • Non poter usare il theming come base di formazione per i nuovi developer
  • 10. HTML5 • Garantire la retro compatibilità • HTML5shiv • Nuovi elementi HTML5 nelle Form API • Re-factor dei template • Codice generato piùsnello e comprensibile • Normalize, Modernizr
  • 11. HTML5 • Nuovi elementi HTML5 nelle Form API • Color * • Date • Email * • Number * • Range * • Search • Tel * • Url * * Anche nuovi field Widget
  • 12. Responsive Layout + Mobile • Moduli Breakpoint e Picture • Nuona architettura blocchi plugin-based • Nuovo container layout nel theming • Web services RESTful nel core
  • 15. CMI: la proposta • Problemi attuali: • migrazione configurazione • versionamento e revert delle revisioni di configurazione
  • 17. cos'è • un set riutilizzabile di componenti php • un framework request/response che astrae le specifiche http • un "facilitatore" per la standardizzazione del codice, l'interoperabilità il riutilizzo • e buon ultimo una nutrita comunità di sviluppatori
  • 18. Perchè usarlo? • Standardizzare • Strutturare • codice maggiormente leggibile • codice maggiormente manutenibile • costo di sviluppo contenuto • Accuratezza stima
  • 19. Perchè usarlo? • In pratica, CON I DOVUTI ACCORGIMENTI, è più facile non produrre STUPID code • Singleton Tight coupling Untestability Premature optimization Indescriptive naming Duplication
  • 20. Tutto? • Non tutto Symfony entrerà a far parte del core di drupal • Class loader • Service container • Event dispatcher • HTTP foundation • Http kernel
  • 21. Class loader • Le classi non ancora definite vengono caricate da un meccanismo di autoloading • Convenzione PSR-0
  • 22. Service container (Dependency Injection) • Consente di standardizzare e centralizzare il modo in cui sono costruiti gli oggetti nell'applicazione • architettura orientata ai servizi • Gestione centralizzata opzioni/dipendenze • testing
  • 23. Event dispatcher • Implementa il pattern Observer • Tecnologia “simile” agli hook • Oggetti si sottoscrivono e ricevono notifica di cambiamento di stato dall'oggetto osservato
  • 24. HTTP foundation • definisce un livello orientato agli oggetti per le specifiche HTTP.
  • 25. Http kernel • Core di Symfony • Basato su Foundation • Request → Controller → Response
  • 27. No PANIC • Sistema hook • TODO • Gestione degli environment
  • 28. Bibliografia • http://nikic.github.com/2011/12/27/Dont-be-STUPID-GRASP-SOLID.html • http://symfony.com/it/doc/2.0/components/ • http://groups.drupal.org/node/191283 • http://drupal.org/community-initiatives/drupal-core • http://drupal.org/node/1022338 • http://drupal.org/node/1193054 • http://twig.sensiolabs.org/ • http://drupal.org/node/1841584
  • 29. DICE GRAZIE A SPONSOR MEDIA PARTNER IN COLLABORAZIONE CON FIRMATO: GLI ORGANIZZATORI ;)