<script adx='TestScript1'>
print(«<b>Tekst wygenerowany przez skrypt serwera</b>');
</script>
</body></html>
Mechanizm skryptowy XTEND służy do uwzględniania bibliotek (plik JavaScript) w kodzie poprzez wykonanie poniższej instrukcji #obejmuje 'pathLib'.
pathLib jest ścieżką dostępu do pliku biblioteki właściwego dla katalogu źródłowego skryptów serwera zdefiniowanych w rekordzie ustawień danej witryny.
<script adx='TestScript2'>
#obejmuje 'libs\xtdWsvc.js''
</script>
Bibliotek skryptowych znajdują sie w poniższym katalogu:
WebTools\TOOLS\XTEND\HTMRSRC\LIB\SCRIPTING
WebTools jest katalogiem instalacyjnym serwera X3WEB
xtdPrototype.js
Biblioteka ta jest zaadaptowaną biblioteką prototype.js w wersji 1.6.0.2 pozbawioną funkcji manipulacji obiektami graficznymi (DOM).
Programista ma do dyspozycji szeroki zakres bardzo przydatnych funkcji i klas, takich jak zarządzanie klasami z dziedziczeniem, zarządzanie tabelą, HashMapy...
xtdWsvc.js
Udostępnia funkcje narzędziowe dla wywoływania usług sieciowych XTEND oraz kontroli danych JSON (ustawienia i wyniki).
Aby skorzystać z tych bibliotek użytkownik musi skopiować je z katalogu skryptów serwera witryny i dołączyć do kodu JavaScript, zgodnie z poniższą instrukcją: #obejmuje.
Zasada pracy ze skryptami polega na budowaniu dynamicznego tekstu HTML poprzez wykonywanie instrukcji JavaScript.
Funkcja print() służy do wysyłania HTML do przeglądarki.
W rzeczywistości, funkcja print służy do wypełniania bufora tekstu, jaki zostanie wstawiony po wykonaniu kodu, na stronę HTML, w miejscu skryptu.
Obiekt o globalnym zasięgu, XTD_CTX umożliwia dostęp do mechanizmu XTEND za pomocą całego zakresu metod.
//Informacja na temat konta użytkownika
public boolean userLogged();
public String userCode();
public String userProfile();
public String userLang();
//Zwraca sekcję
//Token sekcji powinien być umieszczony na stronie, w celu jego zadeklarowania
//bez dodawania podrzędnych <!adx='monBlock'><!adx='monBlock'>
public IXtdJsTokenBlock getTokenBlock(String aBlockId);
//Zwraca jednostkę Czynności lub Sesji
public IXtdJsActEntity getActionEntity(String aId);
//Odsyła adres URL bieżącego serweltu w trybie zabezpieczonym (https) i niezabezpieczonym
public String getServletUrl(boolean aSecured);
//Zwraca pełny adres URL w celu umożliwienia dostępu do strony
public String getPageUrl(String aPage);
//Zwraca pełny adres URL w celu wykonania dynamicznego łącza w metodzie GET
public String getDlkUrl(String aDynLink);
//Zwraca znacznik <a href='' onclick='xtdDoDlk(..)»> powiązany z łączem dynamicznym
//Przy tworzeniu skryptu należy dodać znacznik </a>
public String getDlkAnchor(String aDynLink,String aClass);
//Zwraca znacznik wejściowy <input type='button' onclick='xtdDoDlk(..)'>
//powiązany z łączem dynamicznym
public String getDlkButton(String aDynLink,String aValue,String aClass);
//Zwraca JS functionjs wygenerowane przez Xtend w ramach zarządzania
//łączami dynamicznymi
public String getDlkOnclick(String aDynLink, boolean aIsInputTag);
public String getDlkOnSubmit(String aDynLink);
//Służy do uwzględniania skryptu Javascript tagów wejściowych takich jak pole wyboru (checkbox)
//wykorzystanych w wykonywaniu czynności
//Xtend wygenerował ukryte dane wejściowe dla niezaznaczonych pól wyboru
public void checkBoxAdd(String aInputName);
public void checkBoxAdd(String aInputName,String aUncheckedValue);
Poniższy przykład pokazuje, w jaki sposób podprogram LOGIN zwraca pole „SITES”, zapisany w sesji (informacje na temat konta oraz lista witryn autoryzowanych dla użytkownika.
Lista witryn zwracana jest jako ciąg zapytania, taki jak Key1=value&Key2=value.
Skrypt ma na celu wygenerowanie znacznika wyboru z danych pola SITES.
Ten rodzaj operacji nie może zostać przeprowadzony za pomocą tokena. Konieczne jest wygenerowanie skryptu serwera.
Operacje odkodowania można przeprowadzić również poprzez skrypt JavaScript klienta, nie ma jednak dostępu do kontekstu danych sesji XTEND.
Skrypt
<div id='testscript'>
<script adx='UserSites'>
//Sprawdza, czy użytkownik jest podpisany
if (XTD_CTX.userLogged())
{
//Biblioteka narzędzi
#obejmuje 'libs\xtdWsvc.js'
//Odczytuje pole SITES, zwierające ciąg zapytania
//-> 'site1=S1&site2=S2&site3=S3'
var wQs=new String(XTD_CTX.getField('SITES'));
//Parsuje Ciąg w celu wygenerowania obiektu JavaScript (patrz: prototype.js)
//-> {site1:'S1',site2:'S2',site3:'S3'}
var wObj=wQs.parseQuery();
//Obiekt narzędziowy do generowania HTML, jaki ma zostać umieszczony na stronie
//-> Biblioteka xtdWsvc.js
var wHtml=new XTENDWSVC.classHTMLBuffer();
//HTML jest znacznikiem wyboru
wHtml.select(['value','SITES','class','xtendInput']);
//Tabela wartości (patrz: prototype.js)
var wValues=Object.values(wObj);
//Tabela kluczy (patrz: prototype.js)
var wKeys=Object.keys(wObj);
//Dodanie opcji
for (i=0;i<wKeys.length;i++)
wHtml.option(wValues[i],wKeys[i]);
wHtml.endSelect();
//Zapisywanie odpowiedzi HTML
print(wHtml.html());
</script>
</div>
Wynik
Wynik z następującą wartością pola SITES:
Site Grenoble=FCYGRE&Site Paris=FCYPAR&Site Lyon=FCYLY&Site Rouen=FCYROU
<div id='testscript'>
<select class='xtendInput' value='SITES'>
<option value='FCYGRE'>Site Grenoble</option>
<option value='FCYLY'>Site Lyon</option>
<option value='FCYROU'>Site Rouen</option>
<option value='FCYPAR'>Site Paris</option>
</select>
</div>
Funkcja XTD_CTX.getTokenBlock(BlockID) zwraca interfejs IXtdJsTokenBlock służący do dostępu do metod i właściwości tokena sekcji umieszczonego na stronie HTML.
Token sekcji powinien być umieszczony na stronie, w celu jego zadeklarowania, bez konieczności dodawania podrzędnych <!adx='BlockId'><!adx='BlockId'>
public interface IXtdJsTokenBlock extends IXtdJsData
{
// Zwraca iterator wierszy sekcji
public IXtdJsDataIterator getLines();
}
Interfejs IXtdJsTokenBlock wskazuje sekcję i jest stosowany do dostępu do pól sekcji.
Interfejs IXtdJsDataIterator jest stosowany to wykonywania iteracji na wierszach sekcji.
<Html><body>
<!--Déclaration du bloc-->
<!adx='MyBlock'><!adx='MyBlock'>
<!--Affichage des lignes du bloc-->
<script adx='TestScript'>
var wBlock=XTD_CTX.getTokenBlock('MyBlock');
var wLines=wBlock.getLines();
print ('Nombre de page='+wBlock.getField('APAGENB')+'<br>');
print ('Nombre de lignes='+wBlock.getField('ABLKNBLINES')+'<br>');
while(wLines.hasNext()){
var wLine=wLines.next();
print('<tr>');
print('<td>'+wLine.getField('PRIX')+'</td>');
print('<td>'+wLine.getField('STOCK')+'</td>');
print('</tr>');
}
</script>
</body></html>
Funkcja XTD_CTX.getActionEntity(EntityID) zwraca interfejs IXtdJsActEntity służący do dostępu do metod i właściwości jednostki.
Bezpośredni dostęp (bez pośrednictwa tokena sekcji) jest możliwy wyłącznie do takich jednostek, jak sesje lub akcje, ponieważ są one zapisywane w sesji użytkownika (trwałej).
Dostęp do jednostek dostępu do danych jest możliwy wyłącznie przez token sekcji.
public interface IXtdJsActEntity
{
// Zwraca kod jednostki
public String getCode();
// Zwraca iterator jednostek
public IXtdJsDataIterator<IXtdJsActEntityData> getIterator();
// Dodaje jednostkę i zwraca interfejs danej jednostki
// --> W związku z tym, wymagane jest dodanie pól
public IXtdJsActEntityData addData();
// Usuwa jednostkę identyfikującą aId
public IXtdJsActEntityData removeData(String aId);
// Zwraca jednostkę identyfikującą aId
public IXtdJsActEntityData getData(String aId);
}
public interface IXtdJsActEntityData extends IXtdJsData
{
// Dane z jednostki, która dodaje metodę getID
//do standardowego interfejsu IXtdJsData
public String getId();
}
Interfejs IXtdJsTokenBlock wskazuje sekcję i jest stosowany do dostępu do pól sekcji.
Interfejs IXtdJsDataIterator jest stosowany to wykonywania iteracji na wierszach sekcji.
<Html><body>
<!--Déclaration du bloc-->
<!adx='MyBlock'><!adx='MyBlock'>
<!--Affichage des lignes du bloc-->
<script adx='TestScript'>
var wEntities=XTD_CTX.getActionEntity('XTDLOGINV');
var wIterator=wEntities.getIterator();
print('size="'+wIterator.size()" + ' - Code='+ wEntities.getCode());
print('<table><br>');
while(wIterator.hasNext()){
var wLine=wIterator.next();
print('<tr>');
print('<td>'+wLine.getId()+'</td>');
print('<td>'+wLine.getField('INVADR1')+'</td>');
print('<td>'+wLine.getField('INVCITY')+'</td>');
print('</tr>');
}
print('</table>');
</script>
</body></html>
Interfejs IXtdJsDataIterator jest stosowany do wykonywania iteracji na wierszach sekcji lub jednostkach czynności.
public IXtdJsDataIterator
{
// Zwraca liczbę danych
public int size();
// Prawda, jeżeli iterator zawiera dane
public boolean hasNext();
// Zwraca bieżące dane i przyrost
public IXtdJsData next();
// Zwraca iterator w formacie JSON
public String toJSON();
}
var wEntities=XTD_CTX.getActionEntity('XTDLOGINV');
var wIterator=wEntities.getIterator();
while(wIterator.hasNext()){
var wLine=wIterator.next();
print('<tr>');
print('<td>'+wLine.getId()+'</td>');
print('<td>'+wLine.getField('INVADR1')+'</td>');
print('</tr>');
}
public interface IXtdJsDataIterator<ClassData extends IXtdJsData>
{
public boolean hasNext();
public ClassData next();
public String toJSON();
}
public interface IXtdJsData
{
public void removeField(String aFieldName);
public void setField(String aFieldName, String aValue);
public String getField(String aFieldName);
public String getField(String aFieldName, boolean aFormated);
public String getField(String aFieldName, String aFormat);
public String getMenuLabel(String aFieldName);
public String getFieldJSON(String aFieldName);
public String toJSON();
}
public interface IXtdJsTokenBlock extends IXtdJsData
{
public IXtdJsDataIterator getLines();
}
Interfejs IXtdJsData służy do dostępu do pól sekcji lub jednostki.
public interface IXtdJsData
{
// Usuwa pole aFieldName
public void removeField(String aFieldName);
// Nadaje warość aValue polu FieldName
public void setField(String aFieldName, String aValue);
// Zwraca wartość X3 pola aFieldName
public String getField(String aFieldName);
// Zwraca sformatowaną wartość pola aFieldName
public String getField(String aFieldName, boolean aFormated);
// Zwraca wartość pola aFieldName w formacie aFormat
public String getField(String aFieldName, String aFormat);
// Zwraca opis pola MenuLocal aFieldName
public String getMenuLabel(String aFieldName);
// Zwraca pole aFieldName w formacie JSON
public String getFieldJSON(String aFieldName);
// Zwraca sekcję danych w formacie AJSON
public String toJSON();
}
var wItems=XTD_CTX.getTokenBlock('BlkItems');
print(wItems.getField('PRIX')+'<br>');
print(wItems.getField('PRIX',true)+'<br>');
Interfejs IXtdJsWsvcCall jest wykorzystywany do wywoływania usług sieciowych X3 podczas wykonywania skryptów serwera.
Usługa sieciowa musi zostać wcześniej zadeklarowana jako interfejs XTEND.
Metody tego interfejsu przesyłają dane JSON do usług sieciowych X3.
Usługi sieciowe X3 akceptują w ustawieniach „data” dwa rodzaje danych, XML i JSON, przy czym format JSON jest kontrolowane przez JavaScript łatwiej niż format XML, ponieważ odpowiadają one reprezentacji objektów JavaScript w formie ciągu (obiekt literalny).
public interface IXtdJsWsvcCall
{
/*------------ Ustawienia ------------*/
// aInterface : kod interfejsu do wywołania
// aJSONData : JSON data
// aFailOnX3Err : Prawdziwe dla wygenerowania wyjątku jeżeli
// X3 zwrócił komunikat o błędzie
/*------------ Podprogram ------------*/
// Zwraca standardowe ustawienia PARCOD/PARVAL w celu wywołania podprogramu
public String[][] callSpgGetAXPAR();
// ------------------------------------------
// Wywołanie podprogramu usługi sieciowej
public IXtdAjaxResult callSpgRun(
String aInterface,
String aJSONData,
boolean aFailOnX3Err
) throws Exception;
/*------------ obiekt X3 ------------*/
// Tworzenie metody
public IXtdAjaxResult callObjCreate(
String aInterface,
String aJSONData,
boolean aFailOnX3Err
) throws Exception;
// ------------------------------------------
// Odczyt metody
public IXtdAjaxResult callObjRead(
String aInterface,
String aQsKeys,
boolean aFailOnX3Err
)throws Exception;
// ------------------------------------------
// Aktualizacja metody
public IXtdAjaxResult callObjUpdate(
String aInterface,
String aQsKeys,
String aJSONData,
boolean aFailOnX3Err
) throws Exception;
// ------------------------------------------
// Usunięcie metody
public IXtdAjaxResult callObjDelete(
String aInterface,
String aQsKeys,
boolean aFailOnX3Err
)throws Exception;
// ------------------------------------------
//Inna metoda (aMethod) z kluczem jako ustawienia
public IXtdAjaxResult callObjActionKey(
String aInterface,
String aMethod,
String aQsKeys,
boolean aFailOnX3Err
)throws Exception;
// ------------------------------------------
//Inna metoda (aMethod) z obiektem XML jako ustawienia
public IXtdAjaxResult callObjActionData(
String aInterface,
String aMethod,
String aJSONData,
boolean aFailOnX3Err
)throws Exception;
// ------------------------------------------
//Wywołanie lewej listy
public IXtdAjaxResult callObjQuery(
String aInterface,
String aQsKeys,
boolean aFailOnX3Err
)throws Exception;
/*------------ Ślad ------------*/
// Dostęp do logu serwera XTEND jest możliwy przez przeglądarkę
// True si trace activée
public boolean traceOn();
// ------------------------------------------
// Początek sekcji logu
public void traceBeginStep(String aTrace);
// ------------------------------------------
// Ślad
public void traceWrite(String aTrace);
// ------------------------------------------
// Koniec sekcji logu
public void traceEndStep();
/*------------ Divers ------------*/
// Zwraca adres URL dostępu do aplikacji siecowej XTEND
//http://host:port/xtend - lubhttps://host:portssl/xtend
public String getWebApplicationUrl(boolean aSecure);
}
public interface IXtdAjaxResult
{
// ------------------------------------------
//dane JSON zwrócone przez usługę sieciową
public String getResponseBody();
// ------------------------------------------
//długość danych JSON
public int getResponseBodyLength();
// ------------------------------------------
//Prawdziwe jeżeli komunikat X3
public boolean hasMessage();
// ------------------------------------------
//Prawdziwe jeżeli komunikat X3 o błędzie
public boolean hasMsgErr();
// ------------------------------------------
//Prawdziwe jeżeli komunikat X3 o ostrzeżeniu
public boolean hasMsgWarn();
// ------------------------------------------
//Prawdziwe jeżeli informacyjny komunikat X3
public boolean hasMsgInfo();
// ------------------------------------------
//Lista komunikatów o błędach X3
public String[] getMsgErrLst();
// ------------------------------------------
//Lista komunikatów o ostrzeżeniach X3
public String[] getMsgWarnLst();
// ------------------------------------------
//Lista komunikatów informacyjnych X3
public String[] getMsgInfoLst();
}
Biblioteka ta zawiera narzędzia do kontroli:
Biblioteka ta wykorzystuje następującą bibliotekę: xtdPrototype.js.
/*------------ UWZGLĘDNIANIE ------------*/
//Uwzględniaj zawsze bibliotekę xtdPrototype.js
#obejmuje 'xtdPrototype.js'
/*------------------ OBIEKTY JAVA/JAVASCRIPT -------------------*/
//Zwraca prawdę, jeżeli obiekt aObj jest obiektem JAVA
//Zwraca fałsz, jeżeli jest obiektem JavaScript
.xtdIsJava(aObj);
//-----------------------------------------------
//Służy do konwersji obiektu Java lub JavaScript w obiekt ciągu
.xtdToString(aObj);
/*------------------ USTAWIENIA ------------------*/
//Zwraca ustawienia wywołania usługi sieciowej
//Klasa XTENDWSVC.classParamXtdSpg
//aOptionsJson są opcjami JSON (Klasa XTENDWSVC.classJsonOpt)
XTENDWSVC.newParam(aOptionsJson);
//-----------------------------------------------
//Zwraca ustawienia wywołania usługi sieciowej X3 OBJECT
//Klasa XTENDWSVC.classParamObject
//->aTimeStampX3 jest ciągiem zawierającym TimeStamp obiektu X3
//->aTimeStampX3 ='' jeżeli brak TimeStamp
XTENDWSVC.newParamXtdObject(aTimeStampX3,aOptionsJson);
//-----------------------------------------------
//Zwraca ustawienia wywołania usługi sieciowej Podprogramu
//Klasa XTENDWSVC.classParamXtdSpg
XTENDWSVC.newParamXtdSpg(aOptionsJson);
//-----------------------------------------------
//Zwraca ustawienia wywołania usługi sieciowej podprogramu
//typu „Data access” wybranych ustawień Add
//Klasa XTENDWSVC.classParamXtdSpgAccess
//->aNbLines jest liczbą wierszy, jakie mają zostać odesłane
//->aStartAt jest klasyfikacją pierwszego wiersza (stronicowanie)
XTENDWSVC.newParamXtdSpgAccess(aNbLines,aStartAt,aOptionsJson);
/*------------------ WYNIK ------------------*/
//Ocenia łańcuch znaków aJSON wyniku usługi sieciowej X3
//Zwraca obiekt JavaScript
XTENDWSVC.evalResult(aJSON);
//-----------------------------------------------
//Ocenia wynik podprogramu
//Dodaje wybrane metody dla danego typu wyniku
//Metody XTENDWSVC.methodsResultSpg
XTENDWSVC.evalResultSpg(aJSON);
//-----------------------------------------------
//Ocenia wynik podprogramu „Data access”
//Dodaje wybrane metody do danego typu wyniku
//Metody XTENDWSVC.methodsResultSpg
XTENDWSVC.evalResultSpgAccess(aJSON);
//-----------------------------------------------
//Ocenia wynik usługi sieciowej Obiektu
//Dodaje wybrane metody do danego typu wyniku
//Metody XTENDWSVC.methodsResultObject
XTENDWSVC.evalResultObject(aJSON);
/*------------------ KLASY USTAWIEŃ -------------------*/
XTENDWSVC.classParam=Class.create({
//Zwraca opcje JSON
options:function();
//Dodaje ustawienia aCode z wartością aValue
add:function(aCode,aValue);
});
//-----------------------------------------------
XTENDWSVC.classParamXtdSpg=Class.create(XTENDWSVC.classParam,{
//Dodaje ustawienia aCode/aValue do grupy AXPAR
addAXPAR:function(aCode,aValue);
});
/*------------------ OBIEKT WYNIKU-------------------*/
//Wynik wywołania podprogramu
methodsResultSpg:{
//Zwraca wartość Ciągu ustawień aCode grupy AXPAR
AXPAR:function(aCode);
//Zwraca wartość, w liczbach całkowitych, ustawień aCode grupy AXPAR
//w przypadku nieodnalezienia ustawień wartością tą jest aDefValue
AXPARInt:function(aCode,aDefValue);
}
//-----------------------------------------------
//Wynik wywołania podprogramu takiego jak, np. „Data access”
//Metody służące do stronicowania
methodsResultSpgAccess:{
//Liczba żądanych rekordów
askedRecords:function();
//Łączna liczba rekordów
totalRecords:function();
//Liczba zwróconych rekordów
returnedRecords:function();
//Rang de départ
startRank:function();
//Prawda, jeżeli istnieją poniższe wpisy
hasNext:function();
}
//-----------------------------------------------
//Wynik podprogramu, takiego jak, np. „Object X3”
//Metody służące do uzyskania dostępu do informacji z ostatniej modyfikacji
methodsResultObject:{
//Zwraca wartość pola aField dla grupy ADXTEC
adxADXTEC:function(aField);
//Renvoie le TimeStamp
adxTimeStamp:function();
//Zwraca kod ostatniego użytkownika X3, który modyfikował obiekt
adxUser:function();
}
XTENDWSVC.classJsonOpt=Class.create({
//Brak grupy publikacji w zwrocie
//Każde ustawienie jest tabelą ciągów
noGroups:function();
//Bez wierszy w tabeli o wymiarze>1
//Każde ustawienie jest tabelą ciągów
noRows:function();
//Lokalne menu nie zawierają etykiet
noLabels:function();
//Pola clob nie są odsyłane
noClobs:function();
//Wyłącza grupy zawarte w aValue
//aValue jest Ciągiem lub Tablicą ciągu
excludeGrp:function(aValue);
//Włącza grupy zawarte w aValue
includeGrp:function(aValue);
//Wyłącza pola zawarte w aValue
//aValue jest Ciągiem lub Tablicą ciągu
excludeFld:function(aValue);
//Włącza pola zawarte w aValue
includeFld:function(aValue);
});
Na przykład:
//Opcje JSON
var wJsonOpt=new XTENDWSVC.classJsonOpt().noRoups().noRows().excludeGrp(['GRP1','GRP2');
//Generowanieustawień wywołania podprogramu
var wParams=XTENDWSVC.newParamXtdSpg();
wParams.add('AXUSERCODE',wInput.P1);
wParams.add('AXPWD',wInput.P2);
wParams.options().noGroups().includeGrp(['AXLOG_X3']
Biblioteka zawiera klasę XTENDWSVC.classHTMLBuffer wykorzystywaną w generowaniu odpowiedzi HTML, jaka ma zostać przesłana do klienta.
Przykład wywołania podprogramu
W przykładzie tym przedstawiono wywołanie interfejsu AXTDLOGIN (podprogram do logowania)
Jest to przykładowa sytuacja, należy jednak pamiętać, że w takim wypadku o wiele łatwiej jest posłużyć się tokenem.
#obejmuje 'libs\xtdWsvc.js'
function callXTDLogin(){
//Ustawienia użytkownika/hasła
var wInput={P1:'dis001',P2:'adonix'};
//aktywowany log?
var wTraceOn=XTD_CTX.traceOn();
if(wTraceOn){
//Początek ustawień sekcji plika log
XTD_CTX.traceBeginStep('Build WSVC params');
XTD_CTX.traceWrite('P1='+wInput.P1+ ' - P2='+wInput.P2);
}
//Utworzenie ustawień obiektu podprogramu
var wParams=XTENDWSVC.newParamXtdSpg();
//Nadanie wartości ustawieniom
//AXUSERCODE i APWD są nazwami użytych ustawień
//przesyłania użytkownika/hasła
wParams.add('AXUSERCODE',wInput.P1);
wParams.add('AXPWD',wInput.P2);
//Dodanie opcji JSON do wywołania podprogramu
wParams.options().noGroups().includeGrp(['AXLOG_X3']);
// ustawienia JSON przekazane usłudze sieciowej (tak jak w ustawieniach XML)
wParams=Object.toJSON(wParams);
if(wTraceOn){
//Koniec sekcji plika log ustawień
XTD_CTX.traceWrite(wParams);
XTD_CTX.traceEndStep();
}
//Początek sekcji logu wywołania
if(wTraceOn)XTD_CTX.traceBeginStep('Call spg');
//Wywołanie podprogramu
//->fałsz dla przetwarzania błędów X3 przez program
var wResult=XTD_CTX.callSpgRun('AXTDLOGIN',wParams,false);
if (wResult.hasMsgErr()){
//Błędy procesu
if(wTraceOn) XTD_CTX.traceWrite('Error message');
var wLst=$A(wResult.getMsgErrLst());
print('<span class='intUserMsg'>'+wLst.join('\n')+'</span>');
}else{
//Wynik procesu
//Ocena danych JSON
var wJSON=XTENDWSVC.evalResultSpg(wResult.getResponseBody());
//Log
if(wTraceOn) XTD_CTX.traceWrite(Object.toJSON(wJSON));
//Generowanie odpowiedzi HTML
//->Tabela kodów dostępu do różnych folderów X3
var wHtml=new XTENDWSVC.classHTMLBuffer;
wHtml.table(['border','0','class','intLine']);
wHtml.trFill(['SolutionX3','DossierX3','LangX3','UserX3'],
['class','intRowTitle']);
if (wJSON.AX3SOL){
var wLen=wJSON.AX3SOL.length;
for(var i=0;i<wLen;i++)
//Zarządzanie stylami dla następujących po sobie
wHtml.trFill([wJSON.AX3SOL[i], wJSON.AX3FLDR[i], wJSON.AX3LANG[i],
wJSON.AX3USER[i]],['class',i%2==0?'intEvenLine':'intOddLine']);
wHtml.endTable();
}
print(wHtml.html());
}
if(wTraceOn) XTD_CTX.traceEndStep();
}
}
Interfejs IXtdAjaxScriptContext dostępny jest poprzez obiekty XTD_CTX wywołane zapytaniem AJAX.
Interfejs ten wykorzystywany jest do:
Instrukcja print zapisuje dane w buforze znaków, który zostanie zwrócony do klienta z ContentType określonym przez metodę setHttpContenType .
// Dziedziczy interfejs wywołania usługi sieciowej IXtdJsWsvcCall
public interface IXtdAjaxScriptContext extends IXtdJsWsvcCall
{
//Treść {{body}} w formacie TEXT zapytania HTTP
public String getHttpBody();
//Tablica JSON zawierająca tabelę (klucz/wartość) zapytania
//Przydatne, gdy formatem jest application/x-www-form-urlencoded
public String getHttpParams();
//Aktualizuje ContentTYpe odpowiedzi
public void setHttpContenType(String aStr);
// Login użytkownika
public boolean userLogged();
public String userCode();
public String userProfile();
public String userLang();
// Pola sesji dostępu
public Object getSessField(String aFieldName);
public Object getSessField(String aFieldName, boolean aFormated);
public void setSessField(String aFieldName, String aValue);
// Zwraca dane użytkownika
public IXtdJsData getUserInfo();
// Zwraca zmienne użytkownika
public IXtdJsData getUserVariables();
// Zwraca jednostkę czynności
public IXtdJsActEntity getActionEntity(String aEntityCode, boolean aCreate);
// Usuwa jednostkę czynności
public void removeActionEntity(String aEntityCode);
// Zarządzanie komunikatami odpowiedzi
void addMsgErr(String aMsg);
void addMsgWarn(String aMsg);
void addMsgInfo(String aMsg);
}