Scripting serveur 

Introdução

O servidor XTEND dispõe de uma função de Scripting qui permet d'exécuter des scripts JavaScript sur le serveur para construir dinamicamente das páginas HTML da mesma maneira que um script PHP.

Nós recomendamos de utilizar o scripting quando o código HTML que se deseja gerar não pode estar tratado por inserção de tokens

Os scripts servidores podem estar também executados por requerimentos AJAX emitidos a partir do navegador.

Inserção do script

O script deve estar inserido na página HTML no interior de um tag <script> no local onde se deseja gerar o código HTML.

Para identificar um script server deve-se colocar um campo token no tag <script adx="MyTokenField"></script>.

O exemplo a seguir afixa uma página com o texto Texto gerado por um script serveur.

<html><body>
<script adx="TestScript1">
    print("<b>Texto gerado por um script servidor</b>");
</script>
</body></html>

Utilização de livrarias

O motor de scipting XTEND permite incluir as livrarias (ficheiro JavaScript) no código via a instrução #include 'pathLib'.

pathLib é o caminho de acesso do ficheiro livraria por relação ao directório raíz dos scripts servidor definido na ficha de parametrização do estabelecimento.

<script adx="TestScript2">
    #include 'libs\xtdWsvc.js''
</script>

Livraria entregue em standard

As livrarias de scripting estão disponíveis sob o diretório a seguir :

WebTools\TOOLS\XTEND\HTMRSRC\LIB\SCRIPTING
WebTools é o directório Tools de instalação do servidor X3WEB

xtdPrototype.js

Esta livraria é uma adaptação da livraria "prototype.js" versão 1.6.0.2 privada das funções de manipulação dos objetos gráficos (DOM)

Ela coloca à diposição do programador um conjunto de funções e classes muito úteis como a gestão de classes com herança, a gestão de quadro e HashMaps...

xtdWsvc.js

Propõe as funções utilitárias para chamada de web services XTEND e a manipulação dos dados JSON (parâmetros e resultado).

Para utilizar estas livrarias é suficiente de as copiar sob o directório dos scrcipts serveur do estabelecimento e de os incuir no código JavaScript via a instrução #include.

Programação

Construção do HTML

O princípio do scripting consiste a construir dinamicamente do texto HTML por execução de instruções JavaScript.

A função print() permite enviar o HTML versus o navegador.

Em realidade a função print permite preencher um buffer que será inserido, após execução do código, na página HTML no acondicionamento do script.

Acesso ao contexto do motor XTEND

O objeto de "scope" global XTD_CTX dá acesso ao contexto do motor XTEND através de um conjunto de métodos.

//Informações sobre a conta utilizador
public boolean userLogged();
public String userCode();
public String userProfile();
public String userLang();
//Renvoie un block
//Le token block doit être inséré dans la page pour le déclarer
//sans forcément ajouter de fils <!adx="monBlock"><!adx="monBlock">
public IXtdJsTokenBlock getTokenBlock(String aBlockId);
//Reenvia uma entidade Ação ou Sessão
public IXtdJsActEntity getActionEntity(String aId);
//Reenvia o url do servlet corrente em modo segurança (https) ou não
public String getServletUrl(boolean aSecured);
//Reenvoia o url completo para aceder a uma página
public String getPageUrl(String aPage);
//Reenvoie a url completa para executar uma ligação dinâmica em método GET
public String getDlkUrl(String aDynLink);
//Reenvia o tag <a href='' onclick='xtdDoDlk(..)'> associado à ligação dinâmica
//O tag </a> deve ser acrescentada em scripting
public String getDlkAnchor(String aDynLink,String aClass);
//Reenvia o tag input <input type='button' onclick='xtdDoDlk(..)'>
//associado à uma ligação dinâmica
public String getDlkButton(String aDynLink,String aValue,String aClass);
//Reenvia as funções JS gerados por Xtend para o tratamento das
//ligações dinâmicas
public String getDlkOnclick(String aDynLink, boolean aIsInputTag);
public String getDlkOnSubmit(String aDynLink);
//Permite a tomada em conta em Javascript dos tags input de tipo checkbox
//utilizados na ação
//Xtend gera um input escondido para as checkboxes não assinaladas
public void checkBoxAdd(String aInputName);
public void checkBoxAdd(String aInputName,String aUncheckedValue);

Exemplos:

Trata-se de um exemplo onde o sub-programa de LOGIN reenvia um campo "ESTABELECIMENTOS" que é guardado na sessão (informações da conta) e que contém uma lista de estabelecimentos autorizados para o utilizador.

