Modelli di Contenuto jAPS 2.0 mini-HOWTO

Do It The jAPS Way

Andrea Dessì

First draft 
AgileTec S.r.l.

Legal Notice

Permission is granted to copy, distribute and/or modify this document under the terms of the GNU Free Documentation License, Version 1.3 or any later version published by the Free Software Foundation; with no Invariant Sections, no Front-Cover Texts, and no Back-Cover Texts. A copy of the license is included in the Appendix entitled "GNU Free Documentation License".

The copyright holders make no representation about the suitability of this Document for any purpose. It is provided “as is” without expressed or implied warranty. If you modify this Document in any way, identify your resulting Document as a variant of this Document.

2011-03-03

Revision History
Revision 0.32011-03-03MEM

Revisione per il rilascio di jAPS 2.2.0

Revision 0.22010-03-18MEM

Revisione per rilascio japs 2.0.10

Revision 0.12009-05-05AD

Prima versione pubblicata

Abstract

Questo documento vuole illustrare brevemente il concetto di Modello di Contenuto.


Chapter 1. Scopo del documento

Introduzione

Questo documento illustrerà cosa sono i Modelli di Contenuto in jAPS 2.0 entando e come utilizzarli.

A chi si rivolge

Questo documento è rivolto agli sviluppatori che intendono creare od ampliare un portale fatto con jAPS 2.0 entando.

Gli esempi ed i concetti riportati in questo manuale saranno utili agli sviluppatori come riferimento per la creazione di semplici Modelli di Contenuto

Prerequisiti

Per poter utilizzare efficacemente le informazioni presenti in questo documento è necessario avere conoscenze di:

  • jAPS 2.0 entando e la sua architettura
  • i “Tipi di Contenuto” di jAPS 2.0 entando
  • html e css
  • Apache Velocity Template Language

Ulteriori Riferimenti

Ulteriori informazioni possono essere reperite tramite

È inoltre possibile consultare la documentazione presente in:

jAPS 2.0 entando Project - Sito per gli sviluppatori

Chapter 2. Teoria dei Modelli di Contenuto

Teoria dei Modelli di Contenuto

Lo scopo dei Modelli di Contenuto è quello di rappresentare in maniera opportuna le informazioni, che sono racchiuse nei contenuti, all'interno delle pagine di jAPS.

Per ogni Tipo di Contenuto è necessario creare almeno un modello per lista e un modello di default, questo perchè verranno utilizzati da jAPS come modelli di rifermento (vengono specificati nella configurazione dei Tipi di Contenuto)

I modelli possono essere creati direttamente utilizzando il backend, dal menu di sinistra andare su C.M.S. - Contenuti - Modelli di Contenuto.

Versioni Precenti alla 2.0.8

Nelle versioni precenti i Modelli di Contenuto sono reperibili andando su Varie - Personalizza - Modelli di Contenuto.

Qui si accederà alla lista dei modelli, dove è possibile modificare quelli presenti o crearne dei nuovi.

Per ogni modello si specifica:

  • Id, è un campo obbligario, e rappresenta un numero identificativo univoco che verrà preso come rifermento dal sistema

  • Tipo, campo obbligatorio, rappresenta il tipo di contenuto a cui fa riferimento

  • Descrizione, obbligatoria, piccola descrizione sul modello

  • Modello, campo obbligatorio, il modello scritto in Velocity

  • Foglio di stile, non obbligatorio, eventualmente indicare un foglio di stile che verrà incluso ogni volta si userà il modello

Nota: Database

Le informazioni relative ai Modelli di Contenuto verranno salvate nel database Port nella tabella contentmodels.

Il Modello

Il modello verrà interpretato da Velocity quindi si hanno a disposizione le funzionalità del template engine quali variabili, istruzioni ed espressioni.

Il risultato del modello vuole essere una struttura coerente con la struttura delle pagine del portale.

