Control del flujo mediante condiciones

Las condiciones se pueden utilizar para controlar el flujo de un usuario a través de un script IEG. La progresión de un usuario a través de un script IEG seguirá un camino lineal de una página a otra dentro del script a menos que el autor del script decida cambiar dicho flujo. La razón principal por la que se cambia este flujo es garantizar que a los usuarios no se les planteen preguntas innecesarias o irrelevantes. Las respuestas de un usuario deben utilizarse para determinar qué preguntas están o no relacionadas con dicho usuario. Por ejemplo, se puede tener una página que capture información detallada relativa a la educación superior de una persona. No hay que mostrar dicha página al usuario si este ya ha indicado que nunca ha asistido a un centro de educación superior. Para lograr esto, se pueden incluir una o más páginas en un elemento condition para indicar bajo qué condiciones debe mostrarse esa página (o páginas); algo similar a esto:

Figura 1. Elemento condition
<condition expression="attendedThirdLevel==true">
  <question-page id="ThirdLevelDetailsPage">  
    ...
  </question-page>
</condition>

Cuando el usuario pulsa el botón Siguiente en la página previa a esta condición, el sistema evalúa la expresión 'attendedThirdLevel==true' (ha asistido a educación superior=verdadero). Si evalúa a verdadero, se mostrarán al usuario la página o páginas incluidas dentro de la condición; si evalúa a falso, el sistema omitirá la(s) página(s) y mostrará la página que aparezca después del elemento condition.

En este ejemplo, attendedThirdLevel es el ID de una pregunta de control hecha anteriormente en este script. La respuesta dada se utiliza en la evaluación de la expresión. Si en vez de eso se desea utilizar el valor de un atributo dentro del Almacén de datos, solo será necesario añadirle el prefijo del nombre de la entidad en la que está incluido (por ejemplo, Person.attendedThirdLevel).

Al utilizar expresiones en condiciones (o en cualquier otro lugar en lo que a esto respecta), debe asegurarse de que los atributos utilizados dentro de la expresión tengan un valor real en el momento en que se evalúan. De forma predeterminada, los atributos dentro del Almacén de datos son nulos hasta que se les asigna un valor, y permanecen así mientras el usuario no especifique o seleccione un valor para la respuesta adecuada.

En términos generales, hay dos formas de asegurarse de que los atributos tengan un valor antes de utilizarse en expresiones: hacer preguntas que los informen de manera obligatoria o darles valores predeterminados en el esquema del Almacén de datos (también podría emplearse el elemento set-attribute en algunos casos, consulte set-attribute).

Las condiciones pueden contener cualquier combinación de páginas (incluidas páginas de resumen), bucles y otras condiciones. Por ejemplo:

Figura 2. Condición anidada
<condition expression="attendedThirdLevel==true">
  <question-page id="ThirdLevelDetailsPage">
    ...        
  </question-page>
  <condition expression="hasMasters==true">
    <question-page id="MastersDetailsPage">
      ...        
    </question-page>
  </condition>
</condition>

Esto significa que ThirdLevelDetailsPage (la página de detalles de educación superior) solo se muestra si la respuesta a attendedThirdLevel es verdadera, y MastersDetailsPage (la página de detalles de máster) solo se muestra si attendedThirdLevel es verdadera y hasMasters (tiene másters) también es verdadera.

También es posible invocar una función personalizada a partir de una condición u otra expresión. La información se proporciona automáticamente a la función para acceder al Almacén de datos, es decir, el ID de entidad raíz, el ID de ejecución del script y el ID de la entidad actual (si la condición está dentro de un bucle). Debe tener en cuenta que las funciones personalizadas que tienen un efecto colateral (por ejemplo, guardar algunas respuestas en el Almacén de datos) no deben utilizarse en tales expresiones, ya que no tienen por qué evaluarse antes de que el contenido de la página se haya cargado.

IEG ya proporciona una función personalizada isNotNull (no es nulo) para permitir a las expresiones manejar valores nulos como parámetros. Por ejemplo, para validar la fecha de nacimiento de una persona, podría ser necesario asegurarse antes de que existe un valor:

Figura 3. Función personalizada que emplea 'isNotNull'
<validation expression="
      isNotNull(Persona.fechaDeNacimiento)
      and isNotNull(Persona.hoy)
      and (subDates(Persona.fechaDeNacimiento, Persona.hoy) < 0)">
    <message id="ValidacionFechaNacimiento">
      Su fecha de nacimiento debe ser anterior a hoy
    </message>
</validation>