A lista dos estabelecimemtos é reenviado sob a forma de uma query string de tipo Clé1=valeur&Clé2=valeur.

O script tem por objetivo de criar um tag select a partir dos dados do campo ESTABELECIMENTOS

Este género de operação não pode ser efetuada via um token e necessita o emprego de um script servidor.
Pode assim realizar a operação de descodificação via um script JavaScript mas não tem acesso ao contexto de dados da sessão XTEND.

Script

<div id="testscript">
<script adx="UserSites">
//Teste se o utilizador está assinado
if (XTD_CTX.userLogged())
{
    //Livraria utiliários
    #incluir 'libs\xtdWsvc.js'
   
    //Lê o campo ESTABELECIMENTOS que contém a query string
    //-> "site1=S1&site2=S2&site3=S3"
    var wQs=new String(XTD_CTX.getField("SITES"));
   
    //Analisa a String para criar um objecto JavaScript(ver prototype.js)
    //-> {site1:"S1",site2:"S2",site3:"S3"}
    var wObj=wQs.parseQuery();
   
    //Objeto utilitário para constituir o HTML que será inserido na página
    //-> Livraria xtdWsvc.js
    var wHtml=new XTENDWSVC.classHTMLBuffer();
    //A HTML é um tag seleto
  wHtml.select(["value","SITES","class","xtendInput"]);
   
    //Quadro dos valores (voir prototype.js)
    var wValues=Object.values(wObj);
    //Quadro das chaves (ver prototype.js)
    var wKeys=Object.keys(wObj);
    //Acréscimo das opções
    for (i=0;i<wKeys.length;i++)
        wHtml.option(wValues[i],wKeys[i]);
    wHtml.endSelect();
   
    //Escrita da resposta HTML
  print(wHtml.html());
</script>
</div>

Resultado

Resultado com por valor do campo ESTABELECIMENTOS
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>

Acesso aos blocos da pagina

A função XTD_CTX.getTokenBlock(BlockID) renvia uma interface IXtdJsTokenBlock que permite aceder aos métodos e propriedades de um token bloco inserido na página HTML.

O token block deve estar inserido na página para os declarar sem forçosamente acrescentar os filhos<!adx="BlockId"><!adx="BlockId">

Interface

public interface IXtdJsTokenBlock extends IXtdJsData
{
    // Reenviea um iterador sobre as linhas do bloco
    public IXtdJsDataIterator getLines();
}

A interface IXtdJsTokenBlock aponta sobre o bloco e permite de aceder aos campos do bloco.

A interface IXtdJsDataIterator permite efectuar uma iteração sobre as linhas de um bloco.

Exemplos:

<Html><body>
<!--Declaração do bloco-->
<!adx="MyBlock"><!adx="MyBlock">
<!--Afixação das linhas do bloco-->
<script adx="TestScript">
    var wBlock=XTD_CTX.getTokenBlock("MyBlock");
    var wLines=wBlock.getLines();
    print ("Nombre de page="+wBlock.getField("APAGENB")+"<br>");
    print ("Número de linhas="+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>

Acesso às entidades ação

A função XTD_CTX.getActionEntity(EntityID) reenvia uma interface IXtdJsActEntity que permite aceder aos métodos e propriedades da entidade.

Apenas as entidades de tipo sessão ou ação são acessíveis diretamente (sem passar por um token bloco) porque elas são guardadas na sessão utilizador (persistantes).

As entidades de tipo Acesso dados não são acessíveis diretamente mas apenas através de um token bloco.

Interface

public interface IXtdJsActEntity
{
    // Reenvia o código de entidade
    public String getCode();
    // Reenvoia um iterador sobre as entidades
    public IXtdJsDataIterator<IXtdJsActEntityData> getIterator();
    // Acrescenta uma entidade e reenvia a interface sobre esta entidade
    // --> Falta em seguida acrescentar os campos
 public IXtdJsActEntityData addData();
 // Suprime a entidade de identificador aId
    public IXtdJsActEntityData removeData(String aId);
    // Reenvia a entidade de identificador aId
    public IXtdJsActEntityData getData(String aId);
}
public interface IXtdJsActEntityData extends IXtdJsData
{
    //Dado de uma entidade que acrescenta o método getID
    //na interface standard IXtdJsData
    public String getId();  
}

A interface IXtdJsTokenBlock aponta sobre o bloco e permite de aceder aos campos do bloco.

A interface IXtdJsDataIterator permite efectuar uma iteração sobre as linhas de um bloco.

Exemplos:

<Html><body>
<!--Declaração do bloco-->
<!adx="MyBlock"><!adx="MyBlock">
<!--Afixação das linhas do bloco-->
<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>

Iteração sobre as linhas de um bloco ou entidades ação.

A interface IXtdJsDataIterator permite efectuar uma iteração sobre as linhas de um bloco ou entidades ação.

Interface

public interface IXtdJsDataIterator
{
    // Reenvia o número de dados
    public int size();
    // Verdade se o iterador contém os dados
    public boolean hasNext();
    // Reenvia o dado corrente e incrementa
    public IXtdJsData next();
    // Reenvia o iterador ao formato JSON
    public String toJSON();
}

Exemplos:

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>");
}

Iteração sobre as linhas de um bloco ou entidades ação.

Interface

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();
}

