====== Programmazione con p.mapper 4 ====== p.mapper 4 utilizza estensivamente la libreria [[http://jquery.com/|jQuery]] ed alcune componenti del [[http://jqueryui.com/|plugin UI]] per disegnare il proprio layout. Vedremo come utilizzare la versione completa del plugin UI per aggiungere del contenuto dinamico all'interfaccia di p.mapper. ===== Modificare il codice JavaScript ===== Il codice JavaScript di p.mapper è compresso e unito nell'unico file **''javascript/pm_cjs.js''**. Invece di modificare questo file è possibile prendere il file sorgente interessato (ad esempio **''javascript/src/pm.query.js''**) e farne una copia in **''config/common/''** (viene caricato per ogni configurazione) oppure in **''config/default/''** (viene caricato solo per la configurazione //default//). Le modifiche alle funzioni JavaScript si effettuano in questo file e siccome questo file viene incluso dopo ''pm_cjs.js'', le sue definizioni sovrascriveranno quelle predefinite. ===== Aggiungere un barra laterale ===== Modificare il layout dell'interfaccia, aggiungendo una barra laterale a sinistra. Si modifica il file **''map.phtml''**, nella sezione ''%%
%%'':
/**
* Settings for jquery.ui.layout
* ======= ADAPT TO PAGE LAYOUT =======
*/
var myLayout;
$(document).ready(function () {
myLayout = $('body').layout({
west__size: 200,
north__size: 40,
south__size: 35,
east__size: 220,
north__spacing_open: 0,
south__spacing_open: 0,
...
Questa impostazione rende visibile il **''%%
Sezione 1
Quel ramo del lago di Como, che volge a mezzogiorno, tra due catene non
interrotte di monti, tutto a seni e a golfi, a seconda dello sporgere e
del rientrare di quelli, vien quasi a un tratto, tra un promontorio a
destra e un'ampia costiera dall'altra parte;
Sezione 2
e il ponte, che ivi congiunge le due rive par che renda ancor più sensibile
all'occhio questa trasformazione e segni il punto in cui il lago cessa, e
l'Adda ricomincia per ripigliar poi nome di lago dove le rive, allontanandosi
di nuovo, lascian l'acqua distendersi e rallentarsi in nuovi golfi e in nuovi
seni...
Sezione 3
La costiera, formata dal deposito di tre grossi torrenti, scende appoggiata a
due monti contigui, l'uno detto di san Martino, l'altro, con voce lombarda, il
Resegone, dai molti suoi cocuzzoli in fila, che in vero lo fanno somigliare a
una sega:
Quel ramo del lago di Como, che volge a mezzogiorno, tra due catene non
interrotte di monti, tutto a seni e a golfi, a seconda dello sporgere e
del rientrare di quelli, vien quasi a un tratto, tra un promontorio a
destra e un'ampia costiera dall'altra parte;
e il ponte, che ivi congiunge le due rive par che renda ancor più sensibile
all'occhio questa trasformazione e segni il punto in cui il lago cessa, e
l'Adda ricomincia per ripigliar poi nome di lago dove le rive, allontanandosi
di nuovo, lascian l'acqua distendersi e rallentarsi in nuovi golfi e in nuovi
seni...
Per //attivare// il codice JavaScript che trasforma il normale testo HTML in contenuto dinamico, si devono aggiungere due chiamate di funzione jQuery, che agiscono sugli oggetti con **''id=accordion''** e **''id=tabs''** rispettivamente. Le chiamate di funzione devono stare all'interno della funzione **''$(document).ready()''** in modo che vengano eseguite al termine del caricamento della pagina (sempre in ''map.phtml''):
$(document).ready(function () {
...
$("#accordion").accordion();
$("#tabs").tabs();
});
{{:doc:appunti:linux:lezioni:pmapper:pmapper_ui.png?450|p.mapper jQuery UI}}
===== Formattazione numeri risultato query =====
Il risultato di una query tramite lo strumento **Seleziona** viene mostrato in un dialog box, purtroppo i numeri vengono formattati come numeri con cinque decimali, anche se si tratta di numeri interi.
Per migliorare l'impaginazione bisogna modificare la funzione **''parseResult()''**. Si copia il file sorgente **''pm.query.js''** dalla directory **''javascript/src/''** alla directory **''config/common/''**, quindi si sostituisce le seguenti istruzioni:
if (!(noShpLink && i == 0))
h.append(layTpl.tvalues['#default'].replace(/\$/, this)
.replace(/@/, rHeader[i])
);
con
if (!(noShpLink && i == 0)) {
var value;
if (String(this).match(/^[0-9]+\.0+$/)) {
value = parseFloat(this).toFixed(0);
} else if (String(this).match(/^[0-9]+\.[0-9]+$/)) {
value = parseFloat(this).toFixed(3);
} else {
value = this;
}
h.append(layTpl.tvalues['#default'].replace(/\$/, value)
.replace(/@/, rHeader[i])
);
}
I **numeri interi** sono formattati senza decimali, i **float con solo 3 decimali** e tutto il resto rimane invariato.
===== Dialog box con PM.Dlg.createDnRDlg =====
Thanks to Armin Burger for the following details.
In plugins writing or extending p.mapper code, it is nice to use dialog boxes in the p.mapper way. Here it is an example for the **''PM.Dlg.createDnRDlg()''** function:
var dlgOptions = {
width: 640, height: 480, left: 100, top: 50,
resizeable: true,
newsize: true,
container: 'pmDlgContainer',
name: 'PopupWindow'
};
var dlg = PM.Dlg.createDnRDlg(
dlgOptions,
'Digitize Point',
popupUrl
);
The non-trivial options are:
^ ''newsize'' | Defines if the dialog should always be reset to its width/height defined in the options. If false it keeps the dimensions of the state when it was closed last time. |
^ ''container'' | Defines the ID of a ''%%
var dlgOptions = {
width: 640, height: 480, left: 100, top: 50,
resizeable: true, newsize: true,
container: 'pmDlgContainer',
name: 'PopupWindow'
};
var popupUrl = PM_PLUGIN_LOCATION + '/popup/popup.php?' + SID + '&key=' + val;
var dlgObject = $('#' + dlgOptions.container + '_MSG');
if (dlgObject.length < 1) {
var dlg = PM.Dlg.createDnRDlg(dlgOptions, _p('Pop-up window'), popupUrl);
} else {
$.ajax({
url: popupUrl,
type: 'GET',
dataType: 'html',
success: function(response) {
dlgObject.html(response);
dlgObject.parent().parent().show();
}
});
}
When using forms, p.mapper has two handy PM.Form JavaScript functions to read all the form values and to transform them into a string to be used in AJAX post or get requests:
^ ''PM.Form.getFormKVP()'' | Returns everything in a string ready for URL concatenation, like **''%%&key1=value1&key2=value2...%%''** |
^ ''PM.Form.getFormKvpObjAll()'' | Returns everything in object/array notation, like **''%%{key1: value1, key2: value2, ...}%%''** |