Actions

ExpressionScript - Presentación

From LimeSurvey Manual

This page is a translated version of the page ExpressionScript - Presentation and the translation is 98% complete.
Outdated translations are marked like this.


Introducción

LimeSurvey utiliza el nuevo módulo ExpressionScript (EM) que le permite a LimeSurvey admitir ramificaciones, evaluaciones, validación y personalización más complejas. Reemplaza la forma en que LimeSurvey administra los Reemplazos, las Condiciones y las Evaluaciones en el back-end. También acelera considerablemente el procesamiento ya que elimina la mayoría de las lecturas de la base de datos en tiempo de ejecución. EM fue desarrollado por el Dr. Thomas White (TMSWhite).


Definiciones clave

  1. Expresión: Cualquier cosa entre llaves:
    • Siempre y cuando no haya espacios en blanco inmediatamente después de la llave de apertura o antes de la llave de cierre.
    • Se evalúa el contenido de la expresión por EM, por lo que puede contener fórmulas matemáticas, funciones y procesamiento complejo de cadenas y fechas.
  2. Sastrería: A veces se le llama "tubería". Es el proceso de modificar texto condicionalmente:
    • Tiene acceso a todos los 'campos de reemplazo', datos de los participantes y datos de respuesta.
    • También tiene acceso más fácil a las preguntas, respuestas y sus propiedades.
  3. Relevancia Ecuación: un nuevo atributo de pregunta que controla la visibilidad de la pregunta:
    • Si hay una ecuación de relevancia, entonces la pregunta solo se muestra si la relevancia se evalúa como verdadera.
    • Internamente, todos los comandos array_filter y array_filter_exclude se vuelven relevantes a nivel de subpregunta.
  4. SGQA' (cómo se nombraban las variables en el pasado) :
    • Significa Survey-Group-Question-Answer
    • Los nombres de las variables SGQA se parecen a 123X5X382X971 y pueden tener sufijos de subpreguntas.
    • Estos nombres de variables son específicos del S/Q/ subyacente. Códigos de base de datos G/A, por lo que es necesario cambiarlos con frecuencia. N!#Ecuación Tipo de pregunta: Un nuevo tipo de pregunta que guarda cálculos o informes en la base de datos:! N!#*Es como una pregunta repetitiva, pero su contenido se guarda en la base de datos incluso si configura "Ocultar siempre esta pregunta".
  5. Código de pregunta: Este es el nombre de variable preferido para EM:
    • Este puede ser un nombre descriptivo que indique el propósito de la pregunta, lo que facilita la lectura de la lógica compleja.
    • Los códigos de pregunta válidos NO deben comenzar con un número, por lo que cuando se utiliza el código de pregunta para numere sus preguntas, simplemente use "q1", o "q1a" o "g1q2".
    • Esto es lo que se convierte en el nombre de la variable si exporta datos a SPSS o R. Entonces, si realiza un análisis estadístico, necesita para crear solo códigos de preguntas únicos.


¿Tengo que usar EM?


La respuesta corta es no". Sin embargo, esto depende en gran medida de la complejidad de la encuesta que desee crear.

Por ejemplo, el Editor de condiciones cubre algunas expresiones básicas que se pueden aplicar a las preguntas de su encuesta. Sin embargo, el editor de condiciones es limitado. Es por eso que se utiliza EM: amplía el ámbito de posibilidades de personalización.


¿Puedo mezclar condiciones y ecuaciones de relevancia?

Sí. Puede utilizar el Editor de condiciones para algunas preguntas y Ecuaciones de relevancia para otras.

¡No se pueden configurar ambas condiciones y expresiones en la misma pregunta! Una vez que se configura una condición, reemplaza cualquier expresión escrita en el campo de ecuación de relevancia. Además, el campo Ecuación de relevancia ya no se puede editar manualmente.

Sin embargo, existe una manera de utilizar tanto expresiones como condiciones dentro de una pregunta. Como se mencionó anteriormente, una condición reemplaza el campo de ecuación de relevancia. Una vez hecho esto, verifique cuál es la ecuación recién creada y cópiela en un editor de texto. Elimine la condición recién creada del Editor de condiciones y luego edite la pregunta agregando las expresiones basadas en condiciones de su archivo de editor de texto junto con el resto de las expresiones que desea usar.


¿Cómo debo elegir entre Condiciones y Relevancia?

Aquí hay una lista de los pros y los contras de cada estilo:

Estilo Pros Contras
Condiciones 1. Excelente GUI para crear condiciones simples.
2. GUI bien documentada y comprendida por el equipo de soporte
1. Solo admite comparaciones simples y no cumple bien con las condiciones "Y" y "O".
2. Las condiciones en cascada funcionan de forma errática
3. Lento - uso intensivo de bases de datos - puede ralentizar encuestas largas.
4. Algunos informaron problemas con las condiciones de recarga.
5. La GUI no escala bien cuando hay docenas, cientos o miles de preguntas.
6. Podría resultar lento convertir encuestas en papel, ya que debe utilizar nombres SGQA.
7. A menudo se necesita un programador para codificar la lógica personalizada necesaria para bifurcaciones complejas.
Relevancia 1. Admite lógica muy compleja, incluidas más de 80 funciones y operadores matemáticos/de cadenas.
2. Soporte perfecto para lógica en cascada.
3. Rápido: sin llamadas adicionales a la base de datos y admite más de 1000 encuestas de preguntas.
4. No hay problemas con la lógica de recarga ya que no requiere códigos SGQA.
5. El resaltado de sintaxis escala a más de 1000 encuestas de preguntas.
6. Fácil y rápido de usar para grupos que deseen informatizar encuestas en papel existentes.
7. Admite fácilmente entrevistas semiestructuradas y encuestas epidemiológicas sin necesidad de programador.
1. Sin GUI para condiciones simples: utiliza syntax-highlighting en su lugar.


{{Nota| Nota:

  • Le recomendamos que utilice lo que mejor se adapte a sus necesidades.
  • Para una explicación más detallada de las características de EM, haga clic en el siguiente [[EM y sus características|enlace] ].}}

Empezando