Acesso aos campos de uma linha de um bloco ou de uma entidade.

O interface IXtdJsData permite de aceder aos campos de um bloco ou de uma entidade.

Interface

public interface IXtdJsData
{
    // Suprime o campo aFieldName
    public void removeField(String aFieldName);
    // Valoriza o campo aFieldName com o aValue
    public void setField(String aFieldName, String aValue);
    // Reenvia o valor X3 do campo aFieldName
    public String getField(String aFieldName);
    // Reenvia o valor formatado do campo aFieldName
    public String getField(String aFieldName, boolean aFormated);
    // Reenvia o valor do campo aFieldName formatado com aFormat
    public String getField(String aFieldName, String aFormat);
    // Reenvia a "label" de um campo MenuLocal aFieldName
    public String getMenuLabel(String aFieldName);
    // Reenvoie o campo aFieldName ao formato JSON
    public String getFieldJSON(String aFieldName);
    // Reenvia o bloco de dados ao formato AJSON
    public String toJSON();
}

Exemplos:

    var wItems=XTD_CTX.getTokenBlock("BlkItems");
   print(wItems.getField("PRIX")+"<br>");    
   print(wItems.getField("PRIX",true)+"<br>");

Chamada de um web service

A interface IXtdJsWsvcCall permite chamar um web service X3 em scripting servidor

o web service deve estar previamente declarado como um interface XTEND.

Os métodos desta interface transmitem os dados JSON aos web services X3.

Os web serviices X3 aceitam os dois tipos de dados XML ou JSON para o parâmetro "data" mais o formato JSIN é muito mais fácil a manipular em Javascript que o formato XML porque corresponde à representação String dos objetos JavaScript (Objetos literais).

Interface de chamada

public interface IXtdJsWsvcCall
{
    /*------------ Parâmetros ------------*/
    // aInterface   : o código de interface a chamar
// aJSONData    : Dados JSON
// aFailOnX3Err : Verdade para gerar uma exceção se
    //                uma mensagem de erro está reenviada por X3
    /*------------ Sub-programa ------------*/
    // Reenvia os parâmetros standards PARCOD/PARVAL ara chamada de um sub-programa
    public String[][] callSpgGetAXPAR();
    // ------------------------------------------
    // Chamada de um web service sub-programa
    public IXtdAjaxResult callSpgRun(
            String aInterface,
            String aJSONData,
            boolean aFailOnX3Err
        ) throws Exception;
    /*------------ Objeto X3 ------------*/
    // Método Create
    public IXtdAjaxResult callObjCreate(
           String aInterface,
           String aJSONData,
           boolean aFailOnX3Err
        ) throws Exception;
    // ------------------------------------------
    // Méthode Read
    public IXtdAjaxResult callObjRead(
           String aInterface,
           String aQsKeys,
           boolean aFailOnX3Err
        )throws Exception;
    // ------------------------------------------
    // Método Update
    public IXtdAjaxResult callObjUpdate(
            String aInterface,
            String aQsKeys,
            String aJSONData,
            boolean aFailOnX3Err
        ) throws Excepção;
    // ------------------------------------------
    // Método Apagar
    public IXtdAjaxResult callObjDelete(
            String aInterface,
            String aQsKeys,
            boolean aFailOnX3Err
        )throws Exception;
    // ------------------------------------------
    // Outro método (aMethod) com uma chave como parâmetro
    public IXtdAjaxResult callObjActionKey(
            String aInterface,
            String aMethod,
            String aQsKeys,
            boolean aFailOnX3Err
        )throws Exception;
    // ------------------------------------------
    // Outro método (aMethod) com dados objeto XML como parâmetro
    public IXtdAjaxResult callObjActionData(
            String aInterface,
            String aMethod,
            String aJSONData,
            boolean aFailOnX3Err
        )throws Exceção;
    // ------------------------------------------
    //Chamada lista-esquerda
    public IXtdAjaxResult callObjQuery(
            String aInterface,
            String aQsKeys,
            boolean aFailOnX3Err
        )throws Exception;
    /*------------ Trace ------------*/
    // Rasto XTEND acessível via o navegador
    // Verdade se rasto ativado
    public boolean traceOn();
    // ------------------------------------------
    // Ínício de um bloco de rasto
    public void traceBeginStep(String aTrace);
    // ------------------------------------------
    // Rasto
    public void traceWrite(String aTrace);
    // ------------------------------------------
    // Fim de um bloco de rasto
    public void traceEndStep();
    /*------------ Diversos ------------*/
    // Reenvia a URL de acesso à web aplicação XTEND
    //
http://host:port/xtend - ouhttps://host:portssl/xtend
    public String getWebApplicationUrl(boolean aSecure);
}