Se le pagine del portale sono fatte in xhtml il risultato del che si dovrà ottenere dal modello è xhtml.

Nei modelli che andremo a scrivere troveremo un mix di due linguaggi: il linguaggio di markup utilizzato nelle pagine e linguaggio Velocity.

jAPS mette a disposizione i seguenti oggetti nel contesto Velocity per accedere alle informazioni del contenuto:

  • $content

  • $i18n

$content rappresenta l'oggetto Contenuto, è possibile richiamare ogni suo attributo secondo la notazione standard:

$content.NOMEATTIBUTO

Ogni Tipo di Attributo ha delle proprietà che si utilizzano per raggiungere l'informazione voluta. Fare riferimento al JavaDoc di jAPS.

Inoltre jAPS mette a disposizione le seguenti proprietà:

  • $content.categories

  • $content.contentLink

  • $content.contentOnPageLink

$content.categories è una mappa (Map) contenente la lista delle categorie associate al contenuto.

$content.contentLink restituisce una stringa con il link della pagina dove il contenuto è pubblicato esplicitamente.

$content.contentOnPageLink è un metodo accetta come parametro il codice di una pagina del portale e restituisce un URL simbolico che punta al contenuto stesso sulla pagina specficata

Nota: Esempi

Vedere gli esempi nei capitoli successivi

Convenzioni: Nomi e Numerazione

Per la creazione dei Modelli di Contenuto si utilizza un certo critero per l'attribuzione degli Id, delle Descrizioni e dei Fogli di Stile.

Convenzione per l'assegnazione degli Id

Il valore degli Id parte da 1.

Ogni Tipo di Contenuto deve avere come minimo due modelli: modello predefinito e modello per liste (defaultmodel e listmodel).

Per convezione si procede assegnando gli Id prima ai modelli predefiniti, poi ai modelli per liste e successivamente agli altri.

Per quanto riguarda i modelli completi si assegna un Id con valore che cresce di una unità di volta in volta.

Dopodichè si assegna ai modelli per lista lo stesso numero del corrispettivo modello predefinito accostando un 1.

Example 2.1. Assegnare l'Id ai modelli Generico Predefinito, News Predefinito

Assegnerò:

  • Id Generico Predefinito: 1
  • Id News Predefinito: 2

Nel caso in cui ci fossero anche altri Tipi di Contenuto si procede incrementando di una unità per ciascuno dei Modelli Predefiniti.


Example 2.2. Assegnare l'Id ai modelli Generico per liste, News per liste

Assegnerò:

  • Id Generico per Liste: 11
  • Id News per Liste: 21

Nel caso in cui ci fossero anche altri Tipi di Contenuto si procede incrementando la seconda cifra di una unità per ciascuno dei Modelli per Lista.


Più di 10 predefiniti

Se ci fossero 10 modelli predefiniti, al decimo modello per lista assegnerei l'Id 101

  • Id Nono Modello per Liste: 91
  • Id Decimo Modello per Liste: 101

Come per gli Id dei modelli per lista si associa agli altri modelli dello stesso Tipo di Contenuto un Id che inizia con l'Id del modello predefinito e si affianca una cifra che cresce di volta in volta

Example 2.3. Assegnare un Id ai modelli per i Tipi di Contenuto Generico e News

  • Id modello predefinito Contenuto Generico: 1

  • Id modello per liste Contenuto Generico: 11

  • Id modello alternativo Contenuto Generico: 12

  • Id modello predefinito News: 2

  • Id modello per liste News: 21

  • Id modello alternativo News: 22

Al decimo Modello Completo...

  • Id modello predefinito XXXXXXX: 10

  • Id modello per liste XXXXXXX: 101

  • Id modello alternativo XXXXXXX: 102


Convenzione per le Descrizioni

Non ci sono particolari nomi convenzionali la Descrizione nei Modelli di Contenuto.

L'unico accorgimento è indicare quali infomazioni compariranno.

Fare riferimento al prossimo esempio.

