Utilizzare Domino come Backend Database per Dojo Calendar

NEWS TIPS DEVELOPERS

  • 1 commenti
Ogni sviluppatore si trova prima o poi a fare i conti con la temuta domanda: «Sì, bello, ma... non si potrebbe migliorare la grafica?»
Un'applicazione funzionale ma spartana (e chi scrive non pensa affatto che questo aggettivo debba necessariamente essere considerato dispregiativo) è spesso oggetto di simili richieste, che, se da un lato sembrano quasi svilire il lavoro svolto per esaudire nel migliore dei modi, velocemente e in sicurezza le necessità del cliente, dall'altro sono motivate da ragioni comunque perfettamente comprensibili (magari non da tutti condivisibili, ma comprensibili).

E cosa può corrispondere meglio alla definizione di funzionale ma spartano se non la GUI nativa della viste calendario Notes via web (almeno fino alla versione 7)?

Certo è possibile trovare il modo di sfruttare le possibilità offerte dal template Domino Web Access, oppure sviluppare una propria GUI adatta allo scopo, ma... che ne direste di utilizzare funzionalità standard, open source e che una volta personalizzate consentono il puntamento a differenti tipologie di backend database?

Ad esempio si potrebbero utilizzare le librerie Dojo partendo dall'ottimo tutorial pubblicato da Viktor Krantz (già noto agli amici di Dominopoint)  seguito da un post di aggiornamento.

