Bookmark and Share
You are here: Home Documentazione Ricette Trasformare i contenuti Plone usando il servizio portal_transform
Document Actions

Trasformare i contenuti Plone usando il servizio portal_transform
medio

Plone usa estensivamente portal_transforms per filtrare l'HTML inserito dai suoi utenti eliminando gli elementi "poco graditi", ma potrebbe non essere ovvio come usare le trasformazioni disponibili con fini diversi.

Problema

Ho caricato delle immagini TIFF in Plone, ma i miei utenti normalmente vogliono visualizzarne degli anteprima nel loro browser, e sebbene il sistema riesca a fare la scalatura di immagini TIFF (grazie a PIL - http://www.pythonware.com/products/pil/, il suo motore dietro le quinte), queste non vengono visualizzate da buona parte dei browser.

Se avete un problema simile al seguente, o qualcosa che concettualmente gli assomiglia, probabilmente, prima di partire all'arrembaggio e fare voi "tutto" quel che serve, fareste bene a dare uno sguardo al servizio Plone in oggetto: portal_transforms, appunto.

Capire portal_transforms

Di fatto, il servizio portal_transforms contiene una serie di script, che possono essere invocati da codice in modo diretto o trasparente, per operare le trasformazioni più disparate sui nostri contenuti.

Tra le trasformazioni di base troviamo quelle che operano sui testi, tra cui "safe_html" (che elimina dal testo quelli che riconosce come tag HTML potenzialmente "pericolosi", chiaramente decisi dal manager del portale) e "html_to_text" (che trasforma il testo in formato HTML in un suo equivalente solo testuale, eliminando adeguatamente i tag HTML). Ma ci sono anche una serie di altre trasformazioni possibili, come ad esempio, tra quelle inerenti le immagini, "image_to_jpeg". Chissà che non sia proprio quella che fa al caso nostro!

Chiaramente, non è affatto complesso costruire ulteriori plugin per estendere il numero di trasformazioni disponibili a sistema. Ma questo esula dagli scopi di questo rapido howto.

Essendo uno strumento che agisce dietro le quinte, buona parte delle sue funzioni sono in realtà trasparenti per l'utente finale, e a volte anche per lo sviluppatore Plone meno sprovveduto, che potrebbe non avergli mai dedicato il giusto spazio nella sua attività quotidiana.

Tanto per capirci, portal_transforms è completamente asservito ad Archetypes, infatti, considerando un campo testuale (un TextField), esso dispone di parametri sia per impostare i content_types permessi (ad es. "text/structured" se vogliamo caricare contenuti nel formato reStructuredText - , o "text/plain" per caricare del testo semplice), come pure per indicare il content_type di uscita, ad es. "text/html". Nel mezzo sarà Archetypes a richiedere in fase di presentazione la trasformazione in base al content_type corrente e a quello desiderato in uscita, che chiaramente devono averne una disponibile nel portal_transforms.

Ma possiamo anche pensare di usare portal_transforms nel nostro codice python, ad es. come vediamo nell'esempio seguente.

Un breve esempio

Facciamo conto di voler rapidamente costruire uno script Python direttamente nella cartella Custom di portal_skins per ottenere sempre e comunque l'immagine che noi sappiamo essere TIFF in versione JPEG.

Ecco un esempio di codice che potrebbe fare al caso nostro:

from Products.CMFCore.utils import getToolByName
portal_transforms = getToolByName(context, 'portal_transforms')

image = context.getImage()
file_data = portal_transforms.convert('image_to_jpeg', str(image))
filename = context.getFilename() + '.jpg'

context.REQUEST.RESPONSE.setHeader("Content-Type", "image/jpeg")
context.REQUEST.RESPONSE.setHeader("Content-Disposition", 
            "filename=%s;disposition=inline" % filename)
return file_data

andate in portal_skins/custom, create un oggetto "Script (Python)", chiamatelo come volete, e incollateci dentro quanto sopra.

Cosa fa lo script?

Diamo per scontato di applicarlo a un oggetto di tipo immagine, con immagine presente, e diamo per scontato che il sistema abbia il plugin a basso livello disponibile: c'è solo il minimo indispensabile.

Di fatto, dopo aver ottenuto il portal_transforms da contesto corrente e l'immagine da trasformare, si limita a richiamare il metodo "convert" di portal_transforms, indicando la conversione che ci interessa, e passando il contenuto binario dell'immagine.

Quindi imposta la response per restituire un file di tipo jpeg, con disposition "inline", e infine restituisce il file convertito.

Ulteriori Informazioni

..Le potrete reperire leggendo la documentazione presente nel pacchetto sorgente PortalTransforms,e anche leggendo il tutorial in lingua inglese sul sito plone.org (http://plone.org/documentation/tutorial/portal-transforms).

by Maurizio Delmonte last modified 2009-02-05 18:20

Errore

Posted by Alessandro S. at 2009-09-21 10:39
Da me da sempre l'errore: "IOError: cannot identify image file",provando lo script.

Re: Errore

Posted by Davide Moro at 2009-09-21 10:41
Ciao Alex,
potresti descrivere quando e come si verifica l'errore?
Tipo numero di linea, ecc.

davide

dettagli

Posted by alex at 2009-09-24 16:31
Ciao Davide,
caricando un immagine tiff e applicando lo script menzionata con Plone 3.2.1 mi da il seguente errore:

Request URL http://prova.it:8091/prova3/prove/imagine/tifftojpeg.py
Exception Type IOError
Exception Value cannot identify image file
Traceback (innermost last):

Module ZPublisher.Publish, line 119, in publish
Module ZPublisher.mapply, line 88, in mapply
Module ZPublisher.Publish, line 42, in call_object
Module Shared.DC.Scripts.Bindings, line 313, in __call__
Module Shared.DC.Scripts.Bindings, line 350, in _bindAndExec
Module Products.PythonScripts.PythonScript, line 327, in _exec
Module None, line 5, in tifftojpeg
<PythonScript at /prova3/tifftojpeg.py used for /prova3/prove/imagine>
Line 5
Module Products.PortalTransforms.TransformEngine, line 219, in convert
Module Products.PortalTransforms.Transform, line 192, in convert
Module Products.PortalTransforms.libtransforms.piltransform, line 20, in convert
Module PIL.Image, line 1916, in open
IOError: cannot identify image file

dettagli

Posted by Matteo Sorba at 2009-09-28 09:39
Bisognerebbe vedere l'immagine contenuta in quel TIFF: in che formato è l'immagine?
Con che compressione è stata inclusa?
 

Supporto

Ottieni un
aiuto veloce e mirato sul forum, gratis!

partecipa al forum

 

Segui le icone

 

Livelli di difficoltà

livello guruSolo per i "guru"!
livello avanzatoPer configuratori e sviluppatori
livello medioPer chi ha già familiarità
livello basePer tutti!

 

I video

video

Il documento è supportato da un video!