Example 2.4.  Descrizioni di esempio

Prendiamo come riferimento un tipo di contenuto chiamato Contenuto Generico che ha questi gli attributi:

  • Titolo
  • Abstract
  • CorpoTesto
  • Link Correlati
  • Allegati
  • Foto1
  • Foto2
  • Foto3

La Descrizione per un modello che visualizza il titolo, il corpo testo, i link, gli allegati la foto numero 1 sarà così:

Completo (Titolo, Corpo, Link ,Alleg ,Foto1)

Mentre per un modello che visualizza solo il titolo e la foto si adotterà una Descrizione tipo la seguente

Per Liste (Titolo e Foto1)

Oltre ad indicare quali informazioni verranno visualzzate dal modello è bene indicare quale funzione o particolarità propongono

Example 2.5. Descrizione per un modello particolare per una lista rossa

Per Liste - Rossa (Titolo, Foto1)

Convenzione per i Fogli di Stile

Per seguire la linea di sviluppo di jAPS e mantenere un certo ordine è bene separare i fogli di stile dei Modelli di Contenuto ponendoli in una directory apposita chiamata contentmodels.

Per convezione il nome del file del foglio di stile viene deciso utilizzando il codice del tipo di contenuto e una descrizione senza spazi: codice_tipo_contenuto_descrizione_senza_spazi.css

Alcuni esempi come valore del campo Foglio di Stile:

contentmodels/CNG_completo.css
contentmodels/CNG_box_verde.css
contentmodels/NEW_liste_rosse.css

Chapter 3. Alcuni Esempi

Alcuni Esempi

In questo capitolo verranno illustrati degli esempi su come realizzare ed utilizzare i Modelli di Contenuto per diversi Tipi di Contenuto.

Contenuto Generico

Facciamo degli esempi di Modelli di Contenuto riferendoci al seguente di Tipo di Contenuto

<contenttype 
 typecode="CNG" 
 typedescr="Contenuto generico" 
 viewpage="contentview" 
 listmodel="11" 
 defaultmodel="1">
   <attributes>
   <attribute name="Titolo" attributetype="Text" required="true" />
   <attribute name="Abstract" attributetype="Longtext" />
   <attribute name="CorpoTesto" attributetype="Hypertext" />
   <attribute name="Immagine_1" attributetype="Image" />
   <attribute name="Immagine_2" attributetype="Image" />
   <list name="Riferimenti" attributetype="Monolist" nestedtype="Link" />
   <list name="Allegati" attributetype="Monolist" nestedtype="Attach" />
  </attributes>
    </contenttype>
			

Modello Completo per Contenuto Generico

Se volessimo visualizzare tutti gli attributi (eccetto Abstract che verrà utilizzato solo per le liste) compileremo il form di creazione nuovo modello così:

  • Id: 1
  • Tipo: Contenuto Generico
  • Descrizione: Completo (titolo, testo, foto1-2, riferim, alleg)
  • Modello:

    $content.Titolo.text
    $content.CorpoTesto.text
    
    $content.Immagine_1.text: $content.Immagine_1.imagePath("1") -
    
    $content.Immagine_2.text: $content.Immagine_2.imagePath("1")
    
    #foreach ($link in $content.Riferimenti)
     $link.text: $link.destination - 
    #end	
    
    #foreach ($attach in $content.Allegati)
    	$attach.text: $attach.attachPath - 
    #end
  • Foglio di Stile: contentmodels/CNG_completo.css

Guardando il modello e immaginando l'output di questo genere

Contenuto di prova

<p>Questo è un contenuto di prova con immagini, link e allegati.</p>

Il mio logo: /myPortal/resources/cms/images/myImage_d1.jpg

Immagine dell'azienda: /myPortal/resources/cms/images/anotherImage_d1.png

	Homepage di jAPS - http://www.japsportal.org
	Sito sviluppatori jAPS - http://dev.japsportal.org

	Articolo sull'architettura - /myPortal/resources/cms/documents/articolo1.pdf
	Vantaggi jAPS - /myPortal/resources/cms/documents/vantaggi.pdf

