ago
17
Written by:
AL
17/08/2010 0.53
XsltDb
XsltDb è un fantastico modulo DotNetNuke dedicato agli sviluppatori, o quanto meno… a chi abbia un minimo di dimestichezza con i fogli di stile XSL e relative Transformations (XSLT): è infatti con su queste tecnologie che si basa il funzionamento del potente modulo.
In pratica con XsltDb è sufficiente scrivere un foglio di stile XSL, anche parziale (ci pensa XsltDb a completare per mezzo di template i semilavorati più semplici), per creare molto rapidamente un nuovo modulo DotNetNuke che esponga un contenuto dinamico (proveniente da un file XML piuttosto che da un database MS-SQL, ma non solo) in formato HTML, XML o testuale (anche sotto forma di Web Service!), per mezzo di un modulo riutilizzabile (è possibile dare il nome ad una “configuration”, cioè ad un XSLT, per poi riutilizzarla più volte) e avvantaggiandosi con semplicità di moltissime estensioni (AJAX, integrazione DNN, codice server-side, costruzione automatica dei settings del modulo, giusto per citare alcune funzioni).
Senza indugiare in una descrizione più approfondita del modulo e delle sue capacità, per le quali vi rimando ai siti ufficiali, passiamo quindi ad un esempio che ci mostra alcune delle caratteristiche di questo bel modulo.
http://xsltdb.codeplex.com
http://xsltdb.com
http://xsltdb.wordpress.com/
XsltDb Repository Viewer
Questo template utilizza XsltDb per visualizzare un elenco di file, o più genericamente di elementi classificati per mezzo di un modulo DNN Repository. Fa più o meno quello che fa il modulo accessorio “Repository Dashboard”, consentendoci però di personalizzare completamente l’aspetto ed il funzionamento della nostra dashboard.
In questa pagina potete vedere il modulo in funzione e scaricare i sorgenti completi.
Come il modulo Repository Dashboard, anche il nostro template ci consente di specificare, nelle impostazioni del modulo, quale repository e quale categoria di elementi utilizzare per popolare la nostra vista:
Un template XsltDb, infatti, può contenere le istruzioni per costruire automaticamente una vista sulle impostazioni del modulo (module settings). Nel nostro caso:
1: <mdo:setup>
2: <section label-width="200px" > Configurazionesection>
3: <setting name="repositoryid" type="select" auto-post-back="true">
4: <caption>Repositorycaption>
5: <source>
6: <xsl:variable name="sql-repository">
7: GetModuleByDefinition {{mdo:dnn('P.PortalID')}}, 'Repository'
8: xsl:variable>
9: <xsl:for-each select="mdo:sql($sql-repository, 'repo')//repo">
10: <option value="{ModuleID}">{{ModuleTitle}}option>
11: xsl:for-each>
12: source>
13: setting>
16: […]
26: mdo:setup>
Si noti l’uso del tag mdo:setup per la costruzione dei Settings, che vengono salvati da DNN come per qualunque altro modulo “vero”, ovvero nella tabella TabModuleSettings. Davvero comodo, soprattutto se si pensa di riutilizzare uno stesso modulo su varie pagine variandone, appunto, la configurazione per singola istanza.
Il nostro template utilizza poi una semplicissima tabella HTML per costruire la visualizzazione degli elementi, e richiama una stored procedure per acquisire i dati in modo parametrico:
1: <table id="stat" class="display">
2: <thead>
3: <tr>
4: <th>Templateth>
5: <th>Descrizioneth>
6: <th>Kbth>
7: tr>
8: thead>
9: <tbody>
10: <xsl:variable name="qry">
11: exec dbo.grmGetRepositoryObjects
12: @ModuleID={{mdo:get-module-setting('repositoryid', '-1')}},
13: @sFilter=N'',@sSort=N'UpdatedDate',@Approved=1,
14: @CategoryId={{mdo:get-module-setting('categoryid', '-1')}},
15: @Attributes=N'',@RowCount=-1
16: xsl:variable>
17: <xsl:for-each select="mdo:sql($qry, 'table')//table">
18: <tr>
19: <td>
20: <a name="#download{ItemID}">a>
21: <a href="#download{ItemID}" onclick="GetFile({ItemID},
22: '{FileName}', {CreatedByUser});" title="Download {Name}">{{Name}}a>
23: td>
24: <td>
25: <xsl:value-of select="Description" disable-output-escaping="yes" />
26: td>
27: <td nowrap="true">{{FileSize}}td>
28: tr>
29: xsl:for-each>
30: tbody>
31: table>
Con un minimo di conoscenza di HTML e CSS, e magari aggiungendoci un po’ di jQuery, diventa davvero semplice personalizzare l’aspetto del nostro modulo, mentre d’altra parte è altrettanto immediato intervenire sulla parte SQL per modificare la logica d’estrazione a piacimento.
Forse un Web-Designer non se la caverà da solo se deve costruire un nuovo modulo, ma aprendo un template XsltDb come quello qui sopra credo potrebbe modificare la parte HTML senza grosse difficoltà.
Pappa per gli sviluppatori è invece la porzione di template che gestisce il download del file: per mezzo di una chiamata mdo:net al metodo di una DLL .Net richiamiamo la funzione di download, che ci restituisce una URL al file del repository.
L’utilizzo della chiamata mdo:net mostra come sia semplice richiamare da un foglio di stile un metodo di una DLL compilata, che nel nostro caso si appoggia al controller del modulo Repository e ne utilizza il metodo “GetRepositoryItemFileName” per ottenere una URL al file così come classificato dal modulo stesso (che introduce una hash nel nome del file).
La chiamata al metodo DownLoadFile:
1: <xsl:value-of select="mdo:net('DNNXsltDbRepository.DNNXsltDbRepository.DownLoadFile',
2: mdo:get-module-setting('repositoryid', '-1'),mdo:get-module-setting('categoryid', '-1'),
3: mdo:request('itemid'), mdo:request('filename'), mdo:request('CreatedByUser'))" />
viene resa disponibile via javascript per mezzo di un template mdo:callable:
1: <mdo:callable js="Download(itemid,filename,CreatedByUser)" type="text/html">
che viene richiamato, alla pressione del link, da una funzione javascript che, acquisita la URL dalla chiamata alla DLL, redirige l’utente alla stessa dando inizio al download:
1: function GetFile(itemid,filename,CreatedByUser)
2: {
3: jQuery("#progress").show();
4: Download(itemid,filename,CreatedByUser, function(result){
5: jQuery("#progress").hide();
6: location.href=result;
7: });
8: }
La chiamata alla funzione di download è asincrona (così da non bloccare la pagina) e gestisce la visualizzazione di una progress bar: meccanismo semplice ma tutto sommato efficace per dare feedback all’utente, e che può chiaramente essere utilizzato anche per chiamate
mdo:AJAX.
In questa pagina potete vedere il modulo in funzione e scaricare i sorgenti completi.