La mejor manera de comenzar con EM es:

  • Instalar la última versión estable desde https://www.limesurvey.org/en/download.
  • Importe y explore algunas encuestas de muestra.
  • Explore los casos de uso y procedimientos y los paso- ejemplos paso a paso.
  • Explore la documentación de EM (esta página)
    • Pruebas unitarias de expresiones aisladas (avanzadas)
      • muestra ejemplos del uso de todas las funciones y operadores de EM, y el Resultados de PHP y JavaScript;
      • tenga en cuenta que hay pocas funciones que generan resultados diferentes en las versiones de PHP y JavaScript, por lo que esta página le permite planificar su lógica EM en consecuencia.

Terminología

Estas palabras se usan comúnmente para describir las capacidades de EM:

  • Bramificación basada en relevancia; si una pregunta es relevante, hágala; de lo contrario, no la haga (por ejemplo, hágala invisible y márquela). como NULL en la base de datos). Puede encontrar los Campos de relevancia en el panel del editor de preguntas, así como en el panel del editor del grupo de preguntas. Este último se utiliza para aplicar un conjunto de condiciones a un grupo completo sin tener que copiar la misma condición a cada pregunta y/o combinar la lógica condicional a nivel de grupo y de pregunta).
  • Sastrería - Una vez que sepa qué preguntas se deben formular, la adaptación (a veces llamada "piping") especifica cómo se debe formular la pregunta. Esto le permite admitir no solo la sustitución simple (como {TOKEN:FIRSTNAME}), sino también la conjugación de verbos y la declinación de sustantivos según el género o el número de sujetos. También le permite cambiar el mensaje que entrega a un encuestado en función de si respondió (o cómo respondió) otras preguntas.
  • Ecuaciones - EM agrega un nuevo tipo de pregunta llamado Ecuación que almacena el resultado de una Expresión. Los resultados de la ecuación se calculan y escriben en la base de datos, incluso si los oculta en la página. Por lo tanto, se utilizan para cálculos de puntuación ocultos, navegación basada en ecuaciones complejas, evaluaciones e informes que se generarán y almacenarán en la base de datos.


Relevancia y relevancia en cascada

Cada tipo de pregunta ahora tiene una Opción de relevancia que controla si la pregunta se muestra o no. El EM procesa cada ecuación de relevancia en el orden en que aparecen en la encuesta. Si la expresión es verdadera (o falta, para admitir encuestas heredadas), se mostrará la pregunta. Si no es relevante, la pregunta se ocultará y el valor se anulará en la base de datos. Si no hay preguntas relevantes en un grupo, se omitirá todo el grupo.

Además, si alguna de las variables dentro de una expresión es irrelevante, la expresión siempre se evalúa como falsa. Esto habilita Relevancia en cascada para que no tenga que escribir ecuaciones de relevancia muy largas para cada pregunta.

Supongamos que tiene cinco preguntas Q1-Q5 y solo desea mostrar la Q2 si se respondió la Q1 y la Q3 si se respondió la Q2, etc. Las ecuaciones de relevancia podrían ser:

Código de pregunta Relevancia Pregunta
Q1 1 ¿Cuál es tu nombre?
Q2 Q1 {Q1}, ¿cuántos años tienes?
Q3 Q2 Entonces, tienes {Q2} años. ¿Estás casado?
Q4 Q3 == "Y" {Q1}, ¿cuánto tiempo llevas casado?
Q5 Q4 ¿Cuántos hijos tienes, {Q1}?


Relevancia a nivel de grupo

ExpressionScript también admite relevancia a nivel de grupo. Esto facilita la implementación del bucle. Supongamos que desea recopilar información de hasta 10 entidades (como productos o personas de un hogar), donde primero determina cuántas entidades necesitan seguimiento (por ejemplo, preguntando cuántas personas viven en un hogar o haciendo que las personas verifiquen cuáles productos que les gustan de una larga lista). Después de saber cuántas entidades necesitan seguimiento, puede usar la relevancia a nivel de grupo como {count >= 1}, {count >=2}, ... {count >= 10} para cada uno de los 10 grupos de seguimiento. hacer preguntas. Dentro de cada grupo, puede tener lógica condicional a nivel de preguntas (por ejemplo, preguntas de seguimiento específicas de género o edad para cada tema). Las ecuaciones de relevancia a nivel de grupo y de pregunta se combinan con AND para determinar cuál debe mostrarse.

Para comprobar un ejemplo de este tipo, importe la siguiente encuesta: Ejemplo de encuesta del censo.

Se puede observar en la siguiente captura de pantalla que el grupo Persona 1 se muestra (o es relevante) si el encuestado vive con al menos otro conviviente:



Sastrería/Tuberías

Todo lo que esté entre llaves ahora se trata como una expresión (con una excepción que se describe a continuación). Las expresiones tienen acceso a todos los LimeReplacementFields y variables (a través de varios alias), a todos los operadores de ecuaciones típicos (matemáticos, lógicos y de comparación) y a docenas de funciones (que incluso funcionan dinámicamente en el lado del cliente).

Al utilizar estas ecuaciones, puede hacer cosas como:

  1. Mostrar condicionalmente mensajes personalizados a los encuestados en función de respuestas anteriores;
  2. Crear evaluaciones y mostrar los resultados de las evaluaciones (o bifurcar o mostrar mensajes condicionalmente) en función de esos resultados , todo sin usar el módulo de evaluaciones en sí;
  3. Conjugar verbos y declinar sustantivos dentro de preguntas, respuestas e informes;
  4. Mostrar resúmenes de respuestas antes de la página "Muestre sus respuestas" en la final de la encuesta.


Ecuaciones

Hay un nuevo tipo de pregunta llamado Ecuación. Piense en ello como un Tipo de pregunta de visualización de texto, excepto que almacena el valor de lo que se muestra en la base de datos. Entonces, si el texto de la pregunta de ecuación contiene un cálculo de evaluación, ese valor se almacenará en la base de datos en una variable que se puede mostrar en estadísticas públicas o privadas.


Sintaxis

Todo lo contenido entre llaves ahora se considera una expresión (con una excepción: no debe haber espacios en blanco al principio ni al final; esto es necesario para garantizar que ExpressionScript no intente procesar JavaScript incrustado).

Tenga en cuenta que está bien que las expresiones abarquen varias líneas, siempre y cuando no haya espacios en blanco después de la llave de apertura o antes de la llave de cierre. Esto es especialmente útil para declaraciones "if()" anidadas como esta:

{if(is_empty(PFTotals),
 '',
 if(PFTotals >= -5 && PFTotals <= -4,
 'Muy suave',
 if(PFTotals >= -3 && PFTotals <= -2,
 'Suave',
 if(PFTotals == -1,
 'Algo suave',
 if(PFTotals == 0,
 'Moderado',! N! if(PFTotals == 1,
 'Algo difícil',
 if(PFTotals >= 2 && PFTotals <= 3,
 'Difícil',
 if(PFTotals >= 4 && PFTotals <= 5,
 'Muy difícil',
 ''
 )
 )
 )
 )
 )
 )
 )
)} !¡NORTE!

ExpressionScript admite la siguiente sintaxis:

  • Todos los operadores matemáticos estándar (por ejemplo, +,-,*,/,!);
  • Todos los operadores de comparación estándar (por ejemplo, <,<=,==,!=,> ,>=, más sus equivalentes: lt, le, eq, ne, gt, ge);
  • Paréntesis (para que pueda agrupar subexpresiones);
  • Operadores condicionales (por ejemplo, &&,| | y sus equivalentes: y, o);
  • Cadenas entre comillas simples y dobles (cada una de las cuales puede incrustar cadenas con el otro tipo de comillas);
  • Operador de coma (por lo que puede tener una lista de expresiones y simplemente devolver el resultado final );
  • Operador de asignación (=);
  • Variables predefinidas (para hacer referencia a preguntas, atributos de preguntas y respuestas); por ejemplo, el códigos SGQA;
  • Funciones predefinidas (ya hay más de 80 y es fácil agregar más).


Operadores

La sintaxis EM sigue la precedencia normal de operadores:

Nivel Operador(es) Descripción
1 () paréntesis para agrupar o llamar funciones
2 ! - + operadores unarios: no, negación, unario-más
3 * / veces, dividir
4 + - más , menos
5 < <= > >= lt le gt ge comparaciones relativas
6 == != eq ne comparaciones de igualdad
7 y lógico AND
8 o lógico OR
9 = asignación operador
10 , operador de coma

Template:Nota

Advertencia con número y cadena que no coinciden y comparación alfabética/numérica

Cuando desee comparar valores con comparaciones relativas o de igualdad, preste atención a las discrepancias. Un valor ingresado por el usuario (o proporcionado mediante un código de respuesta) se puede utilizar como número si es claramente un número. Si rodea uno de los valores con " , se realizará una comparación de texto/cadena lugar. Si desea comparar como un número, nunca rodee un número con " .

Por ejemplo Q0.NAOK > "50" es verdadero si Q0.NAOK es una pregunta numérica con 9 como valor. Esto se debe a que el operador > asumirá que se trata de una comparación alfabética y no numérica .

Para asegurarse de comparar valores enteros, puede usar intval(Q0.NAOK) > 50 . Solo recuerde si Q0.NAOK no es un número (vacío o una cadena), entonces intval(Q0.NAOK) === 0. Para comparar valores de cadena ("A" < "B") use strcmp directamente: strcmp(Q0.NAOK,"B") o strcmp(Q0.NAOK,"A5") .

Precaución sobre el uso del operador de asignación (=)

Debe evitar el uso de operadores de asignación a menos que sea absolutamente necesario, ya que pueden provocar efectos secundarios inesperados. Por ejemplo, si cambia el valor de una respuesta anterior, la relevancia en cascada y la lógica de validación entre esa pregunta y la pregunta actual no se vuelven a calcular, por lo que podría terminar con datos internamente inconsistentes (por ejemplo, preguntas que permanecen respondidas pero que no deben responderse han sido anuladas, o preguntas que se omitieron pero que deberían haber sido respondidas). En general, si desea asignar un valor a una variable, debe crear un tipo de pregunta de ecuación y usar una expresión para establecer su valor. Sin embargo, hay ocasiones excepcionales en las que la gente realmente necesita este operador, por lo que lo ponemos a disposición.

Para ayudarle a advertirle acerca de este operador, se muestra en fuente roja dentro de las ecuaciones de sintaxis (para que no lo confunda con "==").



Usando el operador de asignación

Las principales razones por las que es posible que desee utilizar el operador de asignación son:

  • Necesita establecer el valor predeterminado mediante una ecuación para una pregunta que no acepta valores predeterminados (como la lista de radio, donde la interfaz de usuario le permite elegir uno de las opciones de respuesta, pero no te permite ingresar una ecuación). Sin embargo, tenga cuidado, ya que LimeSurvey no podrá validar que su ecuación genere una de las respuestas permitidas para esa pregunta;
  • Necesita cambiar a la fuerza la respuesta a una pregunta anterior basándose en una respuesta posterior;
*etc...


  Atención : La asignación se realiza únicamente en PHP. Esto significa que el valor no se actualiza en la misma página, sino solo cuando el usuario pasa a la página siguiente. Por lo tanto, preste atención cuando el operador de asignación se utilice en la misma página con otras expresiones.



Puede utilizar todo el sistema de gestión de expresiones para este propósito. Es mejor utilizar una Equation para este propósito.

Algunos ejemplos:

  • Establecer respuesta a una pregunta de texto breve en minúsculas: {QCODE=strtolower(QCODE.NAOK)} ;
  • Establecer una respuesta predeterminada a un tipo de pregunta de matriz al inicio de una encuesta: {Q1_SQ1=(is_empty(Q1_SQ1.NAOK),"A99",Q1_SQ1.NAOK)} ;
  • Establezca una respuesta predeterminada para un tipo de pregunta de textos de matriz al inicio de una encuesta: {Q1_SQY1_SQX1 = (is_empty(Q1_SQY1_SQX1.NAOK),"Inserted answer", Q1_SQY1_SQX1.NAOK)} ;
  • Establezca una respuesta con condición: {QCODE=if(YesNo="Y","A1","")} .

seguridad XSS

Con XSS habilitado, algunas partes del sistema de administrador de expresiones no se pueden usar:

  • comenzar una etiqueta HTML en una expresión pero terminar en otra expresión;
  • usar una expresión compleja dentro de una URL .


Template:Nota