Il passaggio all'html è quasi automatico

<div class="generico">
	<h3>$content.Titolo.text</h3>
 
 $content.CorpoTesto.text
 
 <img src="$content.Immagine_1.imagePath("1") alt="$content.Immagine_1.text" /><br /> 
 <img src="$content.Immagine_2.imagePath("1")" alt="$content.Immagine_2.text" />
 
 <h4>Riferimenti</h4>
 <ul>
 #foreach ($link in $content.Riferimenti)
  <li>
   <a href="$link.destination">$link.text</a>
  </li> 
 #end 
 </ul>
 
 <h4>Documenti Allegati</h4>
 <ul>
 #foreach ($attach in $content.Allegati)
  <li>
   <a href="$attach.attachPath">$attach.text</a>
  </li> 
 #end
 </ul>
</div>
Gestire gli attributi non obbligatori

Nella configurazione del Tipo di Contenuto appena descritto non è stata dichiarata l'obbligatorietà di alcuni attributi.

Controlliamo gli attributi non obbligatori utilizzano gli strumenti che Velocity ci mette a disposizione

<div class="generico">
 <h3>$content.Titolo.text</h3>
 
 #if ($content.CorpoTesto.text != "")
  $content.CorpoTesto.text
 #end
 
 #if ($content.Immagine_1.imagePath("1") != "") 
  <img src="$content.Immagine_1.imagePath("1") alt="$content.Immagine_1.text" /><br /> 
 #end
 
 #if ($content.Immagine_1.imagePath("2") != "")
  <img src="$content.Immagine_2.imagePath("1")" alt="$content.Immagine_2.text" />
 #end 
 
 #if ($content.Riferimenti && $content.Riferimenti.size() > 0)
  <h4>Riferimenti</h4>
  <ul>
  #foreach ($link in $content.Riferimenti)
   <li>
    <a href="$link.destination">$link.text</a>
   </li> 
  #end 
  </ul>
 #end
 
 #if ($content.Allegati && $content.Allegati.size() > 0)
  <h4>Documenti Allegati</h4>
  <ul>
  #foreach ($attach in $content.Allegati)
   <li>
    <a href="$attach.attachPath">$attach.text</a>
   </li> 
  #end
  </ul>
 #end
	
</div>

Modello per Liste per Contenuto Generico

Un esempio di modello per realizzare una lista di contenuti

<p>
 <a href="$content.contentLink">$content.Titolo.text</a>
 #if ($content.Abstract.text != "")
  <br />$content.Abstract.text
 #end
</p>

News

Prendiamo come riferimento il seguente Tipo di Contenuto

<contenttype 
 typecode="NEW" 
 typedescr="Notizia" 
 viewpage="newsview" 
 listmodel="21" 
 defaultmodel="2">
   <attributes>
   <attribute name="Titolo" attributetype="Text" required="true" />
   <attribute name="Data" attributetype="Date" required="true"/>
   <attribute name="Abstract" attributetype="Longtext" />
   <attribute name="CorpoTesto" attributetype="Hypertext" required="true" />
  </attributes>
    </contenttype>			
			

Modello Completo per News

Definiamo il modello completo con queste caratteristiche

  • Id: 2
  • Tipo: Notizia
  • Descrizione: Completo (titolo, data inizio, data fine, testo)

e il relativo modello

<div class="completo">
	
 <h3>$content.Titolo.text</h3>
 <p class="data">$content.Data.longDate</p>
 
 $content.CorpoTesto.text  

</div>

Modello per Liste per News

<p>
 <a href="$content.contentLink">$content.Titolo.text &ndash; $content.Data.shortDate</a>
 #if ($content.Abstract.text != "")
  <br />$content.Abstract.text
 #end
</p>