Interface resultado

public interface IXtdAjaxResult
{
    // ------------------------------------------
    //Dados JSON reenviados pela web service
    public String getResponseBody();
    // ------------------------------------------
    //Comprimento dos dados JSON
    public int getResponseBodyLength();
    // ------------------------------------------
    //Verdade se mensagem X3
    public boolean hasMessage();
    // ------------------------------------------
    //Verdade se mensagem erro X3
    public boolean hasMsgErr();
    // ------------------------------------------
    //Verdade se mensagem warning X3
    public boolean hasMsgWarn();
    // ------------------------------------------
    //Verdade se mensagem informação X3
    public boolean hasMsgInfo();
    // ------------------------------------------
    //Lista das mensagens de erro X3
    public String[] getMsgErrLst();
    // ------------------------------------------
    //Lista das mensagens warning X3
    public String[] getMsgWarnLst();
    // ------------------------------------------
    //Lista das mensagens de informação X3
    public String[] getMsgInfoLst();
}

Livraria xtdWsvc.js

Esta livraria propõe os utilitários para manipular :

  • os parâmetros de chamada dos web services
  • o resultado JSON de chamada de um web service
  • o HTML gerado

Esta livraria utiliza a livraria xtdPrototype.js.

Gestão parãmetros e resultado

/*------------------ INCLUI-----------------------*/
//Sempre incluir a livraria xtdPrototype.js
#inclui "xtdPrototype.js"

/*------------------ OBJETOS JAVA/JAVASCRIPT -------------------*/
//Reenvia verdade se objeto aObj é um código de objecto JAVA
//Reenvia falso se é um objeto JavaScript
ObjetoxtdIsJava(aObj);
//-----------------------------------------------
//Permite converter um objecto Java ou de converter um objeto Java ou JavaScript en String
Object.xtdToString(aObj);

/*------------------ PARÂMETROS ------------------*/
//Reenvia os parãmetros para chamada de um web service
//Classe XTENDWSVC.classParam
//aOptionsJson sont les options JSON (Classe XTENDWSVC.classJsonOpt)
XTENDWSVC.newParam(aOptionsJson);
//-----------------------------------------------
//Reenvia os parãmetros para chamada de um web service OBJETO X3
//Classe XTENDWSVC.classParamObject
//->aTimeStampX3 est une String qui contient le TimeStamp de l'ojet X3
//->aTimeStampX3 ="" se não TimeStamp
XTENDWSVC.newParamXtdObject(aTimeStampX3,aOptionsJson);
//-----------------------------------------------
//Reenvia os parâmetros para a chamada de um web service Sub-Programa
//Classe XTENDWSVC.classParamXtdSpg
XTENDWSVC.newParamXtdSpg(aOptionsJson);
//-----------------------------------------------
//Reenvia os parãmetros para chamada de um web service Sub-Programa
//de tipo "Acesso dados" Acrescenta os parâmetros específicos
//Classe XTENDWSVC.classParamXtdSpgAccess
//->aNbLines é o nº de linhas a reenviar
//->aStartAt é a fila da linha de partida (paginação)
XTENDWSVC.newParamXtdSpgAccess(aNbLines,aStartAt,aOptionsJson);