<html>Ejemplos y soluciones alternativas:

  • {if( 1 ,"","")}information{if( 1 ,"","")} funciona con la seguridad XSS, aquí puede usar {if(1," ;
  • <a href="/script.php?value={if(QCODE == "Y","yes","no")}">next</a> , here you can use an equation question because using a complete question code is OK : <a href="/script.php?value={EQUATION.NAOK}">next</a> . information","information")} {if(1," ;
  • <a href="/script.php?value={if(QCODE == "Y","yes","no")}">next</a> , here you can use an equation question because using a complete question code is OK : <a href="/script.php?value={EQUATION.NAOK}">next</a> .)}


Acceso a variables

ExpressionScript proporciona acceso de sólo lectura a cualquier variable que pueda necesitar. Para compatibilidad con versiones anteriores, proporciona acceso a lo siguiente:

Además, ExpressionScript le permite hacer referencia a variables mediante el código de pregunta (la columna 'título' en la tabla de preguntas dentro de la base de datos). Esta es también la etiqueta de variable que se utiliza cuando exporta sus datos a SPSS, R o SAS. Por ejemplo, si tiene preguntas sobre nombre, edad y sexo, puede llamar a esas variables "nombre", "edad" y "género" en lugar de "12345X13X22", "12345X13X23". ' y 12345X13X24. Esto hace que las ecuaciones sean más fáciles de leer y validar para todos, además de hacer posible barajar las preguntas sin tener que realizar un seguimiento de los números de grupo o de pregunta.

Importante: Es más seguro hacer referencia a las variables que aparecen en las páginas o preguntas anteriores.

Además, ExpressionScript te permite acceder a muchas propiedades de la pregunta:


Sintaxis Significado Ejemplo Resultado del ejemplo
Qcode un alias para Qcode.code {implode(',',nombre,género )} 'Tom','M'
Qcode.code el código de respuesta seleccionado para la pregunta si es relevante (de lo contrario, en blanco), o el valor del texto si no es pregunta codificada {implode(',',name.code,gender.code)} 'Tom','M'
Qcode.NAOK igual que Qcode - ver discusión de NAOK {gender.NAOK} 'M'
Qcode.value el valor de evaluación de la pregunta si es relevante (de lo contrario, en blanco), o el valor del texto si no lo es una pregunta codificada {gender.value} '1'
Qcode.valueNAOK igual que Qcode.value - ver discusión sobre NAOK {gender.valueNAOK} '1 '
Qcode.shown el valor mostrado para la pregunta {implode(',',name.shown,gender.shown)} - Qcode.question el texto de la pregunta {gender.question} '¿Cuál es tu género?'
Qcode.mandatory si la pregunta es obligatorio (Y/N) {gender.mandatory} 'N'
Qcode.qid el número de pregunta interna (no el número secuencial) {gender.qid} 337
Qcode.type el tipo de pregunta {gender.type} 'G'
Qcode.jsName el nombre javascript correcto para la pregunta, independientemente de si está declarada dentro o fuera de esta página {gender.jsName} 'java1827X3X337'
Qcode.gid el número de grupo interno (no el número secuencial) {gender.gid} 3
Qcode.qseq el número secuencial de la pregunta, comenzando desde 0 {gender.qseq} 5
Qcode.gseq el número secuencial del grupo, comenzando desde 0 {gender.gseq} 1
Qcode.relevanceStatus si la pregunta es actualmente relevante (0 o 1 ) {gender.relevanceStatus} 1
Qcode.relevance la ecuación de relevancia a nivel de pregunta {gender.relevance} '!is_empty(name)'
Qcode.grelevance la ecuación de relevancia a nivel de grupo {gender.grelevance} 'num_children >= 5'
Qcode.sgqa el valor SGQA para esta pregunta {gender.sgqa} '1827X3X337'


Problema con el editor HTML

Si utiliza el editor HTML, algunos caracteres se reemplazan por entidades HTML.

  • & by &
  • < by <
  • > by >

Si usa el editor HTML, debe usar :

  • y para &
  • lt para <
  • le for <=
  • gt for >
  • ge para >=


Se recomienda borrar su expresión del HTML que aparece dentro de su expresión. Si utiliza el editor HTML de LimeSurvey, haga clic en el botón "Fuente" (ubicado en la parte superior izquierda del editor) y elimine todos los caracteres que no estén relacionados con su expresión (por ejemplo,

,
, etcétera).

Nombre de variable Qcode

Aquí están los detalles de cómo construir un Qcode (y acceder a algunas propiedades) por tipo de pregunta. En general, los Qcodes se construyen como:

 Código de pregunta. '_'. ID de subpregunta. '_'. ID de escala

Para comentario y otro, los códigos de pregunta correspondientes son QuestionCode_comment y QuestionCode_other, respectivamente.

Tipo Descripción Código Subpreguntas Opciones de respuesta Escalas Código de respuesta Respuesta mostrada Relevancia
5 5 Botones de opción de elección de punto Q1 1-5 {Q1} {Q1.shown} {Q1==3}
B Matriz (elección de 10 puntos) Botones de radio Q2 |1-10 {Q2_L2} {Q2_L2.shown} {Q2_L2==7}
A Botones de radio de matriz (elección de 5 puntos) Q3 |1-5 {Q3_1} {Q3_1.shown} {Q3_1>=3}
1 Matriz (Etiquetas flexibles) Escala dual Q4 sq1-sq5 0 :a1-a3 1:b1-b3 {Q4_sq1_0} {Q4_sq1_1.shown} {Q4_sq1_1=='b2'}
H Matriz (Flexible) - Formato de columna Q5 1-5 s,m,t {Q5_1} {Q5_1.shown} {Q5_1=='s'}
F Matriz (Flexible) - Formato de fila Q6 |1-5 {Q6_F3} {Q6_F3.shown} {Q6_F3==4}
E Botones de radio de matriz (aumentar/igual/disminuir) Q7 1- 7 I,S,D {Q7_4} {Q7_4.shown} {Q7_4=='D'}
: Matriz (Multi Flexi) 1 a 10 Q8 ls1,todo ,ls2 mín,máx,promedio {Q8_ls1_max} {Q8_ls2_avg.shown} {Q8_ls2_min==7}
; Texto de matriz (Multi Flexi) Q9 hp,st,sw 1º,2º,3º {Q9_hp_3rd} {Q9_hp_3rd.shown} {Q9_hp_3rd=='Peter'}
C Matriz (Sí/Incierto/No) Botones de radio Q10 1-5 S,N,U {Q10_1} {Q10_1.shown} {Q10_3=='Y'}
X Pregunta repetitiva P11 {P11.mostrado}
D Fecha P12 {Q12} {Q12.mostrado}
* Ecuación P13 {Q13} {Q13.shown} {Q13>5}
~124~ Carga de archivos (registra el número de archivos cargados) Q14 {P14} {Q14>0}
G Lista desplegable de género P15 M,F {Q15} {Q15.shown} {Q15=='M'}
U Texto libre enorme Q16 {P16} {P16.shown} {strlen(Q16)>100}
I Pregunta de idioma P17 {Q17} {Q17.shown} {Q17=='en'}
! Lista - Desplegable Q18 1-5 {Q18} {Q18.shown} {Q18==3}
L Lista desplegable/lista de botones de radio Q19 AZ {Q19} {Q19.shown} {Q19=='X'}
O Lista con lista desplegable de comentarios/botones de radio + área de texto Q20 AF {Q20},{Q20comentario} {Q20.shown} {Q20=='B'}
T Texto libre largo Q21 {Q21} {Q21.shown} {strstr(Q21,'hello')>0}
M Casilla de verificación de opción múltiple Q22 | {Q22_E}, {Q22_other} {Q22_E.shown}, {Q22_other.shown} {Q22_E=='Y'}
P Casilla de verificación de opción múltiple con comentarios + Texto P23 AF {Q23_D}, {Q23_Dcomment} {Q23_D.shown} {!is_empty(Q23)}
K Pregunta numérica múltiple Q24 yo,mamá,papá {Q24_self} {Q24_self.shown} {Q24_self>30}
Q Múltiples textos cortos Q25 AF {Q25_B} {Q25_B.shown} {substr(Q25_B,1,1)=='Q'}
N Tipo de pregunta numérica Q26 {Q26} {Q26.shown} {Q26 > 30}
R Estilo de clasificación Q27 1-4 {Q27_1} {Q27_1.shown} {Q27_1==3}
S Texto libre corto Q28 {Q28} {Q28.mostrado} {Q28=='mío'}
Y Sí/No botones de radio Q29 {Q29} {Q29.mostrado} {Q29=='Y'}


Uso de NAOK

NAOK --> "No aplicable" (NA) está bien (OK)


Usar NAOK significa que todas o algunas de las variables son irrelevantes (por ejemplo, "No aplicable" (NA) está bien (OK)).

Por ejemplo: count(Q1_SQ1,Q1_SQ2,Q1_SQ3,Q1_SQ4) siempre proporciona una cadena vacía si se filtra una subpregunta de Q1. Para contar el número de subpreguntas marcadas en dicha pregunta se puede contar(Q1_SQ1.NAOK,Q1_SQ2.NAOK ,Q1_SQ3.NAOK,Q1_SQ4.NAOK). Si la subpregunta está oculta, el EM devuelve una cadena vacía.

Sin NAOK, si una pregunta o una subpregunta está oculta, el EM siempre devuelve una cadena vacía (lo mismo que devolver falso).

El .mostrado siempre usa el sistema NAOK (cadena vacía si está oculto), pero si necesita el código de la respuesta: siempre es una buena idea agregar .NAOK después del código de la pregunta (excepto si lo necesita y sabe lo que hace).

Se proporciona más información en la Subsección Anulación de condiciones en cascada.


Las variables reservadas "esto", "yo" y "aquello"

Muy a menudo desea evaluar todas las partes de una pregunta, como contar cuántas subpreguntas se han respondido o resumir las puntuaciones. Otras veces desea procesar solo ciertas filas o columnas de una pregunta (como obtener las sumas de las filas o columnas y almacenarlas en la base de datos). Estas variables reservadas hacen que el proceso sea relativamente sencillo.


"Esta" variable

La variable "this" se usa exclusivamente dentro de las opciones "Ecuación de validación de pregunta completa" y "Ecuación de validación de subpregunta" (esta última no posible desde la GUI). Se expande a los nombres de variables de cada una de las celdas dentro de esas preguntas. Por lo tanto, si desea asegurarse de que cada entrada sea mayor que tres, deberá establecer la "Ecuación de validación de subpreguntas" en (esto > 3).


"Variable propia"

Las variables "yo" y "ese"' son más poderosas y sirven como macros que se expanden antes de procesar las ecuaciones. Las opciones de sintaxis para la variable "self" son:

  • self
  • self.suffix
  • self.sub-selector
  • self.sub- selector.sufijo
  1. suffix es cualquiera de los sufijos normales de qcode (p. ej., NAOK, valor, mostrado)
  1. subselector puede ser uno de los siguientes:
  • comentarios: solo subpreguntas que son comentarios (por ejemplo, opción múltiple con comentario y lista con comentario);
  • nocomments - solo subpreguntas que no son comentarios;
  • sq_X - donde X es un identificador de fila o columna. Solo se seleccionan las subpreguntas que coinciden con el patrón X. Tenga en cuenta que la búsqueda se realiza en el identificador de código completo, luego sq_X coincide e incluye las subpreguntas nX, X, Xn (por ejemplo, si usa sq_1, se incluyeron las subpreguntas a1, 1a, 1, 11 o 001). Preste atención al tipo de pregunta de escala dual donde el código de subpreguntas es QCODE_SQCODE_1 y QCODE_SQCODE_1 y al tipo de pregunta de clasificación donde el código de subpregunta es QCODE_1,QCODE_2...

Ejemplos:

  • ¿Se ha respondido alguna parte de una pregunta? -> {count(self.NAOK)>0}
  • ¿Cuál es la puntuación de evaluación para esta pregunta? -> {suma(valor propio)}

También puede utilizarlos para obtener totales de filas y columnas. Supongamos que tiene una matriz de números con filas AE y columnas 1-5.

  • ¿Cuál es el total general? -> {sum(self.NAOK)}
  • ¿Cuál es el total de la fila B? -> {sum(self.sq_B.NAOK)}
  • ¿Cuál es el total de la columna 3? -> {suma(self.sq_3.NAOK)}