In questa sede parleremo solo di alcune possibilità per utilizzare file nsf come backend database per il Dojo Calendar (personalizzabile praticamente sotto ogni punto di vista, dai colori alla time-zone) ma, dal momento che la consuetudine impone di comunicare prima le brutte notizie (che in questo caso è una soltanto e così brutta poi non è), diciamo subito che allo stato attuale il codice di Viktor non è compatibile con la versione 0.9 di Dojo (ma gli ultimi post dell'autore lasciano ben sperare).

Non a caso ho scritto “alcune” possibilità: l'intento è proprio quello di invogliare tutti voi a contribuire con la propria esperienza: un lancio di pietra senza nascondere la mano.

Partiamo da una situazione già consolidata:
abbiamo appena inserito le librerie Dojo e i widgets di Viktor in un database Notes (magari utilizzando WebDAV) che rappresenterà il nostro repository centrale per future applicazioni, oppure abbiamo salvato i file di cui sopra in una directory condivisa del nostro web server.
Abbiamo anche copiato il codice html della pagina index.html compresa nel pacchetto dei download (http://ekrantz.com/wp-content/plugins/wp-downloadMonitor/download.php?id=2) in una Page o in un Form, modificando eventualmente i necessari riferimenti di path relativi o assoluti, e rendendo naturalmente il testo un perfetto Pass-Thru HTML.
Bene, le porzioni di codice che ci interessano al momento sono le seguenti:
var entries = {
...  // qui vanno definite le entries, ci torneremo tra qualche riga
}




e:
oCalendar.setCalendarEntries(entries);





Niente di trascendentale: definiamo una variabile chiamata entries e la passiamo alla funzione oCalendar.setCalendarEntries (definita nei widgets, più specificatamente nella Calendar.js) che si occupa di fare tutto il lavoro per noi.
Qual'è il formato richiesto delle singole entry?
Gli esempi parlano chiaro:
"id1": {
starttime: dojo.date.toRfc3339(d1s),
endtime: dojo.date.toRfc3339(d1e),
allday: false,
repeated: false,
title: "Title 1",
url: "",
body: "This is the body of entry with id: id1 and title: Title 1",
attributes: {
Location: "My Galactic Headquarters",
Chair: "John Doe"
},
type: ["meeting"]
},




e così via incrementando il codice numerico relativo all'ID: id2, id3, ecc.

L'approccio più immediato è quindi quello di realizzare una vista con formula di selezione relativa ai documenti che ci interessa visualizzare sul calendario, formattare opportunamente una colonna e inserire nella nostra Page (o nel nostro Form) un Computed Text, contenente una formula di lookup.
La nostra colonna di riferimento presenterebbe quindi una formula simile a qualcosa del genere:
@NewLine+"\"id"+cID+"\": {"+@NewLine+
                  "starttime: \""+wST+"\","+@NewLine+
                  "endtime: \""+wET+"\","+@NewLine+
                  "allday: false,"+@NewLine+
                  "repeated: false,"+@NewLine+
                  "title: \""+tAssignedTo+"\","+@NewLine+
                  "url: \"\","+@NewLine+
                  "body: \"Turno assegnato a: "+tAssignedTo+"\","+@NewLine+
                  "attributes: {"+@NewLine+
                  "Attributo1: \"Riga Attributo 1\","+@NewLine+
                  "Attributo2: \"Riga Attributo 2\","+@NewLine+
                  "Attributo3: \"Spazio per eventuali note\""+@NewLine+
                  "},"+@NewLine+
                  "type: [\"appointment\"]"+@NewLine+
  "        }"




dove cID, wST, wET, tAssignedTo, ecc. sono i nomi dei campi del documento contenenti i dati che ci interessa visualizzare (attenzione agli spazi, alle virgole, alla punteggiatura... a tutto, insomma).

La porzione di Pass-Thru HTML che ci interessa diventa quindi:
var entries = {
< Computed Value >  
}




dove il < Computed Value > contiene una normale formula di tipo @DbColumn.

Funziona, non c'è che dire, ma non possiamo certo affermare che si tratta di una soluzione ottimizzata per database contenenti un gran numero di documenti (tutte le entries vengono caricate nella pagina all'avvio della sessione) o con dati che vengono modificati con una certa frequenza (una volta caricata, la pagina è statica, passando da un mese all'altro vengono visualizzati i dati “fotografati” durante l'inizio della sessione).
Però abbiamo iniziato a studiarci, e questo è già importante.
Vediamo se è possibile migliorare l'approccio.
Ad esempio si potrebbe pensare di utilizzare una versione Javascript della formula @DbLookup: http://www.dominopoint.it/Dominopoint/dominopoint_blog.nsf/dx/dbcolumn_dblookup.htm (se per qualche ragione siete assolutamente certi che l'accesso web verrà eseguito solo con il browser Internet Explorer, potete eventualmente fare un pensierino a questa versione dedicata presente sui forum lotus).
Oppure potete realizzarne una voi (in tal caso, sarebbe gradita la condivisione del codice).
Parlando a livello generale, quindi, ciò che serve è:
–        una vista ordinata per data (o meglio, per anno/mese)
–        colonna di riferimento per il ritorno dei dati formattata come nell'esempio precedente
–        una funzione Javascript corrispondente alla formula @DbLookup

Il nostro Pass-Thru HTML diventa perciò qualcosa di simile a:
// prendo il mese relativo alla finestra calendario attualmente a video
// (ricalcolato ogni volta che passo da un mese all'altro)
// (ATTENZIONE: la funzione getMonth ritorna un vettore 0-based)
var myMonth=dateObj.getMonth()+1;

// prendo l'anno nel formato a 4 cifre con la funzione getFullYear
var myYear=dateObj.getFullYear();

// imposto la mia chiave di lookup convertendola in formato stringa
var myKeyDate=''+myMonth+myYear;

// definisco una variabile utilizzando la funzione di lookup Javascript
var x = dbLookup(server,path,view,myKeyDate,column,Name)

// passo la variabile alla funzione setCalendarEntries
// (attenzione alle parentesi graffe)
oCalendar.setCalendarEntries("{"+x+"}");




dove getMonth e getFullYear sono funzioni dei widget del Dojo Calendar.

In questo modo, ogni volta che cambiamo la finestra temporale sul nostro calendario, i dati (e solo quelli del mese richiesto; naturalmente è possibile realizzare una funzione che consideri anche i giorni del mese precedente e di quello successivo visualizzati nella griglia, questo è solo un codice di esempio) verranno calcolati in tempo reale.
Oppure ancora si può pensare di utilizzare la personalizzazione in ottica XML effettuata al Dojo Calendar che trovate qui: http://www.len.ro/work/articles/dojo-calendar (utilizzando opportunamente nel riferimento all'URL il comando ReadViewEntries; ma qui non ho ancora avuto modo di approfondire, chiunque desideri contribuire è il benvenuto).
Per il momento è tutto, spero che questo breve articolo possa essere uno spunto per approfondire quello che, a mio avviso, è un argomento molto interessante.
Buon lavoro a tutti!


Fabrizio Marchesano, Savonese trapiantato a Genova, lavora per Frame srl ed è uno degli speaker che potrete incontrare all'evento del 14 Settembre dove ci parlerà dello sviluppo di applicazioni su dispositivi Blackberry.


Ricordo che chi volesse proporre materiale da pubblicare su dominopoint non deve far'altro che contattarci con un email a info@dominopoint.it



vedi anche:

1 Commenti:

  • #1 Roberto 11/27/2007 5:28:57 PM

    sono un neofita di Dojo e non riesco a farlo funzionare.

    ho creato una dir "dojo" nella cartella html di domino\data\domino nella quale ho copiato le 4 cartelle:

    dijit, dojo, dojox, util

    e la cartella mywidgets

    ho cambiato il riferimento a dojo nella pagina note, ma quando vado a caricarla su ie mi da l'errore:

    "failed loading /dojo/dojo/../mywidgets/widget/Calendar.js with error: [object Error]"

    "Could not load 'mywidgets.widget.Calendar'; last tried '../mywidgets/widget/Calendar.js'calendar?OpenPage (line 21)"

    qual'è il problema

    ciao e grazie

Commenta articolo
 

Questo spazio web è stato creato da per un uso pubblico e gratuito. Qualsiasi tipo di collaborazione sarà ben accetta.
Per maggiori informazioni, scrivete a info@dominopoint.it

About Dominopoint
Social
Dominopoint social presence: