Debemos definir una colección con el diseño que queramos para el login. A esta colección hay que ponerle un atributo login-coll=“true” que es el provoca que dicha colección se convierta en “Pantalla de Login”.

Dentro del Nodo APP, en la colección que hemos definido login-coll=“true” se aplican las opciones de las conditions de las .css para diseñar. En caso de que no sean definidas, sale por defecto la pantalla Login XOne.

Los tipos de Login para APP XOne definidos son:


Tipos de Login
Auto Login
Login a Nivel de App
Login a Nivel de Coll


Auto Login

Para lograr que nuestra APP haga auto login debemos definir en el nodo APP, el atributo “autologon=true” y tiene que existir además en la tabla gen_usuarios de la APP, un usuario con login=admin y pass=null

<?xml version="1.0" encoding="iso-8859-15" standalone="yes"?>
<xml>   
    <app    
        prefix="gen"
        load-wait="false"
        version="16.02.2023.2030"
        sql-debug="true"
        debug="true"
        show-wait-dialog="false"
        default-language="javascript"   
        resolution-height="1280"
        resolution-width="720"
        companycolor="#FFFFFF"
        entry-point="Menu"
        use-honeywell-scanner-integration="true"
        orientation="portrait"
        autologon="true"   
        screen-orientation="portrait">
 
        <connection prefix="" name="Info_ReplicaFiles" connstring="Provider=Xone Remote Provider;Data Source=local;ProgID=com.xone.db.impl.replicafiles.RplFilesConnection;Timeout=60" />
        <connection name="json" datemask="ymd" connstring="Provider=Xone Remote Provider;Data Source=http://xoneisp.com/XOneJSONAllbyXOne/default.aspx;ProgID=com.xone.db.json.JSONConnection;Timeout=60;Security Level=0" />
        <connection name="ContentProviderConnection" connstring="Provider=Xone Remote Provider;Data Source=content://com.xone.android.framework.dataprovider;ProgID=cgscontent.provider;Debug=true" />
 
        <include file="dnie.js" language="javascript" encoding="UTF-8" />
        <include file="nfc.js" language="javascript" encoding="UTF-8" />
        <include file="funciones_chat.js" language="javascript" encoding="UTF-8" />
        <style url="basico_chat.css" encoding="UTF-8" />
        <style url="basico.css" encoding="UTF-8" />
 
 

Login a Nivel de App


Este método es el que tiene por defecto las App XOne, en este caso el atributo autologon=“false” en el nodo APP de la aplicación, aunque sino se detalla por defecto tiene ese valor.
Se crea una colección de Login donde se define acciones para comprobación de usuarios y contraseñas
Ejemplo:

<coll name="ContentLogin" title="Login" sql="select t1.ID     from ##PREF##usuarios t1" objname="usuarios" updateobj="" progid="ASData.CASBasicDataObj" special="true" filter="" sort="" login-coll="false" notab="true" bgcolor="#55000000">
      <group name="General" id="1">
        <prop name="ID" type="N" visible="0" />
        <frame name="mainFrame" width="100%" height="100%" align="center">
          <frame name="secondaryFrame" width="90%" height="50%" align="center|top" bgcolor="#0D406B,#0F4B7D,#0D406B">
            <prop name="MAP_LOGIN_IMG" type="IMG" width="20%" height="25%" labelwidth="0" path="##APP##\icons\logo.png" locked="true" bgcolor="#FF0000" lmargin="2%" tmargin="18%" />
            <frame name="propFrame" width="60%" height="50%" align="left|top" newline="false" lmargin="6%" tmargin="3%">
              <prop name="MAP_USERNAME_LABEL" type="TL" caption="Nombre de Usuario" class="loginProp" />
              <prop name="MAP_USERNAME" type="T" class="loginProp" />
              <prop name="MAP_PASSWORD_LABEL" type="TL" caption="Contraseña" class="loginProp" />
              <prop name="MAP_PASSWORD" type="X" class="loginProp" />
            </frame>
            <prop name="OK" type="B" title="Entrar" class="loginButton" method="ExecuteNode(entrar)" />
            <prop name="CANCEL" type="B" title="Salir" newline="false" lmargin="10%" class="loginButton" method="ExecuteNode(salir)" />
            <prop name="MAP_VERSION" type="TL" caption="Versión ##VERSION##" class="loginProp" align="center" tmargin="8%" fontsize="4" />
          </frame>
        </frame>
      </group>
      <entrar>
        <action name="runscript">
          <script language="javascript">
			var ObjB,st_erraut,CollB,CollC,ObjC;
			st_erraut="";
			var CollB = appData.getCollection("Usuarios");
			CollB.setFilter("LOGIN='" + self.MAP_USERNAME.toString() + "'");
			CollB.startBrowse();
			var ObjB = CollB.getCurrentItem();
			if( ObjB === null || ObjB == "undefined"){
				st_erraut = "Nombre de usuario o password incorrecto";
			}
			ObjB = null;
			CollB.endBrowse();
			CollB.clear();
			CollB = null;
			// Si todo OK, intentamos el logueo
			if( st_erraut == ""){
				self.setVariables("##LOGIN_USERCOLL##","Usuarios");
				self.setVariables("##LOGIN_NEWUSER##","LOGIN," + self.MAP_USERNAME);
				self.setVariables("##LOGIN_NEWPASS##","PWD," + self.MAP_PASSWORD);
				self.setVariables("##LOGIN_NEWNOUSERIN##",0);
				appData.failWithMessage(-11888,"##LOGIN_START##");
			}else{
				appData.failWithMessage(-8100,st_erraut);
			}
		</script>
        </action>
      </entrar>
      <salir>
        <action name="runscript">
          <script language="javascript">
  			appdata.failWithMessage(-11888,"##EXITAPP##");
		</script>
        </action>
      </salir>
    </coll>
 

Login a Nivel de Coll

Al definirse una colección con atributo login-coll=“true”, pasa a ser la colección de Logueo.

Ejemplo Fichero login.xml

<!-- Importante resaltar en esta colección el atributo login-coll="true" que es el que provoca que haya un login personalizado -->
 
<coll name="LogonColl" title="Entrada" login-coll="true" fontsize="8" progid="ASData.CASBasicDataObj" sql="SELECT * FROM ##PREF##usuarios t1" objname="usuarios" updateobj="usuarios" autorefresh="true" notab="true" disabled-buttonok="true" nostopreplica="true" filter="" sort="">
	<group name="Login" id="1" bgcolor="#FFFFFF" scrollbar="false" />
	<prop name="MAP_IMG" group="1" type="IMG" labelwidth="0" path="##APP##\icons\logo.png" locked="true" visible="7" />
	<prop name="MAP_USUARIO" title="Usuario:" labelwidth="7" lmargin="1" type="T" size="150" onchange="Refresh" fieldsize="9" visible="7" group="1" labelshadow="false" forecolor="#CC3333" bgcolor="#FFFFFF" labelbox="false" labelfont-bold="true" text-border="true" fontsize="10" text-bgcolor-disabled="#FFFFFF" />
	<prop name="MAP_PWD" title="Contraseña:" type="X" labelwidth="7" lmargin="1" size="150" onchange="Refresh" fieldsize="9" visible="7" group="1" labelshadow="false" forecolor="#CC3333" bgcolor="#FFFFFF" labelbox="false" labelfont-bold="true" text-border="true" fontsize="10" text-bgcolor-disabled="#FFFFFF" />
	<button name="BOTONCANCELAR" group="1" caption="Cancelar" visible="true" labelwidth="8" lmargin="4" tmargin="2" method="ExecuteNode (click-cancelar)" labelfont-bold="true" bgcolor="#FFFFFF" text-bgcolor-disabled="#FFFFFF" />
	<button name="BOTONOK" group="1" caption="Entrar" visible="true" labelwidth="8" newline="false" lmargin="4" tmargin="2" method="ExecuteNode (click-entrar)" labelfont-bold="true" bgcolor="#FFFFFF" text-bgcolor-disabled="#FFFFFF" />
	<prop name="MAP_TEXTO1" title="Si olvidó su contraseña, póngase" labelwidth="22" lmargin="1" tmargin="2" type="TL" size="150" onchange="Refresh" fieldsize="8" visible="7" group="1" labelshadow="false" forecolor="#000000" bgcolor="#FFFFFF" labelfont-bold="true" text-border="true" labelbox="false" fontsize="10" text-bgcolor-disabled="#FFFFFF" />
	<prop name="MAP_TEXTO2" title="en contacto con el teléfono:" labelwidth="22" lmargin="1" type="TL" size="150" onchange="Refresh" fieldsize="8" visible="7" group="1" labelshadow="false" forecolor="#000000" bgcolor="#FFFFFF" labelfont-bold="true" text-border="true" labelbox="false" fontsize="10" text-bgcolor-disabled="#FFFFFF" />
	<prop name="MAP_TLFCONTACTO" labelwidth="0" lmargin="1.5" type="T" size="150" fieldsize="8" visible="7" phone="true" group="1" locked="true" labelshadow="false" forecolor="#000000" bgcolor="#FFFFFF" labelbox="false" labelfont-bold="true" textfont-bold="true" text-border="false" fontsize="10" text-bgcolor-disabled="#FFFFFF">000000</prop>
	<!-- Campos NO visibles, los rellenaremos nosotros de valor -->
	<prop name="MAP_FECHACAD" type="D" size="150" fieldsize="8" visible="0" group="1" />
	<prop name="MAP_IDUSUARIO" type="N" size="150" fieldsize="8" visible="0" group="1" />
 
	<create>
		<action name="runscript">
			<script language="VBScript">
				This.("MAP_TLFCONTACTO")="924252525"
			</script>
		</action>
	</create>
 
	<click-entrar>
		<action name="runscript">
			<script language="VBScript">
				'Si se pulsa el boton Entrar, comprobamos nombre de usuario y password -->
				'La función login la definimos en el fichero codigo.vbs que hemos incluido en la coll Empresas
				login()
			</script>
		</action>
	</click-entrar>
 
	<click-cancelar>
		<action name="runscript">
			<script language="VBScript">
				'Si se pulsa el botón Cancelar, salimos de la aplicación -->
				appdata.failwithmessage -11888,"##EXITAPP##"
			</script>
		</action>
	</click-cancelar>
 
	<login-ok>
		<action name="runscript">
			<script language="VBScript">
				'Aqui podemos setear una variable de entorno, por ejemplo, en principio no hay que hacer nada.
			</script>
		</action>
	</login-ok>
 
	<login-fail>
		<action name="runscript">
			<script language="VBScript">
				appdata.failwithmessage -8100, "Nombre de usuario o password incorrecto"
			</script>
		</action>
	</login-fail>
 
</coll>



Se ha definido una nueva forma de hacer login en las aplicaciones XOne.

Dentro del objeto appData, encontramos los siguientes métodos relacionados con el login.

METODO DESCRIPCION
login(objeto) sirve para hacer login en la aplicación, es el sustituto del antiguo appData.failWithMessage(-11888,##LOGIN_START##”)


El objeto que se le pase debe tener la siguiente estructura:

{
	userName: /*usuario*/,
	password: /*contraseña*/,
	entryPoint: /*Colección entryPoint que se abrirá cuando el login sea correcto.*/,
	/*Opcional*/
	onLoginSuccessful: function() {
		/*Esto se llamara si el login ha sido correcto.*/
	},
	/*Opcional*/
	onLoginFailed: function() {
		/*Esto se llamara si el login no ha sido correcto.*/
	}
};


Ejemplo:

function doLogin() {
    var params = {
        userName: self.MAP_USER,
        password: self.MAP_PASSWORD,
        entryPoint: "MenuEntrada2",
        /* Opcional */
        onLoginSuccessful: function() {
            ui.showToast("Login OK!");
        },
        /* Opcional */
        onLoginFailed: function() {
            ui.showToast("Login failed!");
        }
    };
    appData.login(params);
}
logout Cierra sesión y vuelve a la pantalla de login
appData.logout();
exit Cierra la aplicación es el sustituto del antiguo appData.failWithMessage(-11888,## EXITAPP##”)
appData.exit();