/*------------------ RESULTADO ------------------*/
//Avalia a cadeia de caracteres aJSON resultado de um web service X3
//Reenvia um objeto JavaScript
XTENDWSVC.evalResult(aJSON);
//-----------------------------------------------
//Avalia o resultado de um sub-programa
//Acrescenta os métodos específico ao tipo de resultado
//Métodos XTENDWSVC.methodsResultSpg
XTENDWSVC.evalResultSpg(aJSON);
//-----------------------------------------------
//Avalia o resultado de um sub-programa "'Acesso dados"'
//Acrescenta os métodos especícfico ao tipo de resultado
//Métodos XTENDWSVC.methodsResultSpg
XTENDWSVC.evalResultSpgAccess(aJSON);
//-----------------------------------------------
//Avalia o resultado de um web service Objeto
//Acrescenta os métodos específico ao tipo de resultado
//Métodos XTENDWSVC.methodsResultObject
XTENDWSVC.evalResultObject(aJSON);

/*------------------ CLASSES PARÂMETRO -------------------*/
XTENDWSVC.classParam=Class.create({
    //Reenvia as opções JSON
    opções:function();
    //Acrescenta o parâmetro aCode com o valor aValue
 add:function(aCode,aValue);
});
//-----------------------------------------------
XTENDWSVC.classParamXtdSpg=Class.create(XTENDWSVC.classParam,{
    //Acrescenta um parâmetro aCode/aValue ao grupo AXPAR
    addAXPAR:function(aCode,aValue);   
});


/*------------------ OBJET RESULTAT -------------------*/
//Resultado chamada sub-programa
methodsResultSpg:{
    //Reenvia o valor String do parâmetro aCode do grupo AXPAR
    AXPAR:function(aCode);
    //Reenvia o valor Integer do parâmetro aCode do grupo AXPAR
    //aDefValue é o valor se parâmetro não encontrado
    AXPARInt:function(aCode,aDefValue);
}
//-----------------------------------------------
//Resultado chamada sub-programa de tipo "Acesso dados"
//Os métodos permitem gerar a paginação
methodsResultSpgAccess:{
    //Número de registos pedidos
    askedRecords:function();
    //Número de registos total
    totalRecords:function();
    //Número de registos reenviados
    returnedRecords:function();
    //Fila de partida
    startRank:function();
    //Verdade se existem registos seguintes
    hasNext:function();
}
//-----------------------------------------------
//Resultado chamada sub-programa de tipo "Objeto X3"
//Os métodos permitem aceder às informações de última modificação
methodsResultObject:{
    //Reenvia o valor do campo aField para o grupo ADXTEC
    adxADXTEC:function(aField);
    //Reenvia o TimeStamp
    adxTimeStamp:function();
    //Reenvia o último código utilizador X3 que foi modificado o objeto
  adxUser:function();
}

Opções JSON

XTENDWSVC.classJsonOpt=Class.create({
    //Sem grupos de publicação em retorno
    //Cada parâmetro é um quadro de String
  noGroups:function();
    //Sem linhas no quadro com dim>1
    //Cada parâmetro é um quadro de String
    noRows:function();   
    //Sem labels para os menus locais
 noLabels:function();
    //Os campos clob não são reenviados
 noClobs:function();
    //Exclui os grupos contidos na aValue
    //aValue é uma String ou Array de string
 excludeGrp:function(aValue);
    //Inclui os grupos contidos no aValue
    includeGrp:function(aValue);
    //Exclui os campos contidos em aValue
    //aValue é uma String ou Array de string
 excludeFld:function(aValue);
    //Inclui os campos contidos em aValue
 includeFld:function(aValue);
});

Exemplo:

