Blog multi-autore con Plone: una alternativa a Wordpress
Qualche giorno fa ci è arrivata la richiesta di creare una sezione blog sul sito videohifi: Openjournal!
In pratica una sezione aperta a tutti coloro che vogliono contribuire alle tematiche che girano attorno al mondo dell'HiFi (musica, arte, concerti, apparecchiatura, ecc.).
La richiesta
Le richieste del cliente erano più o meno queste:
1. gli utenti che voglio iscriversi al Blog, inviano una richiesta con i loro dati via email all'amministrazione del sito;
2. l'amministratore, dopo aver verificato i dati del richiedente, registra l'utente e crea il Blog personale;
3. l'utente riceve le credenziali di accesso al proprio Blog e può iniziare a scrivere i propri Post;
4. creare una HomePage della sezione che raggruppasse in vari box i post in evidenza oppure
di un particolare argomento.
Vista l'entità delle richieste, abbiamo scelto un approccio "agile" che ci ha permesso di risolvere "rapidamente" le richieste, riscuotendo gli apprezzamenti del cliente.
La soluzione
Dopo una rapida valutazione abbiamo scartato l'uso dei vari prodotti di blog messi a disposizione dalla community Plone (vedi Quills, SimpleBlog, ecc.), per non impelagarci in override di viste oppure incastrarci in logiche più complesse del necessario.
Per quanto riguarda la richiesta di iscrizione, abbiamo risolto il problema creando una apposita form con PloneFormGen.

Per la creazione del Blog, la nostra soluzione si basa sulla definizione di due nuovi content-types, Blog e Post: ci siamo limitati a definire le due nuove rappresentazioni dei content-type nel registro portal_types ereditando da Folder per il Blog e da Document per il Post.
NB: in questo modo ci siamo risparmiati l'inutile definizione di due nuovi Archetypes.
Per la creazione della home page abbiamo scelto di "comporla" per pezzi sfruttando le potenzialità di:
- collective.portletpage, per costruire la struttura della home
- collective.contentleadimage, per agganciare le immagini ai Post
- collective.portlet.collectionmultiview, per la creazione di box configurabili (basati sulle collection di plone)
Il sistema di categorizzazione
Per selezionare i Post da mettere "in evidenza" abbiamo adottato una soluzione che ci sembrava il miglior compromesso tra la rapidità di sviluppo e l'usabilità della funzionalità da implementare.
In pratica abbiamo creato un sistema di "marking" degli oggetti Post.

Attraverso il tab "Azioni" è possibile etichettare un Post come "in evidenza" oppure "post recente" applicando all'oggetto una particolare interfaccia:
def add_interface(self): """add IFeaturedPost interface""" context = self.context alsoProvides(context, IFeaturedPost) context.plone_utils.addPortalMessage(_(u'IFeaturedPost set')) context.reindexObject() return self.request.response.redirect(context.absolute_url())
In maniera speculare possiamo rimuvere il Post dalla lista di quelli in evidenza: in questo caso viene rimossa la "marker interface" relativa dall'oggetto corrente:
def remove_interface(self): """remove IFeaturedPost interface""" context = self.context noLongerProvides(context, IFeaturedPost) context.plone_utils.addPortalMessage(_(u'IFeaturedPost unset')) context.reindexObject() return self.request.response.redirect(context.absolute_url())
I Post così etichettati possono essere facilmente reperiti attraverso un cercatore (che effettua un filtro sull'indice "object_provides" del catalogo di Plone per la particolare marker interface) e visualizzati nei vari box della home.
Risultati
Con questa soluzione abbiamo creato un Blog multi-autore robusto e facile da usare, dando la possibilità al cliente di far partire subito il "recruiting" di nuovi autori.
Il Blog OpenJournal, ad oggi (dopo sole poche settimane dalla sua messa online), conta già 20 "bloggers" e 100 post pubblicati.
Seguici!