Bookmark and Share
Document Actions

Tipi di Contenuto Personalizzati

Up one level
Si continuerà a costruire il contenuto tipo personalizzato iniziato nella precedente sezione.

In questa sezione continueremo a costruire il contenuto tipo personalizzato che abbiamo iniziato nell’ultima sezione, a questo punto, abbiamo bisogno di creare un contenuto tipo Notizie Regionali piuttosto che i nuovi contenuti tipo Plone, fornendo l’attributo località. Dobbiamo costruire un’interfaccia utente per il nostro nuovo contenuto tipo tenendo in considerazione l’informazione località, e dobbiamo fornire un modulo specializzato di ricerca. Infine sistemeremo e manterremo nel nostro pacchetto alcune utili informazioni di configurazione per il nostro contenuto tipo, come il piano workflow Notizie Regionali.

 

Prima di tutto abbiamo bisogno di agire come un normale nuovo articolo di contenuti Plone, con tutti gli attributi di cui noi necessitiamo, come un corpo e un’immagine. Faremo questo proprio ora.

Grazie al prodotto ATContentTypes, che implementa tutti i tipi di contenuti del default Plone come le classi Archetypes, realizzando che è facile quanto cambiare la nostra classe base RegionalNews per utilizzare news Plone. Qui ci sono delle interessanti righe in regionalnews.py dopo le nostre modifiche:

...

From Products.ATContentTypes.content import newsitem

 

...

RegionalNews Schema =newsitem.ATNewsItemSchema.copy() + atapi.Schema((

 

# -*- Your Archetypes field definitions here...-*-

 

))

...

Class RegionalNews (newsitem.ATNewsItem):

"""Description of the Example Type"""

...

Per controllare le nostre modifiche, riavviamo il nostro servizio Zope che stava funzionando nella finestra del terminale dall’ultima sezione: prima interrompete il servizio di Zope attaccato al terminale premendo Ctrl+C, e poi avviatelo normalmente:

 

$ ./bin/instance start

 

Ora inserite di nuovo l’indirizzo http://localhost:8080/Plone e provate ad aggiungere un nuovo elemento Notizie Regionali nel portal root. Ora dovreste trovare gli stessi attributi che avete trovato in un elemento standard di notizie Plone. Dovreste anche notare un altro dettaglio divertente: quando salvate il vostro elemento Notizie Regionali, il modello in uso non è lo stesso del contenuto standard Notizie, come potete vedere in figura 9-2. Spiegheremo perché nei prossimi paragrafi.

 

 

 

 

Figura 9-2. Il modello del nostro elemento Notizie Regionali è diverso da un normale elemento notizie.

 

Dopo avremo bisogno di aggiungere il nostro primo modello Archetypes alle Notizie Regionali, per memorizzare le informazioni sulle località. Ma che cos’è un piano Archetypes?

 

 

Come probabilmente vi aspettate, uno schema è una lista di campi utilizzati da Archetypes per attivate il nostro contenuto tipo. Ogni campo è responsabile dell’immagazzinaggio e del recupero delle informazioni associate con un oggetto Archetypes.

C’è un gruppo completo di campi disponibili; essi includono lo StringField e il TextField ampiamente usati, adatti per l’immagazzinaggio del contenuto del titolo e del corpo, anche quelli più specifici del Plone, come referencefield, attraverso il quale possiamo determinare delle relazioni tra i contenuti del Plone.

Ogni campo lascia che lo sviluppatore imposti una serie di proprietà per modificare il suo comportamento. Per esempio possiamo specificare se un campo specifico è richiesto o no, e possiamo specificare la read_permission l’utente ha bisogno di accedere alle informazioni del campo. Un riferimento completo sul campo Archetypes standard e sulle loro proprietà comuni è disponibile a hhtp://Plone.org/documentation/manual/archetypes-developer-manual/fields/fields-reference

