Direzioni fondamentali per entrare rapidamente nella comprensione di Plone e del suo mondo, e costruire il vostro sistema di gestione contenuti in capo a pochi giorni.
1 of 43
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
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
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.
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"..