Per l'esempio i dati del formulario saranno trasmessi in modo criptato (HTTPS)
Dopo l'azione di creazione, il formulario sarà visualizzato protetto nella pagina corrente affinché l'utente possa verificare il contenuto.
Questa operazione consiste nel leggere i dati restituiti dal web service (testata e parametri) e nel visualizzarli a video.
La lettura si fa mediante 'mapping' dei parametri in output del web service verso due entità XTEND (XTDFRMHEAD e XTDFRMPARAM) per creare i dati in memoria ed inserendo due token blocchi (ABLKFRMHEAD e ABLKFRMPARAM) nella pagina HTML per visualizzare i dati.
La gestione della visualizzazione (formulario di inserimento o formulario creato protetto) nella stessa pagina è assicurata da un token 'blocco condizionale' (ACNDXTDFRMHIDE).
I formulari creati possono essere consultati mediante la funzione X3 Formulario(GESAYZ)
Questo paragrafo è un complemento della procedura di creazione di una azione utente.
1. Creare l'interfaccia 'Azione utente oggetto' AXTDFORM basata sul nome di pubblicazione dell'oggetto AYZ (AXTDAYZ)
2. generare l'accesso.
3. Generare tutti i campi dell'interfaccia
Vedere il menù 'Strumenti/Creazione token campo'
Creare le entità:
Vedere il menù Strumenti\Aiuto alla compilazione.
Queste entità saranno in seguito utilizzate nel mapping di ritorno dell'azione di creazione del formulario.
In questo esempio sono state definite 2 chiavi per AYZ:
FCYCOD filtra i formulari in funzione del sito corrente ASAMPLE.
Occorre cancellare questa chiave se si vogliono leggere tutti i formulari del database
Creare un'azione AXTDFRMCREATE di tipo 'standard' che ha come parametri il tipo, il titolo, l'email, il commento e le opzioni.
Solo i parametri del web service che dipendono dal contesto di chiamata dell'azione sono dichiarati come parametri dell'azione in inserimento.
E' il token link dinamico ad indicare come saranno valorizzati in funzione del contesto di chiamata (campo web, campo XTEND...).
Cancellazione all'inizio'
contrassegnato per cancellare le entità AXTDFRMHEAD e AXTDFRMPARAM all'inizio dell'azione (prima del risultato della chiamata del sotto-programma) per gestire correttamente la visualizzazione del risultato nella stessa pagina HTML con l'aiuto di un 'blocco condizionale' basato sulla presenza del campo FRMCOD.
Avanzamento dell'attività
Si: affinché ogni chiamata dell'azione sia registrata nel file di log
Attivo su reload
No: per non ricreare un formulario se l'utente preme F5 dopo aver creato un formulario;
Attivazione bottone
Crea: per attivare il bottone di azione Registra dell'oggetto AYZ
Si tratta di far corrispondere i campi XTEND con i parametri di chiamata del web service.
In questo caso bisogna fare solo un mapping dei parametri dell'azione TYP, TTL, CMT, MAIDCOD, PARCOD e PARVAL.
Il mapping di PARCOD e PARVAL è di tipo Multi, il che permette al server XTEND di 'mappare' più campi HTML con lo stesso nome su un parametro multi-dimensionato.
Per 'mappare' i parametri dell'azione non si indica il codice dell'entità.
I parametri del web service il cui valore proviene sempre dallo stesso contesto possono essere valorizzati direttamente nel mapping dell'azione precisandone l'entità.
Per esempio, se si dovesse passare il codice utente di login si potrebbe mapparlo direttamente con il campo AUSERCODE dell'entità ASESSION piuttosto che dichiararlo come parametro dell'azione.
Si tratta di creare due entità XTEND a partire dai dati ottenuti da X3:
Le entità di tipo Azione sono salvate in memoria durante tutta la durata della sessione utente.
Sono ricreate automaticamente ad ogni chiamata dell'azione.
Per gestire la visualizzazione mediante un 'blocco condizionale' è necessario cancellare le entità la prima volta che si visualizza la pagina (quando si clicca sul token link dinamico ADLKCONTACT nel menù di di sinistra).
Per fare ciò si crea l'azione AXTDFRMRESET che cancella le entità AXTDFRMHEAD e AXTDFRMPARAM.
Tale azione è associata al token ADLKCONTACT.
Tipo
Standard
Interfaccia
Nessuna
Il link dinamico ADLKXTDFRMCREATE è il token che sarà inserito nel bottone di creazione del formulario.
Permette di definire la pagina di destinazione (Pagina corrente), di associare l'azione AXTDFRMCREATE e di valorizzare i parametri.
Avanzamento dell'attività
Si: affinchè ogni clic sul link venga registrato nel file di log
Forza modo http post
No: Poiché un'azione con i parametri è associata al link dinamico, la richiesta verrà inviata automaticamente in modalità POST
Pagina corrente
Si: Il risultato (messaggio o formulario creato) è visualizzato nella pagina corrente
Azione
Codice dell'azione da attivare
Controlla campi web
Si: Per controllare i parametri Web (vedere sezione 'Azione')
Si tratta di dichiarare tutti i parametri dell'azione ed indicare la maniera in cui si vuole valorizzarli.
Campo TYP
Costante: Il tipo di formulario è sempre di tipo contratto (CON)
Campi TTL, MAICOD
'Campo Web Obbl': Inserimento obbligatorio tramite un campo web.
Campi CMT, PARCOD, PARVAL
'Campo web': Inserimento mediante un campo web non obbligatorio
Cost/Attrib. web
Contiene il nome del tag input (attribut name)
Il controllo dell'inserimento è attivo solo se l'opzione 'Generalità/Controlla campi web' è contrassegnata.
La richiesta sarà indirizzata verso il server XTEND solo se:
Il controllo è effettuato mediante la libreria JavaScript di XTEND.
Il token ADLKCONTACT permette di visualizzare la pagina di creazione del formulario a partire dal menù di sinistra.
Per gestire la visualizzazione mediante il 'blocco condizionale' ACNDXTDFRMHIDE, è necessario cancellare le entità formulario alla prima visualizzazione.
Questa operazione è effettuata associando l'azione AXTDFRMRESET al token ADLKCONTACT.
Questo token permette così di visualizzare la pagina in modo protetto (https) per indicare all'utente che i dati saranno criptati.
Avanzamento dell'attività
Si
Forza modalità post
Si: Per mantenere il contesto di XTEND salvato nella pagina corrente.
Il modo HTTP GET è usato solo sui link di tipo 'anchor' che devono essere compatibili coi motori di ricerca (web crawlers).
Pagina corrente
No/AXTDFRMCREATE : Pagina di destinazione
Azione
AXTDFRMRESET: Per cancellare le entità formulario
I token blocchi ABLKFRMHEAD e ABLKFRMPARAM sono usati per visualizzare le entità AXTDFRMHEAD e AXTDFRMPARAM che rappresentano i dati di un formulario XTEND.
Tipo
Mono record: Legge l'entità AXTDFRMHEAD e posiziona il dato in cima (top) alla sequenza del contesto di dati poi esegue i token figli
Nessun dato
Non visualizzare nulla: Se l'entità AXTDFRMHEAD non esiste, il blocco ed i token 'figli' sono ignorati
Entità
AXTDFRMHEAD : Codice dell'entità da visualizzare
Tipo
Multi record: Effettua una iterazione su tutte le entità AXTDFRMPARAM e posiziona ogni entità in cima (top) alla sequenza del contesto di dati poi esegue i token figli
Nessun dato
Non visualizzare nulla: Se l'entità AXTDFRMPARAM non esiste, il blocco ed i token 'figli' sono ignorati
Entità
AXTDFRMPARAM : Codice dell'entità da visualizzare
Riga per blocco
10: Visualizza 10 entità AXTDFRMPARAM al massimo nella pagina
Cella per riga
1: Visualizza una entità AXTDFRMPARAM per riga
Stile per riga
Nessuno: Stili da definire nel file 'my.css' per alternare il colore dello sfondo delle righe
Non è possibile definire i criteri di selezione sui blocchi che selezionano entità salvate in memoria del server XTEND, cioè di tipo sessione o Azione. Il blocco seleziona automaticamente tutte le entità.
I criteri di selezione si applicano solo alle entità di tipo 'Accesso dati'.
Si tratta di illustrare il caso di utilizzo dei blocchi condizionali.
Il token ACNDXTDFRMHIDE è utilizzato per modificare il contenuto della pagina in funzione della presenza o meno di un formulario.
Visualizzazione
Non contrassegnato: Indica che il contenuto del token (html e token figli) è nascosto se si verifica la condizione.
Tipo di criterio
Blocco vuoto: Indica che la condizione di vsualizza/nascondi è basata sul fatto che un blocco contenga o meno dei dati
Blocco
ABLKFRMHEAD: Codice del blocco da testare
Affinché i campi di inserimento siano visualizzati alla prima visualizzazione della pagina, anche se un formulario è stato precedentemente creato, è stata creata un'azione AXTDFRMRESET che cancella le entità formulario.
Questa azione è chiamata mediante il token link dinamico ADLKCONTACT che visualizza la pagina di creazione di un formulario a partire da un clic nel menù di sinistra.
Creare la pagina web AXTDFRMCREATE.
Pagina di défaut
Associare il file contact.html.
Il file deve essere presente sul server X3 e può essere selezionato mediante il tasto F12.
Protocollo
Https: Per indicare che bisogna criptare i dati della richiesta Http (Vedere configurazione HTTPS)
Blocco principale e blocco di sfondo
Nessuno
Accesso protetto
No: per indicare che questa pagina è in accesso libero (anonimo)
Avanzamento dell'attività
Si: affinché ogni visualizzazione della pagina sia registrata nel file di log
Dopo la modifica dei parametri X3 si consiglia di validare tutto il sito per mezzo della funzione per ricostruire il dizionario del server XTEND mediante la funzione 'Validazione sito Web(AYTFCYGEN)'.
Vericare attentamente che il sito XTEND sia pubblicato, ovvero che il campo 'Pubblica sito' della scheda 'Sito web' sia contrassegnato.
Inserimento del token 'link dinamico' ADLKCONTACT nel menù di sinistra per visualizzare la pagina e cancellare l'ultimo formulario creato.
<TD class="button"><A adx="ADLKCONTACT">Contattaci</A></TD>
Il token 'blocco condizionale' ACNDXTDFRMHIDE permette di visualizzare l'inserimento del form se non è stato trovato nessun formulario XTEND, altrimenti visualizza il contenuto del formulario.
<!adx="ACNDXTDFRMHIDE">
<!-- Visualizzazione del contenuto del formulario creato se il blocco ABLKFRMHEAD non è vuoto-->
<!adx="ACNDXTDFRMHIDE">
<!adx="ACNDXTDFRMHIDE:xNot">
<!-- Visualizzazione dell'inserimento del formulario se il blocco ABLKFRMHEAD è vuoto-->
<!-- Parametro xNot:Condizione inversa del token 'blocco condizionale'-->
<!adx="ACNDXTDFRMHIDE">
Creazione dei campi <input> con il token adx="NomeCampo".
Se non si specifica nessun attribut name in un tag <input> verrà generato automaticamente con il nome del token adx.
Il parametro xrc(<input adx="TokenName:xrc">) è utilizzato per rivisualizzare l'ultimo valore inserito in caso di errore di inserimento individuato dal server XTEND o dall'applicazione X3.
Permette di evitare la perdita dei dati inseriti.
<H1>Contattaci</H1>
<table>
<tr>
<td><b><b>Email:</b></td>
<td>
<input type="text" adx="MAICOD:xrc" size="50">
</td>
</tr>
<tr>
<td><b><b>Oggetto:</b></td>
<td>
<input type="text" adx="TTL:xrc" size="50">
</td>
</tr>
<tr>
<td><b>Messaggio:</b></td>
<td>
<textarea adx="CMT:xrc" rows="5" cols="75"></textarea>
</td>
</tr>
</table>
Creazione di coppie di campi <input> tipo Chiave/Valore che verranno 'mappati' su 2 colonne di un blocco riquadro o 2 parametri di dimensione N di un sotto-programma.
Il mapping delle coppie PARCOD/PARVAL con i parametri del web service è effettuato seguendo l'ordine di creazione dei campi nella pagina HTML.
<tr>
<td><b>Società:</b></td>
<td>
<input type="Text" adx="PARVAL:xrc" size="50">
<input type="hidden" name="PARCOD" value="Società">
</td>
</tr>
<tr>
<td><b>Attività:</b></td>
<td>
<select adx="PARVAL">
<option value="">Precisa:</option>
<option value="Artigiano" >Artigianp</option>
</select>
<input type="hidden" name="PARCOD" value="Attività">
</td>
</tr>
<tr>
<td><b>CAP:</b></td>
<td>
<input type="text" value="" adx="PARVAL:xrc" size="10">
<input type="hidden" name="PARCOD" value="CAP">
</td>
</tr>
Creazione di un input di tipo "button" con l'attributo adx che contiene il codice del link dinamico.
Tutti i bottoni <input type="button"> che contengono dei tokens adx devono essere button.
Il tipo submit non deve essere utilizzato.
<tr>
<td>
<input type="button" class="button" adx="ADLKXTDFRMCREATE" value="Crea">
</td>
</tr>
Un'azione utente è considerata come validata se la chiamata del web service non ha restituito nessun messaggio di errore.
I messaggi di errore sono postati in 4GL tramite il sotto programma ADDMESSERR (Call ADDMESSERR("Messaggio") From AWEB)
La visualizzazione dei messaggi X3 è effettuata mediante il token AXUSERMSG.
Es: <span id="userMsg" class="userMsg" adx="aMsgUser"></span>
Poiché i campi MAICOD e TTL sono stati definiti come campi web obbligatori, il controllo è effettuato automaticamente e non necessita di nessuna aggiunta di codice JavaScript.
I messaggi in caso di errore visualizzati sono AJSWEBFLDMANDAT (campo obbligatorio) e AJSWEBFLDBADVAL (errore di formato).
E' possibile aggiungere dei controlli in JavaScript sui parametri Web aggiungendo una funzione JavaScript di nome xtdWebParamCheckValue nella pagina HTML.
Se la libreria XTEND individua la presenza di questa funzione sarà chiamata insieme nel parametro:
Questa funzione restituisce true\false per validare\annullare l'inserimento.
Il messaggio AJSWEBFLDBADVAL è visualizzato in caso di errore di inserimento.
Nella pagina di esempio è stata aggiunta una funzione che controlla il formato dell'email.
<script type="application/x-javascript">
// This function is used to customized control on web parameters values
function xtdWebParamCheckValue(aWebParamOut,aInputFieldName,aInputFieldIndex,aInputFieldValue){
// Check input email value
if (aInputFieldName=="MAICOD"){
var wEmail=xtdCheckEmail(aInputFieldValue);
if (wEmail && wEmail!=aInputFieldValue)
aWebParamOut.setValue(aInputFieldIndex,wEmail);
return wEmail!=null;
}
return true;
}
</script>
La funzione xtdWebParamCheck permette di filtrare i campi da controllare.
Funziona seguendo lo stesso principio di xtdWebParamCheckValue.
var gNbChecked=0;
// Restituisce true se il parametro web aInputFieldName/aInputFieldIndex deve essere controllato
function xtdWebParamCheck(aWebParamsOut,aInputFieldName,aInputFieldIndex){
/*
Esempio per un elenco di picking con checkboxes (ASELECTED) per selezionare le righe.
Non si controlla il campo AQUANTITY se la riga non è stata selezionata'
*/
if (aInputFieldName=="AQUANTITY"){
// gNbChecked è un contatore delle righe selezionate
if (aInputFieldIndex==0) gNbChecked=0;
// Riga selezionata se il valore di ASELECTED è uguale a 1
if (aWebParamsOut.getParamValue("ASELECTED",aInputFieldIndex)=="1"){
gNbChecked++;
return true;
}
return false;
}
return true;
}
Il blocco ABLKFRMHEAD permette di posizionare il contesto di dati.
I campi sono visualizzati mediante un token adx posizionato in un tag HTML.
<table width="90%" border="0" cellspacing="2" cellpadding="4">
<!adx="ABLKFRMHEAD">
<tr>
<td><b>Email:</b></td>
<td adx="MAICOD"></td>
</tr>
<tr>
<td><b>Oggetto:</b></td>
<td adx="TTL"></td>
</tr>
<tr>
<td><b>Messaggio:</b></td>
<td><pre adx="CMT"></pre></td>
</tr>
<!adx="ABLKFRMHEAD">
</table>
Il blocco ABLKFRMPARAM permette di iterare sulle opzioni del formulario e di creare tante righe <tr> quante opzioni.
Per ogni opzione, XTEND posiziona un contesto di dati, il che permette di risolvere il valore dei tokens adx PARCOD e PARVAL posizionati nei tag HTML.
<!adx="ABLKFRMPARAM">
<tr>
<td><b adx="PARCOD"></b></td>
<td adx="PARVAL"></td>
</tr>
<!adx="ABLKFRMPARAM">
L'entry point pageDoMyDlk permette di aggiungere un programma su clic utente e di annullare il processo in corso se è restituito il valore false.
In questo caso si richiede una conferma prima di indirizzare il formulario al server XTEND.
//Asks user to confirm creation of a new form if user clicks on ADLKCONTACTNEW dynamic link
function pageDoMyDlk(aDomOut)
{
if (aDomOut.isDlk("ADLKCONTACTNEW"))
return confirm('Confermi la creazione del formulario\nConfirm creation');
return true;
}
L'entry point xtdWebParamCheckValue fa parte del meccanismo di controllo dei valori dei 'campi web' XTEND (parametri web delle azioni XTEND).
Se la funzione xtdWebParamCheckValue è definita nella pagina HTML, sarà chiamata mediante la libreria XTEND per ogni controllo di 'campo web'.
In questo caso si controlla il valore del campo MAICOD (email) mediante la funzione XTEND xtdCheckEmail.
//This function is used to customized control on web parameters values
function xtdWebParamCheckValue(aWebParamOut,aInputFieldName,aInputFieldIndex,aInputFieldValue){
// Check input email value
if (aInputFieldName=="MAICOD"){
var wEmail=xtdCheckEmail(aInputFieldValue);
if (wEmail && wEmail!=aInputFieldValue)
aWebParamOut.setValue(aInputFieldIndex,wEmail);
return wEmail!=null;
}
return true;
}