際際滷

際際滷Share a Scribd company logo
Non solo Django:
MVC orientato agli oggetti
con Plone e Zope Toolkit

Maurizio Delmonte - Abstract
MVC?.. ah, MVC!


Model - View - Controller [1], stiamo parlando di questo:
 architettare l'applicazione separando la gestione del
  dato (model), dalla sua presentazione (view) e
  dall'interazione da parte dell'utente (controller)
 Django e molti altri framework ci hanno basato il loro
  successo (le applicazioni risultano naturalmente pi湛
  robuste, e facili da mantenere e far evolvere)

[1]: cfr. http://en.wikipedia.org/wiki/Model%E2%80%93view%E2%80%93controller
quale problema vogliamo risolvere?

         Titolo Home


Descrizione Home



     Progetto:
     - titolo
     - immagine
     - descrizione



Lista Post:
- data
- titolo
- descrizione
- immagine
MVC, l'interpretazione Zope (2)


 Model -> isolare la gestione del dato con ZODB
 View -> costruire l'interfaccia utente con Template ZPT
  e Browser View
 Controller -> applicare le viste ai modelli tramite il
  Traversing


NB: Zope (2) != Zope [cfr. http://zope2.zope.org/ e http:
//www.zope.org/the-world-of-zope]
Mvc -> ZODB


 DB a oggetti (NO-SQL ante litteram dal 1998): DB per
  oggetti Python
 efficiente e robusto (transazionale ACIDo q.b.)
 gestione trasparente dei meccanismi CRUD
 Storage pluggabile
 utile fuori da Zope


approfondite qui: http://zodb.org/
mVc-> ZPT e Browser view

 ZPT (Zope Page Templates) - linguaggio per i template
  realizzato per Zope (dal 2000)
 orientato alla produzione di XML e XHTML
 "poco" potente, per non favorire chi pretende di infilare
  le logiche di controllo nei template


approfondite qui: http://wiki.zope.org/ZPT/FrontPage


 Browser View (ZPT + classe python: componente
  secondo Zope Toolkit) -> ne parliamo pi湛 avanti..
mvC -> Z-Publisher e Traversing

Lo Z-Publisher dal 1998 si occupa di:
   Gestione di REQUEST e RESPONSE
   Gestione degli argomenti della REQUEST
   Traversing: ogni URL al suo oggetto
   imposta autenticazione utente
   effettua la call dell'oggetto/metodo risultato del
    traversing, con gli argomenti della REQUEST


approfondite qui: http://wiki.zope.org/zope2/ZPublisher
ricapitolando..

URL: http://localhost:8080/parent/child/method?arg=test
tipicamente:
a. method 竪 un metodo pubblico dell'oggetto child
memorizzato in ZODB come figlio dell'oggetto parent
b. method 竪 un oggetto memorizzato in ZODB (es. un
template ZPT)


Lo Z-Publisher risolve method, e lo invoca passandogli il
parametro arg=test.
        ZOPE -> Z-Object Publishing Environment
i componenti di Zope Toolkit
Zope Toolkit (2005) 竪 una libreria inclusa in
Zope 2 da qualche anno, prima nota come Zope
3.
Il cuore di ZTK 竪 la ZCA, che abilita il mondo dei
componenti nelle applicazioni Zope.

approfondite qui:
http://docs.zope.org/zopetoolkit/
http://wiki.zope.org/zope3/ComponentArchitectureOverview
Browser view

 componenti "Adapter" dello ZTK
 implementazione: zpt + py + zcml

Z-Publisher assume una nuova dimensione:
URL: http://localhost:8080/parent/child/method?arg=test
con ZTK:
.. c. method 竪 una Browser View
NB: non vive nello ZODB.
come si arriva a Plone
I concetti introdotti sono alla base delle
applicazioni Zope 2.
Plone 竪 un'applicazione Zope 2 centrata sui
contenuti:
 gli oggetti di Plone rappresentano contenuti
 gli oggetti di Plone implementano servizi
   per gestire contenuti
   per costruire l'interfaccia utente
Content Framework
Gestire contenuti in agilit: content type.
 factory e memorizzazione
 schema di attributi
 metadati
 configurazione
 registrazioni ai servizi (indicizzazione,
   workflow, trasformazione, etc.)
tutto questo avviene in modo omogeneo,
coerente e robusto.
risolvere con i content types..
     Cartelle, Pagine,
     Progetti, Post


Portlet Page: titolo,
descrizione e due portlet
collection.


          Progetto:
          - titolo
          - immagine
          - descrizione



   Post:
   - data
   - titolo
   - descrizione
   - immagine
Archetypes e Dexterity



Plone ha due Content Framework:
 Archetypes (dal 2003) - monolitico, 竪 il
   cuore di Plone da 10 anni
 Dexterity (dal 2010) - a componenti, sar
   incluso in Plone 4.3 base
MVC con Content Framework



 Model - automatico da Content Framework
 View - di base automatico da Content
  Framework
 Controller - di base automatico da Content
  Framework
MVC automatizzato in Plone
Lo sviluppatore definisce un content type
dichiarando:
 Factory Type Information (DNA del content
   type)
 schema di attributi
In automatico il content framework gestisce:
 interfaccia utente base di view/edit
 factory e logiche di aggiornamento
 interazione con i servizi in base a
   configurazioni (indicizzazione, workflow, etc.)
ricapitolando..
URL: http://localhost:8080/page
     http://localhost:8080/page/edit
 page 竪 un oggetto contenuto memorizzato in ZODB
 page ha una vista di default invocata automaticamente
   e restituita all'utente
 edit 竪 un "metodo applicato al contesto" dell'oggetto
   page (View e Controller insieme)
NB: queste viste sono costruite automaticamente dal
content framework.
demo.. statica
vediamo in rapida successione:
 una pagina plone da utente anonimo
 la stessa pagina dopo il login
 la stessa pagina in vista edit
da notare:
 le varie funzioni attivabili da UI
 la vista contents sulla cartella
accesso "anonimo" alle pagine
            http://127.0.0.1:8080/Plone
accesso editor alle pagine
             http://127.0.0.1:8080/Plone
modifica della pagina

                  http://127.0.0.1:8080/Plone/front-page/edit
..modifica alla pagina II
e per le cartelle.. folder contents
           http://127.0.0.1:8080/Plone/folder_contents
Ricapitolando..
Portale => gerarchia di oggetti (content
types), organizzati in cartelle.
URL => posizione fisica dell'oggetto + vista
applicata
M => oggetto memorizzato in ZODB
VC => template ZPT / browser view associati ai
content type
                    il content framework gestisce
                        MVC automaticamente.
Content Type via web con Dexterity




  NB: installare plone.app.dexterity [*], incluso in Plone 4.3.
  [*]: http://pypi.python.org/pypi/plone.app.dexterity
gestione dello schema attributi




  molte delle caratteristiche dello schema attributi possono essere
  gestite tramite browser.
aggiunta di un campo
Dexterity in azione




                 .. ma non vogliamo il Dublin Core!
i behavior di Dexterity
Dexterity in azione 2

                                              cosa sono i behavior?
                                              Adapter (logiche python registrate
                                              nella ZCA) attivati sui content type
                                              da specifiche interfacce marker.

                                              cosa fare con i behavior?
                                                attivare schemi di attributi
                                                attivare logiche speciali
                                                accedere a funzioni aggiunte da
                                                  estensioni
                                                ...

S狸mo dice:                                    NB: i behaviour sono "indipendenti"
 Behaviors?                                   e "ortogonali" ai content type.
"Generic Programming"!
[cfr. http://en.wikipedia.org/wiki/Generic_programming]
gestire le Factory Type Informations
                      Alcune configurazioni di registro
                      resistono nella ZMI

                      In portal_types 竪 possibile gestire
                      i portal type del portale:
                         controllando alcune
                           configurazioni
                         controllando le viste
                           associate
                         creando nuovi content types
                           senza passare dal codice
Dexterity in un pacchetto Python




                                                  Dal registro dei Content
                                                  Type Dexterity si pu嘆:
                                                    esportare le FTI
                                                    esportare gli schemi
                                                       di attributi


approfondite qui: http://plone.
org/products/dexterity/documentation/manual/developer-manual
export dello schema Dexterity
<model xmlns="http://namespaces.plone.org/supermodel/schema">
 <schema>
  <field name="nome"
         type="zope.schema.TextLine">                     NB: lo stesso schema pu嘆
   <title>Nome</title>                                    essere espresso in maniera
  </field>                                                pythonica con una speciale
  <field name="numero_sale"                               interfaccia di ZTK.
         type="zope.schema.Int">
   <title>Numero Sale</title>                             from plone.directives import form
  </field>                                                from zope import schema
  <field name="orario_spettacoli"
                                                          class ICinema(form.Schema):
         type="zope.schema.Text">                            "Un Cinema."
   <title>Orario Spettacoli</title>                          nome = schema.TextLine(
  </field>                                                            title=u'Nome')
                                                             numero_sale = schema.Int(
 </schema>
                                                                      title=u'Numero Sale')
</model>                                                     orario_spettacoli = schema.Text(
                                                                      title=u'Orario Spettacoli')
export del FTI Dexterity
<?xml version="1.0"?>
<object name="cinema" meta_type="Dexterity FTI" i18n:domain="plone"
   xmlns:i18n="http://xml.zope.org/namespaces/i18n">
 <property name="title" i18n:translate="">Cinema</property>
 <property name="factory">cinema</property>
 <property name="add_view_expr">string:${folder_url}/++add++cinema</property>
 <property name="default_view">view</property>
 <property name="klass">plone.dexterity.content.Container</property>
 <property name="behaviors">
  <element value="plone.app.content.interfaces.INameFromTitle"/>
 </property>
 <property name="schema"> ... </property>
...
</object>

                                            NB: la FTI XML viene presa in carico dal
                                            registro dei content types tramite
                                            importazione standard da portal_setup
dove sta il Python?
                Niente Panico!
L'XML che avete visto 竪 costruito "dalla
macchina per la macchina".
Chi sviluppa Dexterity pensa che le
configurazioni stanno bene vestite di XML.
Chi sviluppa *con* Dexterity non ha bisogno
di manipolare XML, se non ha piacere a farlo.
Documentazione Dexterity!
Dexterity 竪 molto ben documentato!!
    FAQ [1]
    Dexterity Developer Manual [2]

    Creare behavior riusabili per content type Dexterity            [3]

[1]: http://plone.org/products/dexterity/documentation/faq

[2]: http://plone.org/products/dexterity/documentation/manual/developer-manual

[3]: http://plone.org/products/dexterity/documentation/manual/behaviors
realizzare una nuova vista
from five import grok
from Acquisition import aq_inner
from Products.CMFCore.utils import getToolByName                nome vista: @@view
                                                                (nome classe lowercase)
class View(grok.View):                         vista applicata a oggetti
   grok.context(ICinema)                       con interfaccia ICinema
   grok.require('zope2.View')
                                                                ammessi solo utenti con
  def lista_cinema(self):                                       permesso zope2.View
    "lista di tutti i cinema disponibili"
    context = aq_inner(self.context)
                                                                           lista dei cinema presenti nel
    catalog = getToolByName(context,'portal_catalog')                      portale: ogni metodo 竪
    return catalog(object_provides=ICinema.__identifier__,                 accessibile dal template
                       path='/'.join(context.getPhysicalPath()),           tramite la variabile view.
                       sort_on='sortable_title')



   approfondite qui: http://plone.
   org/products/dexterity/documentation/manual/developer-manual
realizzare una nuova vista 2
<html metal:use-macro="context/main_template/macros/master">                template renderizzato
<body>                                                                      nella UI Plone
<metal:main fill-slot="main">
  <h1 tal:content="context/nome" />                         attributi accessibili
  <p>Numero Sale:                                           direttamente sul contesto
     <em tal:content="context/numero_sale">#</em></p>
  <p>Orario Spettacoli:
     <em tal:content="context/orario_spettacoli">#</em></p>
  <h2>I nostri Cinema:</h2>                                       accesso al metodo
     <ul>                                                         lista_cinema direttamente
     <tal:block repeat="cinema view/lista_cinema">                dalla variabile view.
        <li><a tal:attributes="href cinema/getURL"
               tal:content="cinema/nome" /></li>
     </tal:block>                                    template view.pt collocato nella cartella
     </ul>                                           cinema_templates: agganciato alla
</metal:main>                                        classe per convenzione.
</body>
</html>
                   Non vi piacciono le convenzioni? usate ZCML!
                   http://collective-docs.plone.org/en/latest/views/browserviews.html
l'intorno della nostra vista



                                             il main_template definisce
                                             l'intelaiatura dell'interfaccia.

                                             Parte della riusabilit 竪
                                             ottenuta con le macro di ZPT.

                                             ZTK ha permesso di
                                             componentizzare la UI tramite
                                             Viewlet.


      approfondite qui:
      http://collective-docs.plone.org/en/latest/views/viewlets.html
UI estensibile con le viewlets

                         Registrare una viewlet ad
                         un Viewlet Manager per
                         aggiungere "pezzi" di
                         interfaccia senza "pestare i
                         piedi" a nessuno.

                         La posizione e la visibilit
                         delle viewlet 竪 controllata
                         da interfaccia web
                         (@@manage-viewlets).

                         Le viewlet possono essere
                         attivate tra l'altro da
                         behavior Dexterity.
registriamo una viewlet
from five import grok
                                                                         nome del viewlet:
from plone.app.layout.viewlets.interfaces import IAboveContent           deve essere "unico"

class MessageViewlet(grok.Viewlet):
   "mostriamo un messaggio"
   grok.name('example.messaging.MessageViewlet")                  viewlet attiva solo per
   grok.context(ICinema)                                          oggetti marcati ICinema
   grok.viewletmanager(IAboveContent)
                                                            viewlet registrata per il Viewlet
  def update(self):                                         Manager IAboveContent
    self.message = IMessage(self.context)                L'adapter calcola il messaggio
                                                         in base a logiche definite
                                                         "altrove"


  <div class="messageViewlet">
                                                        template messageviewlet.pt collocato
   <span tal:content="viewlet/message/subject" />       nella cartella viewlet_templates:
  </div>                                                agganciato alla classe per convenzione.
ricapitolando..
 non preoccupatevi dello storage
  (boilerplate.. migrazioni.. cambi di schema..)
 applicazioni RESTful molto pi湛 facili
 lasciate lavorare il content framework
 sfruttate i servizi content-oriented
 Zope 2, ma soprattutto ZTK
 molto molto altro "sotto al cofano"..
Grazie!
Domande?


Maurizio Delmonte - Abstract

More Related Content

Non solo Django: MVC orientato agli oggetti con Plone e Zope Toolkit

  • 1. Non solo Django: MVC orientato agli oggetti con Plone e Zope Toolkit Maurizio Delmonte - Abstract
  • 2. MVC?.. ah, MVC! Model - View - Controller [1], stiamo parlando di questo: architettare l'applicazione separando la gestione del dato (model), dalla sua presentazione (view) e dall'interazione da parte dell'utente (controller) Django e molti altri framework ci hanno basato il loro successo (le applicazioni risultano naturalmente pi湛 robuste, e facili da mantenere e far evolvere) [1]: cfr. http://en.wikipedia.org/wiki/Model%E2%80%93view%E2%80%93controller
  • 3. quale problema vogliamo risolvere? Titolo Home Descrizione Home Progetto: - titolo - immagine - descrizione Lista Post: - data - titolo - descrizione - immagine
  • 4. MVC, l'interpretazione Zope (2) Model -> isolare la gestione del dato con ZODB View -> costruire l'interfaccia utente con Template ZPT e Browser View Controller -> applicare le viste ai modelli tramite il Traversing NB: Zope (2) != Zope [cfr. http://zope2.zope.org/ e http: //www.zope.org/the-world-of-zope]
  • 5. Mvc -> ZODB DB a oggetti (NO-SQL ante litteram dal 1998): DB per oggetti Python efficiente e robusto (transazionale ACIDo q.b.) gestione trasparente dei meccanismi CRUD Storage pluggabile utile fuori da Zope approfondite qui: http://zodb.org/
  • 6. mVc-> ZPT e Browser view ZPT (Zope Page Templates) - linguaggio per i template realizzato per Zope (dal 2000) orientato alla produzione di XML e XHTML "poco" potente, per non favorire chi pretende di infilare le logiche di controllo nei template approfondite qui: http://wiki.zope.org/ZPT/FrontPage Browser View (ZPT + classe python: componente secondo Zope Toolkit) -> ne parliamo pi湛 avanti..
  • 7. mvC -> Z-Publisher e Traversing Lo Z-Publisher dal 1998 si occupa di: Gestione di REQUEST e RESPONSE Gestione degli argomenti della REQUEST Traversing: ogni URL al suo oggetto imposta autenticazione utente effettua la call dell'oggetto/metodo risultato del traversing, con gli argomenti della REQUEST approfondite qui: http://wiki.zope.org/zope2/ZPublisher
  • 8. ricapitolando.. URL: http://localhost:8080/parent/child/method?arg=test tipicamente: a. method 竪 un metodo pubblico dell'oggetto child memorizzato in ZODB come figlio dell'oggetto parent b. method 竪 un oggetto memorizzato in ZODB (es. un template ZPT) Lo Z-Publisher risolve method, e lo invoca passandogli il parametro arg=test. ZOPE -> Z-Object Publishing Environment
  • 9. i componenti di Zope Toolkit Zope Toolkit (2005) 竪 una libreria inclusa in Zope 2 da qualche anno, prima nota come Zope 3. Il cuore di ZTK 竪 la ZCA, che abilita il mondo dei componenti nelle applicazioni Zope. approfondite qui: http://docs.zope.org/zopetoolkit/ http://wiki.zope.org/zope3/ComponentArchitectureOverview
  • 10. Browser view componenti "Adapter" dello ZTK implementazione: zpt + py + zcml Z-Publisher assume una nuova dimensione: URL: http://localhost:8080/parent/child/method?arg=test con ZTK: .. c. method 竪 una Browser View NB: non vive nello ZODB.
  • 11. come si arriva a Plone I concetti introdotti sono alla base delle applicazioni Zope 2. Plone 竪 un'applicazione Zope 2 centrata sui contenuti: gli oggetti di Plone rappresentano contenuti gli oggetti di Plone implementano servizi per gestire contenuti per costruire l'interfaccia utente
  • 12. Content Framework Gestire contenuti in agilit: content type. factory e memorizzazione schema di attributi metadati configurazione registrazioni ai servizi (indicizzazione, workflow, trasformazione, etc.) tutto questo avviene in modo omogeneo, coerente e robusto.
  • 13. risolvere con i content types.. Cartelle, Pagine, Progetti, Post Portlet Page: titolo, descrizione e due portlet collection. Progetto: - titolo - immagine - descrizione Post: - data - titolo - descrizione - immagine
  • 14. Archetypes e Dexterity Plone ha due Content Framework: Archetypes (dal 2003) - monolitico, 竪 il cuore di Plone da 10 anni Dexterity (dal 2010) - a componenti, sar incluso in Plone 4.3 base
  • 15. MVC con Content Framework Model - automatico da Content Framework View - di base automatico da Content Framework Controller - di base automatico da Content Framework
  • 16. MVC automatizzato in Plone Lo sviluppatore definisce un content type dichiarando: Factory Type Information (DNA del content type) schema di attributi In automatico il content framework gestisce: interfaccia utente base di view/edit factory e logiche di aggiornamento interazione con i servizi in base a configurazioni (indicizzazione, workflow, etc.)
  • 17. ricapitolando.. URL: http://localhost:8080/page http://localhost:8080/page/edit page 竪 un oggetto contenuto memorizzato in ZODB page ha una vista di default invocata automaticamente e restituita all'utente edit 竪 un "metodo applicato al contesto" dell'oggetto page (View e Controller insieme) NB: queste viste sono costruite automaticamente dal content framework.
  • 18. demo.. statica vediamo in rapida successione: una pagina plone da utente anonimo la stessa pagina dopo il login la stessa pagina in vista edit da notare: le varie funzioni attivabili da UI la vista contents sulla cartella
  • 19. accesso "anonimo" alle pagine http://127.0.0.1:8080/Plone
  • 20. accesso editor alle pagine http://127.0.0.1:8080/Plone
  • 21. modifica della pagina http://127.0.0.1:8080/Plone/front-page/edit
  • 23. e per le cartelle.. folder contents http://127.0.0.1:8080/Plone/folder_contents
  • 24. Ricapitolando.. Portale => gerarchia di oggetti (content types), organizzati in cartelle. URL => posizione fisica dell'oggetto + vista applicata M => oggetto memorizzato in ZODB VC => template ZPT / browser view associati ai content type il content framework gestisce MVC automaticamente.
  • 25. Content Type via web con Dexterity NB: installare plone.app.dexterity [*], incluso in Plone 4.3. [*]: http://pypi.python.org/pypi/plone.app.dexterity
  • 26. gestione dello schema attributi molte delle caratteristiche dello schema attributi possono essere gestite tramite browser.
  • 27. aggiunta di un campo
  • 28. Dexterity in azione .. ma non vogliamo il Dublin Core!
  • 29. i behavior di Dexterity
  • 30. Dexterity in azione 2 cosa sono i behavior? Adapter (logiche python registrate nella ZCA) attivati sui content type da specifiche interfacce marker. cosa fare con i behavior? attivare schemi di attributi attivare logiche speciali accedere a funzioni aggiunte da estensioni ... S狸mo dice: NB: i behaviour sono "indipendenti" Behaviors? e "ortogonali" ai content type. "Generic Programming"! [cfr. http://en.wikipedia.org/wiki/Generic_programming]
  • 31. gestire le Factory Type Informations Alcune configurazioni di registro resistono nella ZMI In portal_types 竪 possibile gestire i portal type del portale: controllando alcune configurazioni controllando le viste associate creando nuovi content types senza passare dal codice
  • 32. Dexterity in un pacchetto Python Dal registro dei Content Type Dexterity si pu嘆: esportare le FTI esportare gli schemi di attributi approfondite qui: http://plone. org/products/dexterity/documentation/manual/developer-manual
  • 33. export dello schema Dexterity <model xmlns="http://namespaces.plone.org/supermodel/schema"> <schema> <field name="nome" type="zope.schema.TextLine"> NB: lo stesso schema pu嘆 <title>Nome</title> essere espresso in maniera </field> pythonica con una speciale <field name="numero_sale" interfaccia di ZTK. type="zope.schema.Int"> <title>Numero Sale</title> from plone.directives import form </field> from zope import schema <field name="orario_spettacoli" class ICinema(form.Schema): type="zope.schema.Text"> "Un Cinema." <title>Orario Spettacoli</title> nome = schema.TextLine( </field> title=u'Nome') numero_sale = schema.Int( </schema> title=u'Numero Sale') </model> orario_spettacoli = schema.Text( title=u'Orario Spettacoli')
  • 34. export del FTI Dexterity <?xml version="1.0"?> <object name="cinema" meta_type="Dexterity FTI" i18n:domain="plone" xmlns:i18n="http://xml.zope.org/namespaces/i18n"> <property name="title" i18n:translate="">Cinema</property> <property name="factory">cinema</property> <property name="add_view_expr">string:${folder_url}/++add++cinema</property> <property name="default_view">view</property> <property name="klass">plone.dexterity.content.Container</property> <property name="behaviors"> <element value="plone.app.content.interfaces.INameFromTitle"/> </property> <property name="schema"> ... </property> ... </object> NB: la FTI XML viene presa in carico dal registro dei content types tramite importazione standard da portal_setup
  • 35. dove sta il Python? Niente Panico! L'XML che avete visto 竪 costruito "dalla macchina per la macchina". Chi sviluppa Dexterity pensa che le configurazioni stanno bene vestite di XML. Chi sviluppa *con* Dexterity non ha bisogno di manipolare XML, se non ha piacere a farlo.
  • 36. Documentazione Dexterity! Dexterity 竪 molto ben documentato!! FAQ [1] Dexterity Developer Manual [2] Creare behavior riusabili per content type Dexterity [3] [1]: http://plone.org/products/dexterity/documentation/faq [2]: http://plone.org/products/dexterity/documentation/manual/developer-manual [3]: http://plone.org/products/dexterity/documentation/manual/behaviors
  • 37. realizzare una nuova vista from five import grok from Acquisition import aq_inner from Products.CMFCore.utils import getToolByName nome vista: @@view (nome classe lowercase) class View(grok.View): vista applicata a oggetti grok.context(ICinema) con interfaccia ICinema grok.require('zope2.View') ammessi solo utenti con def lista_cinema(self): permesso zope2.View "lista di tutti i cinema disponibili" context = aq_inner(self.context) lista dei cinema presenti nel catalog = getToolByName(context,'portal_catalog') portale: ogni metodo 竪 return catalog(object_provides=ICinema.__identifier__, accessibile dal template path='/'.join(context.getPhysicalPath()), tramite la variabile view. sort_on='sortable_title') approfondite qui: http://plone. org/products/dexterity/documentation/manual/developer-manual
  • 38. realizzare una nuova vista 2 <html metal:use-macro="context/main_template/macros/master"> template renderizzato <body> nella UI Plone <metal:main fill-slot="main"> <h1 tal:content="context/nome" /> attributi accessibili <p>Numero Sale: direttamente sul contesto <em tal:content="context/numero_sale">#</em></p> <p>Orario Spettacoli: <em tal:content="context/orario_spettacoli">#</em></p> <h2>I nostri Cinema:</h2> accesso al metodo <ul> lista_cinema direttamente <tal:block repeat="cinema view/lista_cinema"> dalla variabile view. <li><a tal:attributes="href cinema/getURL" tal:content="cinema/nome" /></li> </tal:block> template view.pt collocato nella cartella </ul> cinema_templates: agganciato alla </metal:main> classe per convenzione. </body> </html> Non vi piacciono le convenzioni? usate ZCML! http://collective-docs.plone.org/en/latest/views/browserviews.html
  • 39. l'intorno della nostra vista il main_template definisce l'intelaiatura dell'interfaccia. Parte della riusabilit 竪 ottenuta con le macro di ZPT. ZTK ha permesso di componentizzare la UI tramite Viewlet. approfondite qui: http://collective-docs.plone.org/en/latest/views/viewlets.html
  • 40. UI estensibile con le viewlets Registrare una viewlet ad un Viewlet Manager per aggiungere "pezzi" di interfaccia senza "pestare i piedi" a nessuno. La posizione e la visibilit delle viewlet 竪 controllata da interfaccia web (@@manage-viewlets). Le viewlet possono essere attivate tra l'altro da behavior Dexterity.
  • 41. registriamo una viewlet from five import grok nome del viewlet: from plone.app.layout.viewlets.interfaces import IAboveContent deve essere "unico" class MessageViewlet(grok.Viewlet): "mostriamo un messaggio" grok.name('example.messaging.MessageViewlet") viewlet attiva solo per grok.context(ICinema) oggetti marcati ICinema grok.viewletmanager(IAboveContent) viewlet registrata per il Viewlet def update(self): Manager IAboveContent self.message = IMessage(self.context) L'adapter calcola il messaggio in base a logiche definite "altrove" <div class="messageViewlet"> template messageviewlet.pt collocato <span tal:content="viewlet/message/subject" /> nella cartella viewlet_templates: </div> agganciato alla classe per convenzione.
  • 42. ricapitolando.. non preoccupatevi dello storage (boilerplate.. migrazioni.. cambi di schema..) applicazioni RESTful molto pi湛 facili lasciate lavorare il content framework sfruttate i servizi content-oriented Zope 2, ma soprattutto ZTK molto molto altro "sotto al cofano"..