"Esa" variable

La variable "ese" es como la variable "yo", pero le permite hacer referencia a otras preguntas. Su sintaxis es:

  • that.qname
  • that.qname.suffix
  • that.qname.sub-selector' '
  • ese.qname.sub-selector.suffix

qname es el nombre de la pregunta sin extensiones de subpregunta. Entonces, creemos una pregunta 'q1', donde 'q' representa también su qname.

Ejemplos:

  • ¿Se ha respondido alguna parte de la pregunta q1? -> {count(that.q1.NAOK)>0}
  • ¿Cuál es la puntuación de evaluación para el segundo trimestre? -> {sum(that.q2.NAOK)}
  • ¿Cuál es el total general de q3? -> {sum(that.q3.NAOK)}
  • ¿Cuál es el total de la fila C en q4? -> {sum(that.q4.sq_C.NAOK)}
  • ¿Cuál es el total de la columna 2 en q4? -> {suma(that.q4.sq_2.NAOK)}

Las variables "yo" y "ese" se pueden utilizar con cualquier relevancia, validación o adaptación.

La única advertencia es que cuando utiliza la función Mostrar archivo lógico, le mostrará el valor ampliado de "yo" y "eso". Esto le permite ver la ecuación real que se generará para que usted (y el EM) puedan validar si las variables existen o no. Esto puede parecer confuso ya que es posible que veas ecuaciones bastante largas. Sin embargo, si edita la pregunta, verá la ecuación original usando "self" y/o "that".

Template:Nota

Acceso a funciones

ExpressionScript proporciona acceso a funciones matemáticas, de cadenas y definidas por el usuario, como se muestra a continuación. Tiene equivalentes de PHP y JavaScript para estas funciones, de modo que funcionan de manera idéntica en el lado del servidor (PHP) y en el lado del cliente (JavaScript). Es fácil agregar nuevas funciones.


Funciones implementadas

Actualmente están disponibles las siguientes funciones:

Function Meaning Syntax
abs Absolute value number abs(number)
acos Arc cosine number acos(number)
addslashes Quote string with slashes string addslashes(string)
asin Arc sine number asin(number)
atan Arc tangent number atan(number)
atan2 Arc tangent of two variables number atan2(number, number)
ceil Round fractions up number ceil(number)
checkdate Returns true(1) if it is a valid date in gregorian calendar bool checkdate(month,day,year)
convert_value Convert a numerical value using a inputTable and outputTable of numerical values number convert_value(fValue, iStrict, sTranslateFromList, sTranslateToList)
cos Cosine number cos(number)
count count the number of answered (non-blank) questions in the list number count(arg1, arg12, ..., argN)
countif Count the number of answered questions in the list equal to the first argument number countif(matches, arg1, arg2, ... argN)
countifop Count the number of answered questions in the list which pass the criteria (arg op value) number countifop(op, value, arg1, arg2, ... argN)
date Format a local date/time string date(format [, timestamp=time()])
exp Calculates the exponent of e number exp(number)
fixnum Display numbers with comma as radix separator, if needed string fixnum(number)
floor Round fractions down number floor(number)
gmdate Format a GMT date/time string gmdate(format [, timestamp=time()])
html_entity_decode Convert all HTML entities to their applicable characters (always uses ENT_QUOTES and UTF-8) string html_entity_decode(string)
htmlentities Convert all applicable characters to HTML entities (always uses ENT_QUOTES and UTF-8) string htmlentities(string)
expr_mgr_htmlspecialchars Convert special characters to HTML entities (always uses ENT_QUOTES and UTF-8) string htmlspecialchars(string)
expr_mgr_htmlspecialchars_decode Convert special HTML entities back to characters (always uses ENT_QUOTES and UTF-8) string htmlspecialchars_decode(string)
idate Format a local time/date as integer string idate(string [, timestamp=time()])
if Excel-style if(test,result_if_true,result_if_false) if(test,result_if_true,result_if_false)
implode Join array elements with a string string implode(glue,arg1,arg2,...,argN)
intval Get the integer value of a variable int intval(number [, base=10])
is_empty Determine whether a variable is considered to be empty bool is_empty(var)
is_float Finds whether the type of a variable is float bool is_float(var)
is_int Find whether the type of a variable is integer bool is_int(var)
is_nan Finds whether a value is not a number bool is_nan(var)
is_null Finds whether a variable is NULL bool is_null(var)
is_numeric Finds whether a variable is a number or a numeric string bool is_numeric(var)
is_string Find whether the type of a variable is string bool is_string(var)
join (New in 2.0 build 130129) Join elements as a new string join(arg1, arg2, ... argN)
list Return comma-separated list of non-blank values string list(arg1, arg2, ... argN)
listifop (New in 3.16.1 ) Return a 'glue'-separated list of the specified question property (retProp) from questions in the list which pass the criteria (cmpProp op value) string listifop(cmpProp, op, value, retProp, glue, sgqa1, sgqa2, ... sgqaN)
ltrim Strip whitespace (or other characters) from the beginning of a string string ltrim(string [, charlist])
max Find highest value number max(arg1, arg2, ... argN)
min Find lowest value number min(arg1, arg2, ... argN)
mktime Get UNIX timestamp for a date (each of the 6 arguments are optional) number mktime([hour [, minute [, second [, month [, day [, year ]]]]]])
modulo-function The modulo function is not supported yet. You can use the floor() function instead floor(x/y)==(x/y)
nl2br Inserts HTML line breaks before all newlines in a string string nl2br(string)
number_format Format a number with grouped thousands string number_format(number)
pi Get value of pi number pi()
pow Exponential expression number pow(base, exp)
quoted_printable_decode Convert a quoted-printable string to an 8 bit string string quoted_printable_decode(string)
quoted_printable_encode Convert a 8 bit string to a quoted-printable string string quoted_printable_encode(string)
quotemeta Quote meta characters string quotemeta(string)
rand Generate a random integer, see this example int rand() OR int rand(min, max)
regexMatch compare a string to a regular expression bool regexMatch(pattern,input)
round Rounds a number to an optional precision number round(val [, precision])
rtrim Strip whitespace (or other characters) from the end of a string string rtrim(string [, charlist])
sin Sine number sin(arg)
sprintf Return a formatted string string sprintf(format, arg1, arg2, ... argN)
sqrt Square root number sqrt(arg)
stddev Calculate the Sample Standard Deviation for the list of numbers number stddev(arg1, arg2, ... argN)
str_pad Pad a string to a certain length with another string string str_pad(input, pad_length [, pad_string])
str_repeat Repeat a string string str_repeat(input, multiplier)
str_replace Replace all occurrences of the search string with the replacement string string str_replace(search, replace, subject)
strcasecmp Binary safe case-insensitive string comparison int strcasecmp(str1, str2)
strcmp Binary safe string comparison int strcmp(str1, str2)
strip_tags Strip HTML and PHP tags from a string string strip_tags(str, allowable_tags)
stripos Find position of first occurrence of a case-insensitive unicode string (starting by 0, return false if not found) int stripos(haystack, needle [, offset=0])
stripslashes Un-quotes a quoted string string stripslashes(string)
stristr Case-insensitive strstr string stristr(haystack, needle [, before_needle=false])
strlen Get string length int strlen(string)
strpos Find position of first occurrence of an unicode string (starting by 0, return false if not found) int strpos(haystack, needle [ offset=0])
strrev Reverse a string string strrev(string)
strstr Find first occurrence of a string string strstr(haystack, needle[, before_needle=false])
strtolower Make a string lowercase string strtolower(string)
strtotime Parse about any English textual datetime description into a Unix timestamp int strtotime(string)
strtoupper Make a string uppercase string strtoupper(string)
substr Return part of an unicode string string substr(string, start [, length])
sum Calculate the sum of values in an array number sum(arg1, arg2, ... argN)
sumifop Sum the values of answered questions in the list which pass the criteria (arg op value) number sumifop(op, value, arg1, arg2, ... argN)
tan Tangent number tan(arg)
time Return current UNIX timestamp number time()
trim Strip whitespace (or other characters) from the beginning and end of a string string trim(string [, charlist])
ucwords Uppercase the first character of each word in a string string ucwords(string)
unique Returns true if all non-empty responses are unique boolean unique(arg1, ..., argN)