Ovviamente, se il gruppo di campi standard non soddisfa i vostri bisogni, potete implementare e registrarne dei vostri, come è già stato fatto da alcuni prodotti Plone noti. (Uno per esempio è DataGridField, che offre input per la tabella per Plone - vedi http://Plone.org/products/datagridfield). Non creeremo un campo personalizzato qui – un StringField sarà sufficiente per iniziare con (forniremo informazioni avanzate dopo in questo capitolo). Utilizzando Archetypes, ci permette di aggiungere nuovi capi allo schema Notizie Regionali. Ricordando che Paster è nostro amico, tornare al terminal e eseguite il seguente:

 

$ cd ~Plonebook/src/Plonebook.regional_news

$ paster addcontent atschema

 

Lo script Paster vi chiederà di fornire alcuni parametri: inserire regionalnews come il nome (file) del modulo della tua classe di contenuto, inserire region come il nome di questo capo, e lasciare String come entrambi i default per il campo e per le entrate widget.

 

 

NOTA Usiamo “region” come nome del campo perché “location” è già in uso dalla classe base come uno del campo standard metadati del Dublin Core, e noi non vogliamo non considerarlo.

Entreremo nei dettagli su Widget tra breve; per ora continuiamo e facciamo ripartire il servizio Zope:

$ cd ~/Plonebook

$ ./bin/instance restart

 

 

Infine, puntate di nuovo il vostro web browser su http://localhost:8080/Plone e provate ad aggiungere un nuovo elemento Notizie Regionali. Archetypes automaticamente fornisce una visualizzazione standard e modifica modelli per i suoi campi di schema, questo è il motivo per il quale otteniamo la stessa forma come per modificare un nuovo elemento Plone, insieme ad un semplice testo input per inserire la regione che vogliamo classificare nelle notizie.

Diamo un’occhiata alla parte più notevole che Paster ha aggiunto nel nostro modulo regionalnews.py:

 

...

RegionalNewsSchema = newsitem.ATNewsItemSchema.copy() + atapi.Schema((

 

# -*- Your Archetypes field definitions here... -*-

 

 

 

atapi.StringField(

name='region',

storage=atapi.AnnotationStorage(),

required=False,

#searchable=1,

#default='',

#schemata='default',

widget=atapi.StringWidget(

label=_(u"region"),

description=_(u"Description of region"),

),

),

))

 

Notate che il codice contiene una serie di attributi dello stesso campo, alcuni dei quali sono commentati. Esso contiene anche un attributo widget adatto a StringWidget, in cui Paster ha specificato proprietà label e description. Questo è come Archetypes decide come fornire un campo: ogni campo è legato ad un widget, che sa come fornire le informazioni memorizzate dal campo stesso nella modalità vista, modifica e ricerca.

Secondo quanto ammette ogni campo, possiamo scegliere tra molti widget autorizzati. Per esempio, nel nostro caso, un riquadro di selezione con una lista di regioni predefinite da cui scegliere potrebbe essere la scelta migliore.

Torniamo indietro al nostro terminale e chiediamo a Paster di creare un widget Selezione invece uno String per il nostro campo region:

 

$ cd ~/Plonebook/src/Plonebook.regional_news

$ paster addcontent atschema

 

Aprite il modulo regionalnews.py in un editor di testi, cancellate la vecchia parte di campo, e aggiungete a quello nuovo un attributo vocabulary come questo:

 

atapi.StringField(

name='region',

storage=atapi.AnnotationStorage(),

required=False,

#searchable=1,

#default='',

#schemata='default',

vocabulary = ('Italy', 'France', 'England'),

widget=atapi.SelectionWidget(

label=_(u"region"),

description=_(u"Description of region"),

),

),

 

Come al solito, riavviate il servizio, inserite l’indirizzo http://localhost:8080/Plone, e aggiungete un nuovo elemento Notizie regionali. Dovreste vedere una lista di pulsanti radio che permettono all’utente di scegliere la regione per le notizie, come potete vedere nella figura 9-3. Se siete webmaster, sicuramente, preferite probabilmente gestire il vocabolario delle regioni senza dover toccare nessun codice Python (o meglio ancora, gestirlo direttamente attraverso il Web).

Sarà affrontato in seguito nel capitolo della sezione “Strumenti e Utilità”.

 

 

 

 

Figura 9-3. L’utente può scegliere ora la regione per l’elemento Notizie Regionali.

 

Naturalmente, Archetypes è un grande automator per creare nuovi tipi di contenuto in Plone. Assiste molto bene lo sviluppatore in ogni cosa dall’immagazzinaggio dei campi ai problemi nel fornire widget.

Per l’interfaccia utente automatica, esso usa il nostro ordine di schema per elencare i campi, e per la modifica del modulo, offre una misura di raggruppamento attraverso l’attributo del campo schemata. Quando abbiamo bisogno di maggior controllo su come l’informazione è presentata all’utente, possiamo modificare l’interfaccia utente del default Archetypes come noi vogliamo. Cerca di scoprire come.

Archetypes ha un insieme standard di modelli di pagina utilizzati per produrre visualizzazioni standard e modificare interfacce utenti per i nostri contenuti. Ogni tipo di contenuto sembra lo stesso, ma cambiandolo è cosi facile come definire un modello di pagina nominato secondo il nostro tipo di contenuto, che contiene macro nomi standard per annullare quello del default.

 

 

NOTA se avete bisogno di una comprensione più approfondita su come modificare l’interfacce utenti Archetypes prodotte per voi, vedete il tutorial “Customizing AT View Templates” sul sito Plone.org (http://Plone.org/documentation/tutorial/customizing-at-view-templates).

 

 

Per questo esempio, si presume che vogliamo una visualizzazione del modello per Notizie Regionali che è simile a quella del modello Plone news standard, con un po’ di importanza sulle informazioni delle regioni selezionate.

 

Per permettere questo, abbiamo bisogno di implementare una visualizzazione del browser nominata regionalnews_view, che contiene un macro ZPT nominato body. Tornate indietro alla finestra del vostro terminale e scrivete il seguente:

 

$ cd ~/Plonebook/src/Plonebook.regional_news

$ paster addcontent view

 

Dopo aver richiesto una visualizzazione chiamata regionalnews, Paster creerà tutto quello che è necessario per registrare una visualizzazione browser nominata regionalnews_view nella cartella browser del nostro pacchetto: un modulo regionalnewsview.py e un modello di pagina regionalnewsview.pt. Approfondiremo spiegando cos’è una visualizzazione browser nella sezione del capitolo “Scelta del Tema”; da adesso dobbiamo avere fiducia in quello che Paste sviluppa per noi.

 

 

NOTA Non useremo lo strumento portal_skin di Plone per le nostre necessità di #, ma è ancora possibile registrare una cartella di temi nel nostro prodotto e creare qui un file regionalnews_view.pt, nel quale possiamo scrivere il nostro macro body per il modello di vista di Notizie Regionali.

 

 

Non avremo bisogno della parte di modulo Python della nostra vista del browser; useremo solo il modello di pagina per implementare una macro chiamato body che contiene la sequenza Ciao Mondo! , solo per vedere cosa accade. Qui c’è il nostro file regionalnewsview.py com’era prima di riavviare il servizio Zope:

 

<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en"

lang="en"

i18n:domain="Plonebook.regional_news">

<body>

<div metal:define- macro="body">

<p>Hello World!</p>

</div>

</body>

</html>

 

Riavviate Zope, create un nuovo elemento Notizie Regionali nel vostro sito Plone, e vedete cosa vi mostra Archetypes dal default: tutti i campi precedentemente elencati sotto il titolo del contenuto sono stati rimpiazzati con la nostra sequenza Ciao Mondo! , formattati nello stile del testo del corpo di default. Non entreremo nei dettagli a proposito di come qui la tecnologia lavora, ma potete dare un’occhiata al Capitolo 6 per una rinfrescata.

Archetypes implementa il modello base_view, che è il modello di vista predefinito di ogni tipo di contenuto, attraverso quattro principali macro: testata, corpo, lista delle cartelle, piè di pagina. In fase di esecuzione, cerca un modello intitolato con il nome di contenuto tipo (cioè, regionalnews_view) e sostituisce la sua macro con quello definito nel modello più specifico (cioè, in questo caso regionalnews_view). Ecco perché il nostro modello rimuove tutti gli attributi di Notizie Regionali eccetto il titolo, rimpiazzandoli solo con “Ciao Mondo!”— non siamo specifici a proposito delle macro della testata, della lista delle cartelle e del piè di pagina, quindi Archetypes seleziona quelli predefiniti per quelle sezioni.

Questo facilmente, definendo solo una macro metal con il body ID in un modello chiamato regionalews_view, possiamo rendere ogni singolo campo nella posizione che vogliamo all’interno di un modello di pagina più complesso, sempre ricordando che in questo modo personalizziamo il modello base_view del nostro tipo di contenuto.

Per esempio, proviamo quest’altra versione del modello del nostro contenuto base_view:

 

<html xmlns="http://www.w3.org/1999/xhtml"xml:lang="en"

lang="en"

i18n:domain="Plonebook.regional_news">

<body>

<tal:macro metal:define- macro="header">

<h1 class="documentFirstHeading">

<tal:field metal:use- macro="Python:here.widget('title', mode='view')">

Title

</tal:field>

</h1>

<h3>Region:

 

<tal:field metal:use- macro= "Python:here.widget( 'region', mode='view')" />

</h3>

</tal:macro>

 

<tal:main-macrometal:define- macro="body">

<div class=newsImageContainer"

tal:condition="here/image_mini | nothing">

<img src="/it/labs/documentazione/manual/plone-guide/sviluppare-plone/cap9/tipi-di-contenuto-personalizzati" alt=""

tal:replace="structure Python:here.tag(scale='mini',

css_class='newsImage' ) "/>

</div>

<tal:field metal : use- macro="Python:here.widget('text', mode='view')">

Body

</tal:field>

</tal:main-macro>

</body>

</html>

 

 

In questo modello, prendiamo in considerazione sia la macro header sia quello body, lasciando il suo comportamento di default per le macro folderlisting e footer, e richiediamo il widget per fornire i nostri campi nel modo corretto. Inoltre, siccome è un modello base_view, esso trascura completamente qualsiasi campo non elencato manualmente. Cosi, dovrebbe essere meglio non toccare l’intero meccanismo base_view, e preparare invece una nuova tabella regionalnews_view completamente basata sulla tabella originale newsitem_view, e assegnargli il nostro metodo di visualizzazione default contenuto tipo. Lasceremo che questo sia un esercizio per voi; potete combinare quello che avete imparato nel capitolo 5 sulla configurazione dei tipi CMF portal, e quello che imparerete nella sezione del capitolo “configurazione Plone” su come esportare quelle configurazioni attraverso i profili GenericSetup.

 

 

NOTA Come già affermato, malgrado sia ampiamente utilizzato, Archetypes sta invecchiando lentamente. Il suo approccio monolitico alle questioni di gestione del contenuto è del tutto obsoleto rispetto alle tecniche di Zope 3 che descriveremo per tutto questo capitolo. Il progetto Dexterity di Martin Aspeli (http://martinaspeli.net/articles/dexterity) sta iniziando ad essere usato al posto di Archetypes questi giorni perché esso sfrutta le tecniche di Zope in modo più appropriato. Dexterity inoltre punta a facilitare la dichiarazione dei nuovi tipi di contenuti anche per i non sviluppatori.

 

 

Attraverso questa sezione, avete visto quanto sia facile sviluppare un nuovo tipo di contenuto on Plone utilizzando Archetypes. Discuteremo le ulteriori meraviglie di Archetypes nella sezione “forms” di questo capitolo, nel quale ci focalizzeremo sulla personalizzazione dei nostri piani attributi regionalnews. Per un maggior approfondimento di Archetypes, controllare la documentazione online su Plone.org (http://Plone.org/documentation/phc_topic_area?topic=Developing+for+Plone#Archetypes).

 

 

 

by Dario Pollino last modified 2011-06-21 20:08
Contributors: Maurizio Delmonte, Davide Moro, Alice Narduzzo, Fabrizio Reale, Enrico Barra, Andrea Cannizzaro, Andrea D'Este, Maurizio Lupo, Giuseppe Masili, Dario Pollino, Matteo Sorba.