// Opções JSON
var wJsonOpt=new XTENDWSVC.classJsonOpt().noRoups().noRows().excludeGrp(["GRP1","GRP2");

// Criação
n parâmetro chamada sub-programa
var wParams=XTENDWSVC.newParamXtdSpg();
wParams.add("AXUSERCODE",wInput.P1);
wParams.add("AXPWD",wInput.P2);
wParams.options().noGroups().includeGrp(["AXLOG_X3"]

Construção do HTML

A livraria inclui uma classe XTENDWSVC.classHTMLBuffer que permite construir uma resposta HTML a enviar versus o cliente.

Exemplo de chamada de um sub-programa

Este exemplo chamada interface AXTDLOGIN (sub-programa de login) :

  • cria os parãmetros
  • chama o sub-programa
  • trata o resultado
      • Afixa os erros
      • Afixa um quadro HTML com as informações de login X3 reenviados pelo sub-programa

GESAY_ADV_SCRIPTING_1.jpg

Trata-se de um exemplo sabendo que é muito mais simples no caso de utilizar os tokens.

#inclui 'libs\xtdWsvc.js'
function callXTDLogin(){
    //Parâmetros user/password 
    var wInput={P1:'dis001',P2:'adonix'};
    //Rasto ativado ?
    var wTraceOn=XTD_CTX.traceOn();
    if(wTraceOn){
    //Início de bloco de rasto dos parãmetros
        XTD_CTX.traceBeginStep("Build WSVC params");
        XTD_CTX.traceWrite("P1="+wInput.P1+ " - P2="+wInput.P2);
    }
    //Criação objeto parâmetro sub-programa
    var wParams=XTENDWSVC.newParamXtdSpg();
    //Valorização dos parâmetros
    //AXUSERCODE et APWD são os nomes dos parâmetros utilizados
    //para transmitir o user/password
    wParams.add("AXUSERCODE",wInput.P1);
    wParams.add("AXPWD",wInput.P2);
    //Acréscimo das opções JSON para chamada do sub-programa
    wParams.options().noGroups().includeGrp(["AXLOG_X3"]);
    // Parâmetros JSON passados ao web services (como os parâmetros XML)
    wParams=Object.toJSON(wParams);
    if(wTraceOn){
        //Fim do bloco de rasto dos parâmetros
        XTD_CTX.traceWrite(wParams);
        XTD_CTX.traceEndStep();
    }
    //Início do bloco de rasto de chamada
    if(wTraceOn)XTD_CTX.traceBeginStep("Call spg");
    //Chamada do sub-programa
    //->falso para tratar os erros X3 por programa
    var wResult=XTD_CTX.callSpgRun("AXTDLOGIN",wParams,false);
    if (wResult.hasMsgErr()){
        //Tratamento dos erros
        if(wTraceOn) XTD_CTX.traceWrite("Error message");
        var wLst=$A(wResult.getMsgErrLst());
        print("<span class='intUserMsg'>"+wLst.join('\n')+"</span>");
    }else{
        //Tratamento do resultado
        //Avaliação dos dados JSON
        var wJSON=XTENDWSVC.evalResultSpg(wResult.getResponseBody());
        //Rasto
        if(wTraceOn) XTD_CTX.traceWrite(Object.toJSON(wJSON));
        //Construção de resposta HTML
        //->Quadro dos códigos de acesso aos diferentes dossiers 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++)
                //Gestão dos estilos por linha alternada
                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();
    }
}

Chamada de um script via AJAX

O interface IXtdAjaxScriptContext está disponível via objeto XTD_CTX para os scripts que são chamados por pedidos AJAX.

Este interface permite :

  • de chamar os web services (interface IXtdJsWsvcCall)
  • de aceder ao contexto sessão
  • de ler o conteúdo (body) e parâmetros do pedido HTTP
  • de atualizar o ContentType do resultado

A instrução print escreve os dados num buffer caracteres que serão reenviados versus o cliente com o ContentType indicado por método setHttpContenType.

// Herança de interface de chamada aos web services IXtdJsWsvcCall
public interface IXtdAjaxScriptContext extends IXtdJsWsvcCall
{
    //Contenu {{body}} ao formato TEXTE do pedido HTTP
 public String getHttpBody();
    //Array JSON que contém o quadro dos parâmetros (chave/valor) do pedido
    //Útil se o formato está application/x-www-form-urlencoded
    public String getHttpParams();
    //Atualizar o ContentTYpe da resposta
    public void setHttpContenType(String aStr);
    // Login utilização
    public boolean userLogged();
  public String userCode();
    public String userProfile();
    public String userLang();
    // Acesso aos campos da sessão
  public Object getSessField(String aFieldName);
    public object getSessField(String aFieldName, boolean aFormated);
    public void setSessField(String aFieldName, String aValue);
    // Reenvia os dados utilizador
 public IXtdJsData getUserInfo();
    // Reenvia as variáveis utilizadores
    public IXtdJsData getUserVariables();
    // Reenvia uma entidade ação
    public IXtdJsActEntity getActionEntity(String aEntityCode, boolean aCreate);
    // Suprime uma entidade ação
    public void removeActionEntity(String aEntityCode);
    // Gestão das mensagens para resposta
    void addMsgErr(String aMsg);
    void addMsgWarn(String aMsg);
    void addMsgInfo(String aMsg);
}