Template:Nota

Crear nuevas funciones de expresión con el complemento (New in 4.0.0 )

Si necesita una nueva función que no existe en el núcleo, puede crear una con un complemento. Esta nueva función se crea utilizando el evento expressionManagerStart.

ExpressionScript sabe qué variables son locales

Para crear correctamente JavaScript para una página, EM necesita saber qué variables están configuradas en la página y cuál es su ID de JavaScript (por ejemplo, para document.getElementById(x)). También debe saber qué variables están configuradas en otras páginas (para poder garantizar que se cumplan las condiciones necesarias<input type='hidden' value='x'> los campos están presentes y poblados).


Condiciones en cascada

Si alguna de las variables es irrelevante, toda la ecuación será irrelevante (falsa). Por ejemplo, en la siguiente tabla, N/A significa que una de las variables no era relevante:


Operador Ejemplo a b Resultado
+ (unario) +a N/A falso
! !a N/A falso
== (o eq) a == b N/A 5 falso
== (o eq) a == b N/A 0 falso
== (o eq) a == b N/A N/A falso
!= (o ne) a != b N/A 5 falso
!= (o ne) a != b N/A N/A falso
!= (o ne) a != b N/A 0 falso
> (o gt) a >b N/A 5 falso
>= (o ge) a >= b N/A 5 falso
< (o lt) a < b N/A 5 falso
<= (o le) a <= b N/A 5 falso
y a y b N/A 5 falso
y a y b N/A N/A - o a o b N/A N/A falso
o a o b N/A 5 falso
+ a + b N/A 5 falso
* a * b N/A 5 falso
/ a / b 5 N/A falso
(exp) (a && b) N/A 5 falso
|(b + b) > (a && b) N/A 5 falso
función suma(a,b,b) N/A 5 falso
función max(a,b) N/A 5 falso
función min(a,b ) N/A 5 falso
función implosionar(', ',a,b,a,b) N/A 5 - función si(a,a,b) N/A 5 falso
función está_vacío(a) N/ Un falso
función is_empty(a) 0 (o en blanco) verdadero
función !is_empty(a) N/A falso


Anulación de condiciones en cascada

Supongamos que desea mostrar un total acumulado de todas las respuestas relevantes. Podrías intentar utilizar la ecuación {suma(q1,q2,q3,...,qN)}. Sin embargo, esto se traduce internamente a LEMif(LEManyNA("q1","q2","q3",...,"qN")",",sum(LEMval("q1"),LEMval("q2") ,LEMval("q3"),...,LEMval("qN"))). Entonces, si alguno de los valores q1-qN es irrelevante, la ecuación siempre devolverá falso. En este caso, sum() mostrará "0" hasta que se respondan todas las preguntas.

Para evitar esto, a cada variable se le puede agregar un sufijo ".NAOK" (lo que significa que No aplicable está bien). En tales casos, se produce el siguiente comportamiento. Supongamos que tiene una variable q1.NAOK:

  1. q1 no se agrega a la cláusula LEManyNA()
  2. LEMval('q1') continuará verificando si la respuesta es relevante y devolverá "" si no es así (las respuestas individuales irrelevantes serán ignoradas, pero no anularán la expresión completa).

Entonces, la solución al problema del total acumulado es usar la ecuación suma(q1.NAOK,q2.NAOK,q3.NAOK,...,qN.NAOK).

El uso del sufijo .NAOK también permite a los autores diseñar encuestas que tienen varias rutas posibles pero que luego convergen en rutas comunes. Por ejemplo, digamos que los sujetos responden una encuesta de una manera que está fuera del rango normal de respuestas. El autor podría alertar a los sujetos de que es posible que no obtengan resultados válidos y preguntarles si realmente quieren continuar con la encuesta. Si dicen "Sí", se mostrarán el resto de las preguntas. La condición para el "resto de las preguntas" verificaría si las respuestas iniciales fueron respondidas dentro del rango normal O si el sujeto dijo "Sí" a la pregunta que solo es relevante si respondió fuera del rango normal.

¿Cómo admite ExpressionScript la microadaptación condicional?

A continuación se muestra un ejemplo de microadaptación (donde Tipo de pregunta=='expr' significa una Ecuación):


Código de pregunta Relevancia Tipo de pregunta Pregunta
nombre 1 texto ¿Cuál es tu nombre?
badage !is_empty(edad) expr {(edad<16) o (edad>80 )}
agestop badage message Lo siento, {nombre}, tú también eres {if( (edad<16),'joven',if( (edad>80), 'viejo','mediana edad') ) } para esta prueba.
kids !badage yesno ¿Tienes hijos?
padres 1 expr {!badage && kids=='Y'}
numKids parents text ¿Cuántos hijos tienes?
kid2 parents && numKids >= 2 text ¿Cuántos años tiene? tu segundo hijo?
kid3 parents && numKids >= 3 text ¿Cuántos años tiene tu tercer hijo?
kid4 parents && numKids > = 4 text ¿Cuántos años tiene tu cuarto hijo?
kid5 parents && numKids >= 5 text ¿Cuántos años tiene tu quinto hijo?
informe |text {nombre}, dijiste que tienes {edad} y que tienes {numKids}. La suma de las edades de tus primeros {min(numKids,5)} hijos es {sumage}


Para descargar el ejemplo de encuesta anterior, haga clic en el siguiente enlace: Ejemplo de encuesta sobre número de niños.

Todas estas preguntas pueden estar en una sola página (por ejemplo, en el mismo grupo) y solo se mostrarán las preguntas relevantes. Además, a medida que ingresa las edades de los niños, la expresión sum() en la última pregunta se actualizará dinámicamente.

<html>ExpressionScript proporciona esta funcionalidad al rodear cada expresión con un nombre elemento. Cada vez que un valor cambia, vuelve a calcular la expresión que debería aparecer en ese elemento y regenera la pantalla. Puede tener docenas o incluso cientos de expresiones personalizadas en la misma página.


Resaltado de sintaxis

Para ayudar a ingresar y validar expresiones, EM proporciona resaltado de sintaxis con las siguientes características:

Tipos y significados del resaltado de sintaxis

Color Muestra Significado Información sobre herramientas Comentarios
fondo tostado Muestra el ecuación completa ninguno -! N!|texto rojo en negrita Muestra Un error Alguna explicación sobre el error Puede ser una variable desconocida o un error en la función. La encuesta está rota y las preguntas que se basan en la expresión respectiva no se mostrarán a los encuestados.
blue text Muestra nombre de función significado y sintaxis permitida Se refiere a nombres de funciones o cosas que deberían ser funciones ya que van seguidas de un paréntesis abierto. Se muestran en texto azul en negrita. La información sobre herramientas muestra el significado y la sintaxis permitida para la función.
grey text Muestra cadena none Las cadenas entre comillas simples y dobles se muestran en texto gris.
texto cian Muestra variable configurada en la misma página, [ nombre o código SGQA]: pregunta; valor; Lista de respuestas que muestra códigos para cada valor Cualquier variable que esté configurada en la misma página que la pregunta que estás editando actualmente se muestra en texto cian (se puede actualizar en javascript). La información sobre herramientas muestra su nombre (si usó INSERTANS:xxx) o su código SGQA (si usó el nuevo sistema de nombres), la pregunta real y su valor actual (o en blanco si no está configurado). Si el tipo de pregunta espera respuestas de un conjunto de valores enumerados, se muestra la asignación de los códigos para mostrar valores.
green text Muestra variable establecida en una página anterior [ nombre o código SGQA]: pregunta; valor; respuestaLista que muestra códigos para cada valor Cualquier variable que se establezca en una página anterior se muestra en texto verde en negrita. La información sobre herramientas muestra su nombre (si usó INSERTANS:xxx) o el código SGQA (si usó el nuevo sistema de nombres), la pregunta real y su valor actual (o en blanco si no está configurado). Si el tipo de pregunta espera respuestas de un conjunto de valores enumerados, se muestra la asignación de los códigos para mostrar valores.
bold pink text Muestra variable establecida en una página posterior en general: vacía al inicio de la encuesta, pero se puede completar con un índice o pasar a la anterior [ nombre o código SGQA]: pregunta; valor; Lista de respuestas que muestra códigos para cada valor Cualquier variable que se establezca en una página anterior se muestra en texto rosa en negrita. La información sobre herramientas muestra su nombre (si usó INSERTANS:xxx) o el código SGQA (si usó el nuevo sistema de nombres), la pregunta real y su valor actual (o en blanco si no está configurado). Si el tipo de pregunta espera respuestas de un conjunto de valores enumerados, la asignación de los códigos para mostrar valores es show.
bold tan text Muestra un valor de reemplazo de lima el valor Las cadenas de reemplazo de lima (como {TOKEN:xxx}, {PRIVACY_MESSAGE}) se muestran en texto tostado en negrita.
texto rojo Muestra operador de asignación (=) mensaje de advertencia Si utiliza uno de los operadores de asignación (=), ese operador se mostrará en texto rojo. Esto está destinado a ayudar a evitar la reasignación accidental de valores cuando realmente quería verificar si a == b en lugar de establecer el valor de a = b.
normal black text Muestra puntuación none Todos los demás signos de puntuación dentro de la expresión se muestran como texto negro normal.
texto en cuadro rojo una línea roja en negrita rodea el error error de sintaxis descripción del error Cualquier error de sintaxis detectado se muestra dentro de cuadros rojos. La información sobre herramientas muestra el error. Los ejemplos incluyen paréntesis no coincidentes, uso de funciones no definidas, pasar el número incorrecto de argumentos a funciones, expresiones mal estructuradas (por ejemplo, operadores faltantes entre variables), intentar asignar un nuevo valor a una variable de sólo lectura, intentar asignar valores a variables no definidas. -variables o usar sintaxis no compatible. Tenga en cuenta que el sistema de detección de errores de sintaxis solo puede informar un error en una expresión incluso si hay varios errores; sin embargo, si se detecta algún error, se mostrará al menos uno.


Template:Nota


Lectura adicional

Encuestas de muestra de ExpressionScript

Casos de uso y procedimientos

Ejemplos paso a paso

Referencia para desarrolladores

Mapa de ruta, estado, lista de tareas pendientes