Actions

Expression Manager/it: Difference between revisions

From LimeSurvey Manual

(Updating to match new version of source page)
(Updating to match new version of source page)
 
(183 intermediate revisions by one other user not shown)
Line 29: Line 29:
[[File:tutorial1.jpg]]
[[File:tutorial1.jpg]]


Relevance is shown and editable in the following places:
La pertinenza è mostrata e modificabile nei seguenti punti:


===Viewing / Editing Question-Level Relevance===
===Visualizzazione/modifica della pertinenza a livello di domanda===


This equation computes the Body Mass Index (BMI).  It is only asked if the person first enters their height and weight.
Questa equazione calcola l'indice di massa corporea (BMI). Viene chiesto solo se la persona inserisce prima altezza e peso.


[[File:tutorial2.jpg]]
[[File:tutorial2.jpg]]


This is the edit screen for the BMI question.
Questa è la schermata di modifica per la domanda BMI.


[[File:tutorial3.jpg]]
[[File:tutorial3.jpg]]


Note that you do not use the curly braces when you enter a Relevance Equation.
Si noti che non si utilizzano le parentesi graffe quando si immette un'equazione di rilevanza.


===Viewing / Editing Group-Level Relevance===
===Visualizzazione/modifica della pertinenza a livello di gruppo===


This is a sample census survey.  The first page asks how many people live with you and stores that in the "cohabs" variable.  This page is only shown if you have more than one cohabitant (so it is shown for the second person cohabitating with you), and also only shows if you specified how Person One is related to you (p1_rel).
Questo è un campione di censimento. La prima pagina chiede quante persone vivono con te e le memorizza nella variabile "cohabs". Questa pagina viene mostrata solo se hai più di un convivente (quindi viene mostrata per la seconda persona che convive con te), e mostra anche solo se hai specificato in che modo la Persona Uno è imparentata con te (p1_rel).


[[File:tutorial4.jpg]]
[[File:tutorial4.jpg]]


As you can see, the group also has question-level relevance criteria, such that each question only appears once you have answered the question before it (e.g. {!is_empty(p1_sex)}).  EM combines the Group and Question-level relevance for you.  Questions in a group are only asked  if the group as a whole is relevant.  Then, only the subset of questions within the group that are relevant are asked.
Come puoi vedere, il gruppo ha anche criteri di pertinenza a livello di domanda, in modo tale che ogni domanda appaia solo dopo che hai risposto alla domanda precedente (es. {!is_empty(p1_sex)}). EM combina per te la pertinenza a livello di gruppo e di domanda. Le domande in un gruppo vengono poste solo se il gruppo nel suo insieme è rilevante. Quindi, viene chiesto solo il sottoinsieme di domande pertinenti all'interno del gruppo.


Here is the screen for editing the group-level relevance for that question:
Ecco la schermata per modificare la pertinenza a livello di gruppo per quella domanda:


[[File:tutorial5.jpg]]
[[File:tutorial5.jpg]]


Note that you do not use the curly braces when you enter a Relevance Equation.
Si noti che non si utilizzano le parentesi graffe quando si immette un'equazione di rilevanza.


==Tailoring/Piping==
==Sartoria/Piping==


EM lets you easily do simple and complex conditional tailoring of your questions.  Sometimes you just need simple substitution, like saying, "You said you purchased <nowiki>[</nowiki>Product].  What did you like best about it?".  Sometimes you need conditional substitution like "<nowiki>[</nowiki>Mr./Mrs.] <nowiki>[</nowiki>LastName], would you be willing to complete our survey?".  In this case,  you want to use Mr. or Mrs. based upon the person's gender.  Other times you need even more complex substitution (such as based upon a mathematical computation).  EM supports each of these types of tailoring/piping.
EM ti consente di eseguire facilmente adattamenti condizionali semplici e complessi delle tue domande. A volte hai solo bisogno di una semplice sostituzione, come dire: "Hai detto di aver acquistato<nowiki> [</nowiki> Prodotto]. Cosa ti è piaciuto di più?". A volte hai bisogno di una sostituzione condizionale come "<nowiki> [</nowiki> Signor signora.]<nowiki> [</nowiki> Cognome], saresti disposto a completare il nostro sondaggio?". In questo caso, vuoi usare Mr. o Mrs. in base al sesso della persona. Altre volte hai bisogno di sostituzioni ancora più complesse (come basate su un calcolo matematico) EM supporta ciascuno di questi tipi di sartoria/piping.


===Conditional Equations===
===Equazioni condizionali===


The Body Mass Index example shows the ability to compute a person's BMI, even while letting them enter their height and weight in metric or non-metric units.
L'esempio dell'indice di massa corporea mostra la capacità di calcolare l'indice di massa corporea di una persona, anche lasciandole inserire altezza e peso in unità metriche o non metriche.


[[File:tailoring7.jpg]]
[[File:sartoria7.jpg]]


Here weight_kg is {if(weight_units == 'kg', weight, weight * .453592)}.  This if() function means that if the subject entered the weight using kilograms, use that value, otherwise multiply the entered value (which was in pounds) by .453592 to convert it to kilograms.  The height_m variable uses a similar approach to compute the person's height in meters, even if he entered his height in inches.
Qui peso_kg è {if(weight_units == 'kg', peso, peso * .453592)}. Questa funzione if() significa che se il soggetto ha inserito il peso usando i chilogrammi, usa quel valore, altrimenti moltiplica il valore inserito (che era in libbre) per .453592 per convertirlo in chilogrammi. La variabile height_m usa un approccio simile per calcolare l'altezza della persona in metri, anche se ha inserito la sua altezza in pollici.


BMI computes the weight formula as {weight_kg / (height_m * height_m)}.
BMI calcola la formula del peso come {peso_kg / (altezza_m * altezza_m)}.


Lastly, the report conditionally tailors the message for the subject, telling him what he entered. ("You said you are 2 meters tall and weight 70 kg.")
Infine, il rapporto adatta in modo condizionale il messaggio al soggetto, dicendogli cosa ha inserito. ("Hai detto che sei alto 2 metri e pesi 70 kg.")


Although not well shown in the above image, weight_status uses nested if() statements to categorize the person as underweight to severely obese.  You can see its equation in the Show Logic View
Anche se non ben mostrato nell'immagine sopra, weight_status utilizza istruzioni if() nidificate per classificare la persona da sottopeso a gravemente obesa. Puoi vedere la sua equazione nella vista Mostra logica


[[File:tailoring8.jpg]]
[[File:sartoria8.jpg]]


From the edit window for this question, you can see two things:
Dalla finestra di modifica per questa domanda, puoi vedere due cose:
#Tailoring must surround expressions with Curly Braces
#Tailoring deve circondare le espressioni con parentesi graffe
#Expressions can span multiple lines if, as in this case, you want to make it easier to read the nested conditional logic.
#Le espressioni possono estendersi su più righe se, come in questo caso, vuoi rendere più facile la lettura del logica condizionale annidata.


[[File:tailoring9.jpg]]
[[File:sartoria9.jpg]]


===Tailored Questions, Answers, and Reports===
===Domande, risposte e rapporti su misura===


<div class="simplebox">Note: Dynamic tailoring may not work if answer options are made available in select boxes on the same question page. This results from the fact that tailoring inserts a <nowiki><span></nowiki> tag which is not valid inside select options.</div>
<div class="simplebox">Nota: la personalizzazione dinamica potrebbe non funzionare se le opzioni di risposta sono rese disponibili in caselle selezionate nella stessa pagina della domanda. Ciò deriva dal fatto che la sartoria inserisce a<nowiki></nowiki> <span>tag che non è valido all'interno delle opzioni selezionate.</span>


This example shows the BMI report.
Questo esempio mostra il rapporto BMI.


[[File:tailoring10.jpg]]
[[File:tailoring10.jpg]]


Here is the edit window for the same question.
Ecco la finestra di modifica per la stessa domanda.


[[File:tailoring11.jpg]]
[[File:tailoring11.jpg]]


As you can see, anything in curly braces is treated as an expression, so is syntax-highlighted (color coded) in the prior image.  If you had any typos (such as misspelled or undefined variable names or functions), EM would show an error, such as this, showing that height_unit is an undefined variable name (it is actually height_units), and rnd() is an undefined function (the proper function name is round()).  In both cases, the errors are surrounded by a red box to make it easier to spot and fix them.
Come puoi vedere, qualsiasi cosa tra parentesi graffe viene trattata come un'espressione, quindi viene evidenziata la sintassi (con codice colore) nell'immagine precedente. In caso di errori di battitura (come nomi di variabili o funzioni con errori di ortografia o non definiti), EM mostrerebbe un errore, come questo, che mostra che height_unit è un nome di variabile non definito (in realtà è height_units) e rnd() è una funzione non definita (il nome corretto della funzione è round()). In entrambi i casi, gli errori sono circondati da un riquadro rosso per facilitarne l'individuazione e la correzione.


[[File:tailoring12.jpg]]
[[File:tailoring12.jpg]]


You can also see that you can quickly create complex reports, such as a table of entered values or tailored advice.
Puoi anche vedere che puoi creare rapidamente report complessi, come una tabella di valori inseriti o consigli personalizzati.


Please remember that all tailoring must surround expressions with Curly Braces, so that LimeSurvey knows which parts of the question are free text and which should be parsed through Expression Manager.
Ricorda che tutte le personalizzazioni devono circondare le espressioni con parentesi graffe, in modo che LimeSurvey sappia quali parti della domanda sono testo libero e quali devono essere analizzate tramite Expression Manager.


==Validation==
==Convalida==


EM controls how most of the advanced question options work.  These control aspects like min/max numbers of answers; min/max individual values; min/max sum values; and checking that entered values match specified string patterns.  You continue to enter those advanced question options as usual.  However, now any value in one of those fields is considered an expression, so you can have min/max criteria with complex conditional relationships to other questions.
EM controlla il funzionamento della maggior parte delle opzioni di domande avanzate. Questi controllano aspetti come il numero minimo/massimo di risposte; valori individuali min/max; valori somma min/max; e controllando che i valori immessi corrispondano ai modelli di stringa specificati. Continui a inserire quelle opzioni di domande avanzate come al solito. Tuttavia, ora qualsiasi valore in uno di questi campi è considerato un'espressione, quindi puoi avere criteri min/max con relazioni condizionali complesse con altre domande.


In all of these cases, since the advanced question option is always considered an expression, you do not use curly braces when specifying it.
In tutti questi casi, poiché l'opzione della domanda avanzata è sempre considerata un'espressione, non si usano le parentesi graffe quando la si specifica.


The [[Expression Manager sample surveys|Sample Surveys]] pages shows many working examples of using expressions for validations.
Le pagine [[Sondaggi di esempio di Expression Manager|Sondaggi di esempio]] mostrano molti esempi funzionanti dell'utilizzo delle espressioni per le convalide.


=Introduction=
=Introduzione=


LimeSurvey uses the new Expression Manager (EM) module which will let LimeSurvey support more complex branching, assessments, validation, and tailoring.  It will replace how LimeSurvey manages Replacements, Conditions, and Assessments on the back-end.  It will also speed up processing considerably since it eliminates most run-time database reads.  EM was developed by Dr. Thomas White (TMSWhite).
LimeSurvey utilizza il nuovo modulo Expression Manager (EM) che consentirà a LimeSurvey di supportare branching, valutazioni, convalida e personalizzazione più complessi. Sostituirà il modo in cui LimeSurvey gestisce le sostituzioni, le condizioni e le valutazioni nel back-end. Inoltre, accelererà notevolmente l'elaborazione poiché elimina la maggior parte delle letture del database in fase di esecuzione. EM è stato sviluppato dal Dr. Thomas White (TMSWhite).


This wiki page is the definitive reference for Expression Manager syntax and functionality.
Questa pagina wiki è il riferimento definitivo per la sintassi e la funzionalità di Expression Manager.


==Key Definitions==
==Definizioni chiave==
#'''Expression''':  Anything surrounded by curly braces
#'''Espressione''': Qualsiasi cosa racchiusa tra parentesi graffe
#*As long as there is no white space immediately after the opening brace or before the closing curly brace
#*Sempre che non vi siano spazi bianchi immediatamente dopo la parentesi graffa di apertura o prima della parentesi graffa di chiusura
#*The contents of Expressions are evaluted by EM, so they can contain mathematical formulas, functions, and complex string and date processing.
#*I contenuti delle espressioni sono valutati da EM, quindi possono contenere formule matematiche, funzioni ed elaborazioni complesse di stringhe e date.
#'''Tailoring''': Sometimes called "piping", this is the process of conditionally modifying text
#'''Adattamento''': a volte chiamato "piping", questo è il processo di modifica condizionale del testo
#*You have access to all 'replacement fields', participant data, and response data.
#*Hai accesso a tutti i "campi sostitutivi", ai dati dei partecipanti e ai dati delle risposte.
#*You also have easier access to questions, answers, and their properties.
#*Hai anche un accesso più facile a domande, risposte e alle loro proprietà.
#'''Relevance''' Equation:  A new question attribute controlling question visiblity
#'' 'Rilevanza''' Equazione: un nuovo attributo della domanda che controlla la visibilità della domanda
#*If there is a relevance equation, then the question is only shown if the relevance evaluates to true.
#*Se esiste un'equazione di rilevanza, la domanda viene mostrata solo se la pertinenza risulta vera.
#*Internally, all array_filter and array_filter_exclude commands become subquestion-level relevance
#*Internamente, tutti array_filter e array_filter_exclude i comandi diventano rilevanti a livello di sottodomanda
#'''Equation''' Question Type:  A new question type that saves calculations or reports to the database
#'''Equazione''' Tipo di domanda: un nuovo tipo di domanda che salva calcoli o report nel database
#*It is like a Boilerplate question, but its contents are saved to the database even if you set "Always Hide this Question"
#*È come una domanda Boilerplate, ma il suo contenuto viene salvato in il database anche se imposti "Nascondi sempre questa domanda"
#'''Question Code''':  This is the preferred variable name for EM
#'''Codice domanda''': questo è il nome di variabile preferito per EM
#*This can be a descriptive name indicating the purpose of the question, making it easier to read complex logic
#*Questo può essere un nome descrittivo che indica lo scopo della domanda , facilitando la lettura di logiche complesse
#*Valid question codes should NOT start with a number, so when using the question code to number your questions, simply use "q1", or "q1a" or "g1q2".
#*I codici domanda validi NON devono iniziare con un numero, quindi quando si utilizza il codice domanda per numerare le domande, utilizzare semplicemente "q1", o "q1a" o "g1q2".! N!#*Questo è ciò che attualmente diventa il nome della variabile se esporti i dati in SPSS o R, quindi se esegui un'analisi statistica, probabilmente l'hai già reso univoco.
#*This is what currently becomes the variable name if you export data to SPSS or R, so if you do statistical analysis, you probably already made this unique.


==Do I have to use EM?==
==Devo usare EM?==


The short answer is No (but also yes).
La risposta breve è No (ma anche sì).


EM is fully backwards-compatible with existing surveys.  So, if you are happy to use Conditions and Assessments in the style that LimeSurvey used in versions <= 1.91+, you can continue to do so.
EM è completamente retrocompatibile con i sondaggi esistenti. Quindi, se sei felice di utilizzare Condizioni e Valutazioni nello stile utilizzato da LimeSurvey nelle versioni <= 1.91+, puoi continuare a farlo.


However, EM completely replaces how LimeSurvey internally deals with Conditions.  Although you can still use the Conditions Editor to create and manage conditions, LimeSurvey 1.92 will convert those to the equivalent Relevance Equations.  As part of the upgrade, LimeSurvey 1.92 will auto-convert all existing Conditions to Relevance Equations.
Tuttavia, EM sostituisce completamente il modo in cui LimeSurvey gestisce internamente le condizioni. Sebbene tu possa ancora utilizzare l'editor delle condizioni per creare e gestire le condizioni, LimeSurvey 1.92 le convertirà nelle equazioni di pertinenza equivalenti. Come parte dell'aggiornamento, LimeSurvey 1.92 convertirà automaticamente tutte le condizioni esistenti in equazioni di rilevanza.


This should give you the best of both worlds - you can continue using LimeSurvey as you are used to, but will see the Relevance Equation equivalent so you can gradually migrate to Relevance Equations directly whenever you see fit.
Questo dovrebbe darti il meglio di entrambi i mondi: puoi continuare a utilizzare LimeSurvey come sei abituato, ma vedrai l'equivalente di Equazione di pertinenza in modo da poter migrare gradualmente a Equazioni di pertinenza direttamente ogni volta che lo ritieni opportuno.


==Can I mix use of Conditions and Relevance?==
==Posso combinare l'uso di Condizioni e Rilevanza?==


Yes. You can use the Conditions editor for some questions and the Relevance editor for others.  Conditions are auto-converted to Relevance when you save the question.
. Puoi utilizzare l'editor delle condizioni per alcune domande e l'editor della pertinenza per altre. Le condizioni vengono convertite automaticamente in Rilevanza quando salvi la domanda.


Note, we assume that if you are using the Conditions editor, that you want those Conditions to over-write any manually entered Relevance equation.  So, if you have existing Conditions and want to manually edit the Relevance, please delete the Conditions for that question first.  Specifically, copy the generated relevance equation to a text editor, use the Conditions menu to delete all of the conditions for that question (which will also delete the relevance), then edit the question and paste the generated relevance equation from the text editor back into the relevance field for that question (and save the question).  If there is enough demand for deleting conditions without deleting the generated relevance equation, we could add a bulk conversion process.
Nota, supponiamo che se stai utilizzando l'editor delle condizioni, desideri che tali condizioni sovrascrivano qualsiasi equazione di rilevanza inserita manualmente. Pertanto, se disponi di Condizioni esistenti e desideri modificare manualmente la Rilevanza, elimina prima le Condizioni per quella domanda. Nello specifico, copia l'equazione di pertinenza generata in un editor di testo, utilizza il menu Condizioni per eliminare tutte le condizioni per quella domanda (che eliminerà anche la pertinenza), quindi modifica la domanda e incolla nuovamente l'equazione di pertinenza generata dall'editor di testo in il campo di pertinenza per quella domanda (e salva la domanda). Se c'è una domanda sufficiente per eliminare le condizioni senza eliminare l'equazione di pertinenza generata, potremmo aggiungere un processo di conversione in blocco.


==How should I choose between Conditions and Relevance?==
==Come devo scegliere tra Condizioni e Rilevanza?==


Here is a list of pros and cons of each style:
Ecco un elenco di pro e contro di ogni stile:


{| class="wikitable"
{| class="wikitable"
!Style!!Pros!!Cons
!Stile!!Pro!!Svantaggi
|-
|-
|Conditions||1. Nice GUI for creating simple conditions <br/>2. GUI well documented and understood by support team||1. Only supports simple comparisons and does not AND/OR conditions well <br/>2. Cascading conditions work erratically <br/>3. Slow - database intensive, so can slow down long surveys <br/>4. Some reported problems with re-loading conditions <br/>5. GUI doesn't scale well when there are dozens, hundreds, or thousands of questions <br/>6. May be slow to convert paper-based surveys since must use SGQA names <br/>7. Often need a programmer to custom-code logic needed for complex branching
|Condizioni||1. Bella GUI per la creazione di condizioni semplici<br/> 2. GUI ben documentata e compresa dal team di supporto||1. Supporta solo semplici confronti e non AND/OR condiziona bene<br/> 2. Le condizioni a cascata funzionano in modo irregolare<br/> 3. Lento: database intensivo, quindi può rallentare lunghi sondaggi<br/> 4. Alcuni problemi segnalati con le condizioni di ricaricamento<br/> 5. La GUI non si adatta bene quando ci sono dozzine, centinaia o migliaia di domande<br/> 6. Potrebbe essere lento convertire i sondaggi cartacei poiché devono utilizzare i nomi SGQA<br/> 7. Spesso è necessario un programmatore per codificare in modo personalizzato la logica necessaria per ramificazioni complesse
|-
|-
|Relevance||1. Supports very complex logic, including 80+ functions and math/string operators <br/>2. Perfect support for cascading logic <br/>3. Fast - no extra database calls, so supports 1000+ question surveys <br/>4. No problems with re-loading logic since does not require SGQA codes <br/>5. Syntax-highlighting scales to 1000+ question surveys <br/>6. Easy and fast to use for groups wanting to computerize existing paper-based suveys.  <br/>7. Easily supports semi-structured interviews and epidemiological surveys without needing a programmers||1. No GUI for simple conditions - use syntax-highlighting instead <br/>2. New, so support teams have not mastered EM yet.
|Rilevanza||1. Supporta logiche molto complesse, incluse oltre 80 funzioni e operatori matematici/stringa<br/> 2. Supporto perfetto per la logica a cascata<br/> 3. Veloce: nessuna chiamata aggiuntiva al database, quindi supporta oltre 1000 sondaggi di domande<br/> 4. Nessun problema con la logica di ricarica poiché non richiede codici SGQA<br/> 5. L'evidenziazione della sintassi scala fino a oltre 1000 sondaggi di domande<br/> 6. Facile e veloce da usare per i gruppi che vogliono informatizzare i sondaggi cartacei esistenti.<br/> 7. Supporta facilmente interviste semi-strutturate e indagini epidemiologiche senza bisogno di programmatori||1. Nessuna GUI per condizioni semplici: usa invece l'evidenziazione della sintassi<br/> 2. Nuovo, quindi i team di supporto non hanno ancora acquisito padronanza di EM.
|}
|}


The bottom is that if you are happy with how LimeSurvey 1.91+ works, there is no reason to change what you do.
Il fondo è che se sei soddisfatto di come funziona LimeSurvey 1.91+, non c'è motivo di cambiare ciò che fai.


==What are some other benefits of using EM?==
==Quali sono gli altri vantaggi dell'utilizzo di EM?==


Here are some of the other reasons you might want to use EM.
Ecco alcuni degli altri motivi per cui potresti voler utilizzare EM.
#Calculations - you can create any calculation you can think of:
#Calcoli: puoi creare qualsiasi calcolo ti venga in mente:
#*You have access to all common mathematical operators and functions
#*Hai accesso a tutti i comuni operatori e funzioni matematiche
#*You have access to 70+ mathematical, date, and string processing functions
#* Hai accesso a oltre 70 funzioni matematiche, di data e di elaborazione di stringhe
#*It is fairly easy for developers to add new functions if users need them
#*È abbastanza facile per gli sviluppatori aggiungere nuove funzioni se gli utenti ne hanno bisogno
#Storing Calculations to Database
#Memorizzazione dei calcoli nel database
#*You can now compute simple and complex calculations and/or scale scores AND have them stored in the database without needing JavaScript.
#*Ora puoi calcolare calcoli semplici e complessi e/o punteggi di scala E li hai memorizzati nel database senza bisogno di JavaScript.
#*You use the Equation question type to accomplish this.
#*Usa il tipo di domanda Equazione per eseguire questa operazione.
#Assessments
#Valutazioni
#*You can now create assessments or scale scores from any question type, not just the subset that used to be supported
#*Ora puoi creare valutazioni o ridimensionare i punteggi di qualsiasi tipo di domanda, non solo del sottoinsieme che era supportato
#*You can use Tailoring to show running or total assessment scores anywhere needed - even on the same page
#*Puoi utilizzare Tailoring per mostrare i punteggi delle valutazioni correnti o totali ovunque sia necessario, anche sulla stessa pagina
#*You have more control over the reports generated based upon those assessment scores
#*Hai più controllo sui report generati in base a tali punteggi di valutazione
#*You can store assessment scores in the database without needing JavaScript
#*Puoi memorizzare i punteggi di valutazione nel database senza bisogno di JavaScript
#*You can hide assessment scores without needing JavaScript or CSS
#*Puoi nascondere i punteggi di valutazione senza bisogno di JavaScript o CSS
#Replacement Fields
#Campi sostitutivi
#*Instead of using {INSERTANS:SGQA}, you can just use the Question Code - this makes it easier to read and validate.
# *Invece di utilizzare {INSERTANS:SGQA}, puoi semplicemente utilizzare il codice domanda: questo semplifica la lettura e la convalida.
#*This also avoids the common need to edit questions to change the SGQA code to make everything work.
#*Questo evita anche la necessità comune di modificare le domande per cambiare il codice SGQA per far funzionare tutto .
#Tailoring - you can conditionally display text based upon other values
#Tailoring - puoi visualizzare in modo condizionale il testo basato su altri valori
#*Use the appropriate title for a subject, like (e.g. "Hello <nowiki>[</nowiki>Mr./Mrs.] Smith")
#*Usa il titolo appropriato per un oggetto, come (es. "Ciao<nowiki> [</nowiki> Mr./Mrs.] Smith")
#*Output gramatically correct sentences based when singular/plural matter:  (e.g. "You have 1 child" vs. "You have 2 children")
#*Produce frasi grammaticalmente corrette in base al singolare/plurale: (ad es. "You have 1 child" vs. "You have 2 children")
#*Appropriately conjugate verbs and decline nouns based upon subject's gender and plurality.
#*Coniugazione appropriata dei verbi e rifiuta i nomi in base al genere e alla pluralità del soggetto.
#New Variable Attributes - you can access the following to do your tailoring:
#Nuovi attributi variabili: puoi accedere a quanto segue per personalizzare:
#* (no suffix) -  an alias for qcode.code
#* (nessun suffisso) - un alias per qcode.code
#*.code - the selected response code for the question if it is relevant (otherwise blank), or the text value if it is not a coded question
#*. code - il codice di risposta selezionato per la domanda se è rilevante (altrimenti vuoto), o il valore del testo se non è una domanda codificata
#*.NAOK - same as .code, but can be part of calculations or lists even if irrelevant
#*.NAOK - uguale a .code, ma può far parte di calcoli o elenchi anche se irrilevante
#*.value - the assessment value for the question if it is relevant (otherwise blank), or the text value if it is not a coded question -- available is assesments are enabled for the survey, otherwise always zero
#*.value - il valore di valutazione per la domanda se è rilevante (altrimenti vuoto), o il valore di testo se non è una domanda codificata -- disponibile se le valutazioni sono abilitate per il sondaggio, altrimenti sempre zero
#*.valueNAOK - same as .value, but can be part of calculations or lists even if irrelevant
#*.valueNAOK - uguale a .value, ma può far parte di calcoli o liste anche se irrilevante
#*.shown - the answer as displayed to the user (this is what {INSERTANS:xxx}  does)
#*.shown - la risposta mostrata all'utente (questo è ciò che fa {INSERTANS:xxx} )
#*.qid - the question ID
#*.qid - l'ID domanda
#*.gid - the group ID
#*.gid - l'ID gruppo
#*.sgqa - the SGQA value for the question
#*.sgqa - il valore SGQA per la domanda
#*.jsName - the correct javascript variable name for the question, regardless whether defined on this page or another
#*.jsName - il nome corretto della variabile javascript per la domanda, indipendentemente dal fatto che sia definita in questa pagina o in un'altra
#*.qseq - the question sequence (starting from 0)
#*.qseq - la sequenza della domanda (a partire da 0)
#*.gseq - the group sequence (starting from 0)
#*.gseq - la sequenza del gruppo (a partire da 0)
#*.mandatory - whether the question is mandatory (Y/N)
#*. obbligatori - se la domanda è obbligatoria (S/N)
#*.question - the text of the question
#*.question - il testo della domanda
#*.relevance - the relevance equation for the question
#*.relevance - l'equazione di rilevanza per la domanda
#*.grelevance - the relevance equation for the group
#*.grelevance - l'equazione di rilevanza per il gruppo
#*.relevanceStatus - whether or not the question is currently relevant (boolean (can be different in PHP and JS))
#*.relevanceStatus - se la domanda è attualmente pertinente o meno (booleano (può essere diverso in PHP e JS))
#*.type - the question type (the one character code)
#*.type - il tipo di domanda (il codice di un carattere)!N !#Modifiche dinamiche sulla pagina
#Dynamic On-Page Changes
#*Tutte le pertinenze, i calcoli e la personalizzazione funzionano in modo dinamico su una pagina, quindi le modifiche ai valori aggiornano istantaneamente la pagina
#*All Relevance, Calculation, and Tailoring works dynamically on a page - so changes in values instantly update the page
#*Quindi, le domande appaiono/scompaiono dinamicamente a seconda che sono pertinenti
#*So, you have questions dynamically appear/disappear based upon whether they are relevant
#*Anche le domande sono adattate dinamicamente in base alle risposte sulla pagina, quindi puoi vedere i totali parziali, le frasi personalizzate e i rapporti personalizzati.
#*Questions are also dynamically tailored based upon responses on the page, so you can see running totals, tailored sentences and customized reports.
#Nuova schermata di immissione dati
#New Data Entry Screen
#*Oltre a utilizzare l'attuale sistema di inserimento dati, puoi semplicemente utilizzare Survey-All-In-One.
#*In addition to using the current data-entry system, you can just use Survey-All-In-One.
#*Questo supporta la pertinenza e la personalizzazione della pagina, quindi gli addetti all'inserimento dati possono scorrere rapidamente e dovranno solo inserire il risposte pertinenti
#*This supports the on-page relevance and tailoring, so data entry clerks can quickly tab through and they will only have to enter the relevant responses
#*Questo può essere fondamentale se la persona che inserisce i dati ha bisogno di vedere la personalizzazione, che è anche dinamica.
#*This can be critical if your data entry person needs to see the tailoring, which is also dynamic.
#Elimina la necessità della maggior parte dei JavaScript personalizzati
#Eliminates the need for most custom JavaScript
#*EM supporta facilmente calcoli complicati, punteggio , sartoria e logica condizionale.
#*EM easily supports complicated computations, scoring, tailoring and conditional logic.
#*Alcune cose avranno ancora bisogno di JavaScript (come layout personalizzati e sotto-elementi delle domande nascosti in modo condizionale), ma il tuo JavaScript può utilizzare le funzioni EM in modo che tu possa accedere alle domande tramite il loro Qcode invece di SGQA e accedere a qualsiasi proprietà della domanda sopra elencata.
#*Some things will still need JavaScript (like custom layouts and conditionally hiding question sub-elements), but your JavaScript can use the EM functions so that you can access questions by their Qcode instead of SGQA, and access any of the question properties listed above.


==What are some other helpful new features enabled by EM?==
==Quali sono altre utili nuove funzionalità abilitate da EM?==


Regardless of whether you continue to use the Conditions Editor or manually compose Relevance Equations, you get these additional benefits:
Indipendentemente dal fatto che tu continui a utilizzare l'editor delle condizioni o a comporre manualmente le equazioni di pertinenza, ottieni questi vantaggi aggiuntivi:
#You can create more complex validation criteria
#Puoi creare criteri di convalida più complessi
#*All of the advanced question attribute (like max_answers, min_num_value_n, max_num_value) can use Expressions.  So, you min/max criteria can be easily adjusted based upon prior responses, even if they are on the same page.
#*Tutti gli attributi delle domande avanzate (come max_answers, min_num_value_n, max_num_value) può utilizzare le espressioni. Pertanto, i criteri min/max possono essere facilmente regolati in base alle risposte precedenti, anche se si trovano sulla stessa pagina.
#*EM also handles all regular-expression-based validation, so you can robustly combine preg and equation-based question attributes.
#*EM gestisce anche tutte le convalide basate sulle espressioni regolari, in modo da poter combinare in modo affidabile preg ed equazione- basati sugli attributi delle domande.
#Easy Re-ordering (or deleting) of Questions and Groups
#Facile riordinamento (o eliminazione) di domande e gruppi
#*Prior to version 1.92, you could not re-order questions or groups if LimeSurvey thought that such-re-ordering could break conditions in which they were used.  Similarly, you could not delete questions if any other questions depended upon them.
#*Prima della versione 1.92, non era possibile riordinare domande o gruppi se LimeSurvey riteneva che tale riordinamento potesse interrompersi condizioni in cui sono stati utilizzati. Allo stesso modo, non è possibile eliminare le domande se qualsiasi altra domanda dipende da esse.
#*With EM's syntax highlighting, it is easy to see and validate whether you try to use questions before they are declared.  So, we now let you re-order or delete questions and groups whenever you like.  EM will update all of the syntax highlighting to show you potential errors.
#*Con l'evidenziazione della sintassi di EM, è facile vedere e convalidare se si tenta di utilizzare le domande prima che vengano dichiarate. Quindi, ora ti consentiamo di riordinare o eliminare domande e gruppi quando vuoi. EM aggiornerà tutta l'evidenziazione della sintassi per mostrarti potenziali errori.
#*The re-order questions view has been enhanced to help with such review.  It now shows the question's relevance equation and tailoring, so you can immediately see whether any variables become pink (meaning they are used before being declared).
#*La visualizzazione delle domande di riordino è stata migliorata per facilitare tale revisione. Ora mostra l'equazione di pertinenza e l'adattamento della domanda, in modo da poter vedere immediatamente se le variabili diventano rosa (nel senso che vengono utilizzate prima di essere dichiarate).
#The Question/Group Navigation Index is always available and accurate
#L'indice di navigazione della domanda/gruppo è sempre disponibile e accurato
#*Prior to version 1.92, these indexes were not available if there were complex conditions
#* Prima della versione 1.92, questi indici non erano disponibili in presenza di condizioni complesse
#*With EM, we can guarantee that they are accurate.
#*Con EM, possiamo garantire che siano accurati.
#*Subjects can even jump back, to a prior question, change the answer, then jump forward (or submit)
#*I soggetti possono persino tornare indietro, a una domanda precedente, modificare la risposta , quindi salta in avanti (o invia)
#**When jumping forwards, EM will re-validate all of the intervening questions/groups.
#**Quando salti in avanti, EM convaliderà nuovamente tutte le domande/gruppi intervenuti.
#**If any questions become irrelevant, they will be NULLed in the database so that your data is internally consistent
#**Se qualsiasi domanda diventa irrilevante, verrà NULLATA nel database in modo che i tuoi dati siano internamente coerenti
#**If any questions become relevant or newly fail mandatory or validation rules, EM will stop on that page and force the user to answer those questions before jumping to their final destination.
#**Se qualsiasi domanda diventa pertinente o non rispetta le regole obbligatorie o di convalida, EM si fermerà su quella pagina e obbligherà l'utente a rispondere a tali domande prima di passare alla destinazione finale.
#Auto-conversion of Conditions to Relevance
#Conversione automatica delle condizioni in pertinenza
#*When you upgrade your database, all existing surveys that have conditions will have relevance equations generated for them
#*Quando aggiorni il tuo database, tutte le indagini esistenti che hanno condizioni avranno equazioni di pertinenza generate per esse
#*Whenever you import a survey, relevance equations will be created as needed
#*Ogni volta che importi un'indagine, le equazioni di pertinenza verranno create secondo necessità
#*Whenever you add, delete, or modify conditions, EM will generate the appropriate relevance equation.
#*Ogni volta che aggiungi, elimini o modifichi condizioni, EM genererà l'equazione di rilevanza appropriata.
#Convenient Syntax Highlighting
#Evidenziazione della sintassi conveniente
#*When EM shows the relevance equation, it will show the Qcode, even if you entered an SGQA code, as we assume this will be easier to read.
#*Quando EM mostra l'equazione di rilevanza, mostrerà il Qcode, anche se hai inserito un codice SGQA, poiché presumiamo che sarà più facile da leggere.
#*All variables are color coded to show whether they were declared before or after the current question (or before or after the current group).  This lets you quickly detect and fix cases where you try to use variables for relevance (including array_filter), tailoring, or validation equations prior to declaring them.
#*Tutte le variabili sono codificate a colori per mostrare se sono state dichiarate prima o dopo la domanda corrente (o prima o dopo il gruppo corrente). Ciò ti consente di rilevare e correggere rapidamente i casi in cui provi a utilizzare le variabili per la pertinenza (incluso array_filter), la personalizzazione o le equazioni di convalida prima di dichiararle.
#*In addition, if you hover your mouse over the color-coded variable, you will see the most important metadata about that question.   This includes the Group Sequence #, Question Sequence #, Qcode, Text of the question, and all available answer choices (if it is a question type with enumerated answer choices).
#*Inoltre, se passi il mouse sopra la variabile con codice colore , vedrai i metadati più importanti relativi a quella domanda. Ciò include la sequenza di gruppo n., la sequenza di domande n., il Qcode, il testo della domanda e tutte le scelte di risposta disponibili (se si tratta di un tipo di domanda con scelte di risposta enumerate).
#**The list of answer choices uses this syntax:  'answers':{key:val, ... }.
#**L'elenco delle scelte di risposta utilizza questa sintassi : 'risposte':{key:val, ... }.
#**''key'' has the syntax ''''scale~code'''' where ''scale'' is the answer scale (e.g. for dual scale), and ''code'' is the answer code.
#**''key'' ha la sintassi ''''scale~code'''' dove ''scale'' è la scala della risposta (es. per doppia scala), e ''code'' è il codice di risposta.
#**''val'' has the syntax ''''value~shown'''' where ''value'' is the assessment value (if using assessments, otherwise ''code'')(e.g. Qcode.value), and ''shown'' is the display value as seen by the subject (e.g. Qcode.shown)
#**''val'' ha la sintassi ''''value~shown'''' dove ''value'' è il valore della valutazione (se si utilizzano le valutazioni, altrimenti ''code'')(es. Qcode.value), e ''shown'' è il valore visualizzato dal soggetto (es. Qcode.shown)
#**This means that many surveys can use calculations without needing assessment mode.  If you have enumerated answer options  that are unique, non-decimal, and non-negative, you can simply do calculations on the Qcode.code values.
#**Questo significa che molti sondaggi possono utilizzare i calcoli senza bisogno della modalità di valutazione. Se hai enumerato opzioni di risposta univoche, non decimali e non negative, puoi semplicemente eseguire calcoli sui valori Qcode.code.
#Easy review of entire survey logic and content
#Facile revisione dell'intera logica e contenuto del sondaggio
#*There is a new Show Survey Logic feature that lets you see everything about the survey (or group or question) on a single page.
#*C'è una nuova funzione Mostra logica sondaggio che ti consente di vedere tutto ciò che riguarda il sondaggio (o gruppo o domanda) su una singola pagina.
#*It shows the Group, Question, Sub-Question, and Answer-level details for the selected scope (survey vs. group vs. question)
#*Mostra i dettagli a livello di gruppo, domanda, sotto-domanda e risposta per l'ambito selezionato (sondaggio vs. gruppo vs. domanda)
#*It also shows the relevance, subquestion-level relevance (for array_filter and array_filter_exclude), and generated validation equation (for preg and any validation rules like min/max sum/number of values), and all non-blank question attributes.
#*Mostra anche la pertinenza, la pertinenza a livello di sottodomanda (per array_filter e array_filter_exclude) e l'equazione di validazione generata (per preg e qualsiasi regola di validazione come min/max sum/number of valori) e tutti gli attributi delle domande non vuote.
#*Everything is syntax-highlighted so that you can see potential syntax errors (like unbalanced parentheses or use of variables before they were declared)
#*Tutto è evidenziato in sintassi in modo da poter vedere potenziali errori di sintassi (come parentesi non bilanciate o uso di variabili prima che fossero dichiarate)
#*The syntax-highligting supports rapid navigation and editing of the survey.
#*La sintassi- l'evidenziazione supporta la navigazione e la modifica rapide del sondaggio.
#**If you click on a variable name, it opens a browser window (or tab) that shows you that question and lets you edit it.
#**Se fai clic sul nome di una variabile, si apre una finestra del browser (o scheda) che mostra quella domanda e ti consente di modificarla.
#**If you click on a group name, it opens a browser window (or tab) showing the group-reorder view so that you can easily move questions around.
#** Se fai clic sul nome di un gruppo, si apre una finestra del browser (o scheda) che mostra la vista di riordino del gruppo in modo da poter spostare facilmente le domande.
#**All of the question attributes are also syntax highlighted.  This lets you set and see expressions within advanced question options (like basing the max/min number/sum of values on an expression)
#**Tutti gli attributi della domanda sono anche evidenziati nella sintassi. Ciò ti consente di impostare e visualizzare le espressioni all'interno delle opzioni di domanda avanzate (come basare il numero massimo/minimo/la somma dei valori su un'espressione)
#*The EM author used similar view (a little cleaner) to let his collaborating Epidemiologists and Institutional Review Board validate and authorize surveys with thousands of questions in highly branched and tailored structured interviews
#*L'autore di EM ha utilizzato una visualizzazione simile (un po' più chiara) per consentire ai suoi collaboratori epidemiologi e istituzionali Review Board convalida e autorizza sondaggi con migliaia di domande in interviste strutturate altamente ramificate e personalizzate


=Getting Started=
=Per iniziare=


The best way to get started with EM is to:
Il modo migliore per iniziare con EM è:
*Install the latest stable version from http://www.limesurvey.org/en/download  
*Installare l'ultima versione stabile da http://www.limesurvey.org/en/download  
*Import and explore the [[ExpressionScript sample surveys|sample surveys]].
*Importare ed esplorare i [[Sondaggi di esempio ExpressionScript|sondaggi di esempio ]].
*Explore the [[ExpressionScript How-tos|use cases and HowTos]] and [[ExpressionScript examples|step-by-step examples]].
*Esplora [[ExpressionScript How-tos|casi d'uso e HowTo]] e [[Esempi ExpressionScript|esempi passo-passo]].
*Explore the EM documentation (this page)
*Esplora la documentazione EM (questa pagina)! N!*Esamina la suite di test EM integrata
*Examine the built-in EM test suite
**Da qualsiasi sondaggio, in Strumenti, seleziona l'opzione EM
**From any survey, under tools, select the EM option
**Funzioni disponibili elenca le oltre 70 funzioni e la sintassi
**Available Functions lists the 70+ functions and syntax
**Test unitari di test isolati Expressions
**Unit Tests of Isolated Expressions
***mostra esempi di utilizzo di tutte le funzioni e gli operatori EM e i risultati PHP e JavaScript
***shows examples of using all EM functions and operators, and the PHP and JavaScript results
***nota che ci sono poche funzioni che generano risultati diversi nelle versioni PHP e JavaScript, quindi questa pagina ti consente pianifica la tua logica EM di conseguenza.
***note there are few functions that generate different results in the PHP and JavaScript versions, so this page lets you plan your EM logic accordingly.


=What Functionality does Expression Manager Extend/Replace? (LimeSurvey <= 1.91+)=
=Quali funzionalità vengono estese/sostituite da Expression Manager? (LimeSurvey <= 1.91+)=


==Conditions => Relevance==
==Condizioni => Rilevanza==


Conditions controlled which  questions are visible.  The general syntax was ''SGQA operator Value'', like ''111X2X3 == "Y"''.  Conditions could be ANDed or ORed together, but mixing ANDs and ORs was difficult.  The conditions themselves were stored in a separate table, and large portion of LimeSurvey's code was devoted to managing Conditions.  Because of extensive database access, processing large numbers of conditions could cause noticable performance problems.  Furthermore, once you had conditions assigned to questions or groups, you were often not allowed to re-order or delete them.
Le condizioni controllano quali domande sono visibili. La sintassi generale era ''SGQA operator Value'', come ''111X2X3 == "Y"''. Le condizioni potevano essere combinate in AND o OR insieme, ma mescolare AND e OR era difficile. Le condizioni stesse erano memorizzate in una tabella separata e gran parte del codice di LimeSurvey era dedicato alla gestione delle condizioni. A causa dell'ampio accesso al database, l'elaborazione di un numero elevato di condizioni potrebbe causare notevoli problemi di prestazioni. Inoltre, una volta assegnate le condizioni alle domande o ai gruppi, spesso non era consentito riordinarli o eliminarli.


==Assessments => Equations and  Micro-Tailoring==
==Valutazioni => Equazioni e Micro-Adattamento==


Assessments let users create scale scores from a collection of questions.  However, they could not dynamically change on the current page, and their values were not stored to the database.
Le valutazioni consentono agli utenti di creare punteggi di scala da una raccolta di domande. Tuttavia, non potevano cambiare dinamicamente nella pagina corrente e i loro valori non venivano archiviati nel database.


==Replacements => Micro-Tailoring==
==Sostituzioni => Micro-Sartoria==


Users could tailor some messages and questions based  upon prior responses.  For example, a question might be, ''{TOKEN:FIRSTNAME}, you said {INSERTANS:111X3X4} was your favorite sport''.  However, it was not possible to do conditional tailoring (like say "Mr." or "Mrs." depending upon the person's gender), or conjugate verbs or decline nouns without fancy JavaScript.  Authors could implement surveys that seemed to tailor questions, but it required separate questions for each permutation, and complex conditions to decide which questions to display.
Gli utenti possono personalizzare alcuni messaggi e domande in base alle risposte precedenti. Ad esempio, una domanda potrebbe essere ''{TOKEN:FIRSTNAME}, hai detto che {INSERTANS:111X3X4} era il tuo sport preferito''. Tuttavia, non era possibile adattare le condizioni (come dire "Mr." o "Mrs." a seconda del genere della persona), o coniugare verbi o rifiutare sostantivi senza JavaScript di fantasia. Gli autori potevano implementare sondaggi che sembravano adattare le domande, ma richiedevano domande separate per ogni permutazione e condizioni complesse per decidere quali domande visualizzare.


==Validation==
==Convalida==


Question could be validated with Regular expressions, or minimum/maximum values, or let an SGQA response serve as the minimum or maximum value.  However, validations could not be based upon calculations of other variables without fancy JavaScript.
La domanda può essere convalidata con espressioni regolari o valori minimo/massimo oppure lasciare che una risposta SGQA serva come valore minimo o massimo. Tuttavia, le convalide non possono essere basate su calcoli di altre variabili senza JavaScript di fantasia.


==Equations==
==Equazioni==


Equations were not supported without fancy JavaScript.
Le equazioni non erano supportate senza JavaScript di fantasia.


==Equation Question Type==
==Tipo di domanda equazione==


Equations could not be saved to the database (e.g. the final score for an assessment) without fancy JavaScript.
Le equazioni non possono essere salvate nel database (ad es. il punteggio finale per una valutazione) senza JavaScript sofisticato.


=How Will Expression Manager Replace/Extend That Functionality?=
=In che modo Expression Manager sostituirà/estenderà tale funzionalità?=


The Expression Manager is a new core module within LimeSurvey that makes it much easier to support the type of complex functionality that used to require custom JavaScript.  It is also replacing the way LimeSurvey currently manages Conditions and Assessments.
Expression Manager è un nuovo modulo principale all'interno di LimeSurvey che rende molto più semplice supportare il tipo di funzionalità complesse che prima richiedevano JavaScript personalizzato. Sta anche sostituendo il modo in cui LimeSurvey attualmente gestisce Condizioni e Valutazioni.


==New Terminology When Referring to Expression Manager (EM)==
==Nuova terminologia quando si fa riferimento a Expression Manager (EM)==


EM "thinks" of its functionality in the following terms:
EM "pensa" alla sua funzionalità nei seguenti termini:
*'''Relevance-based Branching''' - if a question is relevant, then ask it, otherwise don't (e.g. make it invisible, and mark it as NULL in the database).  There is a new Relevance field for all Question types, and also for each Group (so you can apply a set of conditions to an entire group without having to copy the same condition to each question, and/or combine group and question-level conditional logic).
*'''Branching basato sulla pertinenza''' - se una domanda è rilevante, allora ponila, altrimenti non farlo (ad es. rendila invisibile e contrassegnala come NULL nel database). C'è un nuovo campo Rilevanza per tutti i tipi di domanda e anche per ogni gruppo (quindi puoi applicare una serie di condizioni a un intero gruppo senza dover copiare la stessa condizione a ogni domanda e/o combinare condizioni di gruppo e a livello di domanda logica).
*'''Tailoring''' - Once you know which questions should be asked, tailoring (sometimes called ''piping'') specifies how the question should be asked. This lets you support not only simple subsitution (like {TOKEN:FIRSTNAME}), but also conjugation of verbs and declination of nouns based upon the gender or number of your subjects.  It also lets you change the message you deliver to a subject based upon whether they answered (or how they answered) other questions.
*'''Tailoring''' - Una volta che sai quali domande dovrebbero essere poste, il tailoring (a volte chiamato ''piping'') specifica come la domanda dovrebbe essere posta. Ciò ti consente di supportare non solo la semplice sostituzione (come {TOKEN:FIRSTNAME}), ma anche la coniugazione dei verbi e la declinazione dei sostantivi in base al genere o al numero dei tuoi soggetti. Ti consente anche di modificare il messaggio che invii a un soggetto in base al fatto che abbia risposto (o come abbia risposto) ad altre domande.
*'''Equations''' - EM adds a new question type called Equation which stores the result of an Expression.  These equations results are computed and written to the database, even if you hide them on the page.  Thus, they are useful for hidden scoring calculations, navigation based upon complex equations, assessments, and reports that should be generated and easily available within the database.
*'''Equazioni''' - EM aggiunge un nuovo tipo di domanda chiamato Equazione che memorizza il risultato di un'Espressione. I risultati di queste equazioni vengono calcolati e scritti nel database, anche se li nascondi nella pagina. Pertanto, sono utili per calcoli di punteggio nascosti, navigazione basata su equazioni complesse, valutazioni e report che dovrebbero essere generati e facilmente disponibili all'interno del database.


===Relevance and Cascading Relevance===
===Pertinenza e pertinenza a cascata===


Every question type now has a Relevance option which controls whether the question is displayed.  EM processes each of the Relevance Equations in the order they should appear in the survey.  If the expression is true (or missing - to support legacy surveys), the question will be displayed. If it is not relevant, then the question will be hidden, and the value will be NULLed in the database.  If there are no relevant questions in a group, the entire group will be skipped.
Ogni tipo di domanda ora ha un'opzione Rilevanza che controlla se la domanda viene visualizzata. EM elabora ciascuna delle equazioni di rilevanza nell'ordine in cui dovrebbe apparire nel sondaggio. Se l'espressione è vera (o mancante - per supportare i sondaggi precedenti), verrà visualizzata la domanda. Se non è rilevante, la domanda verrà nascosta e il valore verrà annullato nel database. Se non ci sono domande pertinenti in un gruppo, l'intero gruppo verrà saltato.


Moreover, if any of the variables within an expression is irrelevant, then the expression always evaluates to false.  This enables Cascading Relevance so that you do not have to write very long Relevance equations for each question.
Inoltre, se una qualsiasi delle variabili all'interno di un'espressione è irrilevante, l'espressione restituisce sempre false. Ciò abilita la pertinenza a cascata in modo da non dover scrivere equazioni di pertinenza molto lunghe per ogni domanda.


Say you have 5 questions Q1-Q5, and you only want to show Q2 if Q1 was answered, and Q3 if Q2 was answered, etc.  The relevance equations might be:
Supponiamo che tu abbia 5 domande Q1-Q5 e desideri solo mostrare Q2 se è stata data risposta a Q1 e Q3 se è stata data risposta a Q2, ecc. Le equazioni di rilevanza potrebbero essere:


{| class="wikitable"
{| class="wikitable"
!Question Code!!Relevance!!Question
!Codice domanda!!Rilevanza!!Domanda
|-
|-
|Q1||1||What is your name?
|Q1||1||Come ti chiami?
|-
|-
|Q2||Q1||{Q1}, how old are you?
|Q2||Q1 ||{Q1}, quanti anni hai?
|-
|-
|Q3||Q2||So, you are {Q2} years old.  Are you married?
|Q3||Q2||Allora, hai {Q2} anni. Sei sposato?
|-
|-
|Q4||Q3 == "Y"||{Q1}, how long have you been married?
|Q4||Q3 == "S"||{Q1}, da quanto tempo sei sposato?
|-
|-
|Q5||Q4||How many children do you have, {Q1}?
|Q5||Q4|| Quanti figli hai, {Q1}?
|}
|}


The relevance calculations also work in JavaScript - so you could put all the above questions on one page and it would still work as expected.  In fact, EM totally replaces how EM processes Survey vs. Group vs. Question-at-a-time survey formats.  They now all use the exactly same navigation engine so they work identically regardless of survey style.
I calcoli di pertinenza funzionano anche in JavaScript, quindi puoi inserire tutte le domande di cui sopra su una pagina e funzionerebbe comunque come previsto. In effetti, EM sostituisce totalmente il modo in cui EM elabora i formati di indagine Survey vs. Group vs. Question-at-a-time. Ora utilizzano tutti esattamente lo stesso motore di navigazione, quindi funzionano in modo identico indipendentemente dallo stile del sondaggio.


As long as you are on the same page, any data you entered will still be there, just hidden.  So, if you enter some information, then choose an option that makes them irrelevant, then make them relevant again, your answers will still be available.  However, as soon as you move to a different page, all irrelevant responses will be lost to integrity of the dataset.
Finché ti trovi sulla stessa pagina, tutti i dati che hai inserito saranno ancora lì, solo nascosti. Quindi, se inserisci alcune informazioni, quindi scegli un'opzione che le rende irrilevanti, quindi rendile nuovamente rilevanti, le tue risposte saranno ancora disponibili. Tuttavia, non appena si passa a una pagina diversa, tutte le risposte irrilevanti andranno perse per l'integrità del set di dati.


===Group-Level Relevance===
===Rilevanza a livello di gruppo===


Expression Manager also supports group-level relevance.  This makes it easier to implement looping.   Say you want to collect information about up to 10 entities (such a products or people in a household), where you first determine how many entities need follow-up (such as by asking how many people live in a household, or having people check which products they like from a long list).  After knowning how many entities need follow-up, you can use Group-level relevance like {count >= 1}, {count >=2}, ... {count >= 10} for each of the 10 groups of follow-up questions.  Within each group, you can have question-level conditional logic (e.g. gender or age-specific follow-up questions for each subject).  The question and group-level relevance equations are ANDed together to determine which should be shown.
Expression Manager supporta anche la pertinenza a livello di gruppo. Ciò semplifica l'implementazione del looping. Supponiamo che tu voglia raccogliere informazioni su un massimo di 10 entità (come prodotti o persone in una famiglia), dove prima determini quante entità necessitano di follow-up (ad esempio chiedendo quante persone vivono in una famiglia o chiedendo alle persone di controllare quali prodotti preferiscono da un lungo elenco). Dopo aver saputo quante entità necessitano di follow-up, puoi utilizzare la pertinenza a livello di gruppo come {count >= 1}, {count >=2}, ... {count >= 10} per ciascuno dei 10 gruppi di follow- domande. All'interno di ogni gruppo, puoi avere una logica condizionale a livello di domanda (ad es. domande di follow-up specifiche per sesso o età per ogni materia). La domanda e le equazioni di rilevanza a livello di gruppo vengono combinate in AND insieme per determinare quale deve essere mostrato.


===Tailoring / Piping===
===Sartoria / Tubazioni===


Anything within curly braces is now treated as an Expression (with one exception described below).  Expressions have acccess to all of the LimeReplacementFields, all of the variables (via several aliases), all typical equation operators (mathematical, logical, and comparison), and dozens of functions (that even work dynamically on the client-side).
Tutto ciò che si trova all'interno delle parentesi graffe viene ora trattato come un'espressione (con un'eccezione descritta di seguito). Le espressioni hanno accesso a tutti i LimeReplacementFields, a tutte le variabili (tramite diversi alias), a tutti i tipici operatori di equazioni (matematici, logici e di confronto) e a dozzine di funzioni (che funzionano anche dinamicamente sul lato client).


Using these equations, you can do things such as:
Usando queste equazioni, puoi fare cose come:
#Conditionally show tailored messages to the respondants based upon prior responses
#Mostrare in modo condizionale messaggi personalizzati agli intervistati in base alle risposte precedenti
#Create Assessments and show Assessment results (or conditionally branch or show messages) based upon those results, all without using the Assessments module itself
#Creare Valutazioni e mostrare i risultati della Valutazione (o diramare in modo condizionale o mostrare messaggi) in base a tali risultati, tutti senza utilizzare il modulo Valutazioni stesso
#Conjugate verbs and decline nouns within questions, answers, and reports.
#Coniuga i verbi e rifiuta i nomi all'interno di domande, risposte e rapporti.
#Show summaries of responses before the "Show your answers" page at the end of the survey
#Mostra i riepiloghi delle risposte prima della pagina "Mostra le tue risposte" alla fine del sondaggio


===Equations===
===Equazioni===


There is a new question type called  Equation.  It is like a Boilerplate questions, except that it stores the value of what is displayed in the database.  So, if the Equation Question text contains an Assessment computation, that value would be stored in the database in a variable that can be displayed within public or private statistics.
C'è un nuovo tipo di domanda chiamato Equazione. È come una domanda Boilerplate, tranne per il fatto che memorizza il valore di ciò che viene visualizzato nel database. Pertanto, se il testo della domanda sull'equazione contiene un calcolo di valutazione, tale valore verrà archiviato nel database in una variabile che può essere visualizzata all'interno di statistiche pubbliche o private.


This solves a common request for storing Assessment scores within the database
Questo risolve una richiesta comune per l'archiviazione dei punteggi di valutazione all'interno del database


==Syntax==
==Sintassi==


Anything contained within curly braces is now considered an Expression (with one exception:  there must be no leading or trailing whitespace - this is needed to ensure the Expression Manager does not try to process embedded JavaScript).
Tutto ciò che è contenuto all'interno delle parentesi graffe è ora considerato un'espressione (con un'eccezione: non devono essere presenti spazi bianchi iniziali o finali, necessari per garantire che Expression Manager non tenti di elaborare JavaScript incorporato).


Note, it is OK for expressions to span multiple lines, as long as there is no whitespace after the opening  curly brace or before the closing curly brace.  This is especially helpful for nested if() statements like this:
Nota, è OK che le espressioni si estendano su più righe, purché non ci siano spazi bianchi dopo la parentesi graffa di apertura o prima della parentesi graffa di chiusura. Ciò è particolarmente utile per istruzioni if() annidate come questa:


<syntaxhighlight lang="java">{if(is_empty(PFTotals),
<syntaxhighlight lang="java">{if(is_empty(PFTotals),
 '',
'',
 if(PFTotals >= -5 && PFTotals <= -4,
if(PFTotals >= -5 && PFTotals <= -4,
   'Very Soft',
'Very Soft',
   if(PFTotals >= -3 && PFTotals <= -2,
if(PFTotals >= -3 && PFTotals <= -2,
     'Soft',
'Morbido',
     if(PFTotals == -1,
if(PFTotals == -1,
       'Somewhat Soft',
'Un po' debole',
       if(PFTotals == 0,
if(PFTotals == 0,
         'Moderate',
'Moderato',! N! if(PFTotals == 1,
         if(PFTotals == 1,
'Un po' difficile',
           'Somewhat Hard',
if(PFTotals >= 2 && PFTotals <= 3,
           if(PFTotals >= 2 && PFTotals <= 3,
'Difficile',
             'Hard',
if(PFTotals >= 4 && PFTotals <= 5,
             if(PFTotals >= 4 && PFTotals <= 5,
'Molto difficile',
               'Very Hard',
''
               ''
)
             )
)
           )
)
         )
)
       )
)
     )
)
   )
)
 )
)}  
)}
</syntaxhighlight>
</syntaxhighlight>


<div id="EMsyntax">Expression Manager supports the following syntax:</div>
<div id="EMsyntax">Expression Manager supporta la seguente sintassi:</div>  
*All standard mathematical operators (e.g. +,-,*,/,!)
*Tutti gli operatori matematici standard (ad es. +,-,*,/,!)
*All standard comparison operators (e.g. <,<=,==,!=,>,>=, plus these equivalents:  lt,le,eq,ne,gt,ge)
*Tutti gli operatori di confronto standard (ad es. <,<=,==,!=,>,>=, più questi equivalenti: lt,le,eq,ne,gt,ge)
*Parentheses (so you can group sub-expressions)
*Parentesi (così puoi raggruppare le sottoespressioni)
*Conditional operators (e.g. &&,| | and these equivalents: and,or)
*Operatori condizionali (es. &&,| | e questi equivalenti: and,or)
*Single and double-quoted strings (which can each embed strings with the other quote type)
* Stringhe con virgolette singole e doppie (ognuna delle quali può incorporare stringhe con l'altro tipo di virgolette)
*Comma operator (so can have a list of expressions and just return the final result)
*Operatore virgola (quindi può avere un elenco di espressioni e restituire solo il risultato finale)
*Assignment operator (=)
*Operatore di assegnazione (=)!N !*Variabili predefinite (per fare riferimento a domande, attributi delle domande e risposte) - ad es. tutti i codici SGQA
*Pre-defined variables (to refer to questions, question attributes, and responses) - e.g. all of the SGQA codes
*Funzioni predefinite (ce ne sono già più di 70 ed è facile aggiungerne altre)
*Pre-defined functions (there are already 70+, and it is easy to add more)


=== Operators ===
=== Operatori ===


EM syntax follows normal operator precedence:
La sintassi EM segue la normale precedenza degli operatori:


{| class="wikitable"
{| class="wikitable"
!Level!!Operator(s)!!Description
!Livello!!Operatore(i)!!Descrizione
|-
|-
|1||()||parentheses for grouping or calling functions
|1||()||parentesi per raggruppare o chiamare funzioni
|-
|-
|2||! - +||unary operators: not, negation, unary-plus
| 2||! - +||operatori unari: non, negazione, unario-più
|-
|-
|3||* /||times, divide
|3||* /||volte, dividere
|-
|-
|4||+ -||plus, minus
|4||+ -||più , minus
|-
|-
|5||< <= > >= lt le gt ge||relative comparisons
|5||< <= > >= lt le gt ge||confronti relativi
|-
|-
|6||== != eq ne||equality comparisons
|6||== != eq ne||confronti di uguaglianza
|-
|-
|7||and||logical AND
|7||e||AND logico
|-
|-
|8||or||logical OR
|8||o||OR logico
|-
|-
|9||=||assignment operator
|9||=||assegnazione operatore
|-
|-
|10||,||comma operator
|10||,||operatore virgola
|}
|}


==== Warning with plus operator (+) ====
==== Avviso con operatore più (+) ====


For consistency between JavaScript and PHP, the plus operator (+) does addition if both operands are numeric, but does concatenation if both parts are non-numeric strings.  However, '''we recommend using the join() function for concatenation and sum() function for addition''', as that makes your intent more clear, and avoids unexpected results if you were expecting strings but got numbers instead (or vice versa).
Per coerenza tra JavaScript e PHP, l'operatore più (+) esegue l'addizione se entrambi gli operandi sono numerici, ma esegue la concatenazione se entrambe le parti sono stringhe non numeriche. Tuttavia, '''ti consigliamo di utilizzare la funzione join() per la concatenazione e la funzione sum() per l'addizione''', in quanto ciò rende più chiaro il tuo intento ed evita risultati imprevisti se ti aspettavi delle stringhe ma hai invece dei numeri (o viceversa versa).


==== Warning with mismatch between number and string and alphabetic comparison ====
==== Avviso con mancata corrispondenza tra numero e stringa e confronto alfabetico ====


When you want to compare value with relative or equality comparisons, pay attention to type mismatch. Value entered by user or answer code selected can be used as number if it's clearly a number.
Quando si desidera confrontare il valore con confronti relativi o di uguaglianza, prestare attenzione alla mancata corrispondenza del tipo. Il valore inserito dall'utente o il codice di risposta selezionato può essere utilizzato come numero se è chiaramente un numero.
If you surround one of the values with <code>"</code>it will force the comparison as text (alphabetic compare). If you want to compare numerically, never surround the number with quotation marks, <code>"</code>.
Se racchiudi uno dei valori tra <code>"</code> , verrà forzato il confronto come testo (confronto alfabetico). Se desideri confrontare numericamente, non racchiudere mai il numero tra virgolette, <code>"</code> .


For example <code>Q0.NAOK > "50"</code> is true if Q0.NAOK is a numeric question with 9 as value. This is because the operator <code>></code> will assume it's alphabetical compare and not numerical.
Ad esempio <code>Q0.NAOK > "50"</code> è vero se Q0.NAOK è una domanda numerica con 9 come valore. Questo perché l'operatore <code>></code> assumerà che sia un confronto alfabetico e non numerico.


To be sure to compare integer value, you can use <code>[[Expression_Manager#Implemented_Functions|intval]](Q0.NAOK) > 50</code>, just remember if Q0.NAOK is not a number (empty or a string), then intval(Q0.NAOK) === 0. To compare string value ("A" < "B") use [[Expression_Manager#Implemented_Functions|strcmp]] directly : <code>strcmp(Q0.NAOK,"B")</code> or <code>strcmp(Q0.NAOK,"A5")</code>.
<div class="mw-translate-fuzzy">
Per essere sicuri di confrontare il valore intero, puoi usare <code>[[Expression_Manager#Implemented_Functions|intval]](Q0.NAOK) > 50</code> , ricorda solo che se Q0.NAOK non è un numero (vuoto o una stringa), allora intval(Q0. NAOK) === 0. Per confrontare il valore stringa ("A" < "B") utilizzare [[Expression_Manager#Implemented_Functions|strcmp]] direttamente: <code>strcmp(Q0.NAOK,"B")</code> o <code>strcmp(Q0.NAOK,"A5")</code> .
</div>


===Caution about using Assignment Operator (=)===
===Attenzione sull'uso dell'operatore di assegnazione (=)===


Note, you should avoid using the assignment operators unless absolutely necessary, since they may cause unexpected side-effects.  For example, if you change the value of a previous response, the cascading relevance and validation logic between that question and the current question is not re-computed, so you could end up with internally inconsistent data (e.g. questions that stay answered but should have been NULLed, or questions that are skipped but should have been answered).  In general, if you want to assign a value to a variable, you should create an Equation question type, and use an expression to set its value.  However, there are some rare times that people really need this operator, so we made it available.
Nota, dovresti evitare di utilizzare gli operatori di assegnazione a meno che non sia assolutamente necessario, poiché potrebbero causare effetti collaterali imprevisti. Ad esempio, se modifichi il valore di una risposta precedente, la pertinenza a cascata e la logica di convalida tra quella domanda e la domanda corrente non vengono ricalcolate, quindi potresti ritrovarti con dati internamente incoerenti (ad es. stato annullato NULL o domande che sono state saltate ma avrebbero dovuto avere una risposta). In generale, se si desidera assegnare un valore a una variabile, è necessario creare un tipo di domanda Equazione e utilizzare un'espressione per impostarne il valore. Tuttavia, ci sono alcune rare volte in cui le persone hanno davvero bisogno di questo operatore, quindi l'abbiamo reso disponibile.


To help caution you about this operator, it is shown in red font within the syntax equations (so that you don't confuse it with "==")
Per aiutarti a metterti in guardia su questo operatore, è mostrato in carattere rosso all'interno delle equazioni di sintassi (in modo da non confonderlo con "==")


===Using Assignment Operator===
===Utilizzo dell'operatore di assegnazione===
The main reasons you may want to use assignment are:
I motivi principali per cui potresti voler utilizzare l'assegnazione sono:
* You need to set the default value for a question that does not accept defaults via equation (such as list radio, where the user interface lets you pick one of the answer options, but does not let you enter an equation).  However, be careful, as LimeSurvey will not be able to validate that your equation generates one of the allowable answers for that question.
* Devi impostare il valore predefinito per una domanda che non accetta i valori predefiniti tramite equazione (come list radio, dove l'interfaccia utente ti consente di scegliere una delle opzioni di risposta, ma non ti consente di inserire un'equazione). Tuttavia, fai attenzione, poiché LimeSurvey non sarà in grado di convalidare che la tua equazione generi una delle risposte consentite per quella domanda.
* You need to forcibly change the response to a previous question based upon a later response
* Devi forzare la modifica della risposta a una domanda precedente basata su una risposta successiva
* You need complex quota : using one hidden single choice for quota and set it using assignment
* Hai bisogno di una quota complessa: usa una singola scelta nascosta per la quota e impostala usando l'assegnazione! N! * ecc ...
* etc...


You can use all expression manager system for this purpose.  
È possibile utilizzare tutti i sistemi di gestione delle espressioni per questo scopo.  


{{Alert|Assignment is done only in PHP. This doesn't update any values on the same page, but only when the user navigates with next, previous, save ….}}
{{Alert|L'assegnazione viene eseguita solo in PHP. Questo non aggiorna alcun valore sulla stessa pagina, ma solo quando l'utente naviga con next, previous, save ….}}


{{Alert|If you don't use an [[Question_type_-_Equation|equation question]] type for this purpose: the assignment is done only after the logic of the current page is done. The recommended method is to always use an [[Question_type_-_Equation|equation question]].}}
{{Alert|Se non si utilizza un tipo di [[Question_type_-_Equation|equazione domanda]] per questo scopo: l'assegnazione viene eseguita solo dopo che la logica della pagina corrente è terminata. Il metodo consigliato è utilizzare sempre una [[Question_type_-_Equation|domanda sull'equazione]].}}


Some example:
Alcuni esempi:
* Set answer to a short text question in lowercase : <code>{QCODE=strtolower(QCODE.NAOK)}</code>
* Imposta la risposta a una breve domanda di testo in minuscolo: <code>{QCODE=strtolower(QCODE.NAOK)}</code>  
* Set a default answer to an array question type at start of a survey : <code>{Q1_SQ1=((is_empty(Q1_SQ1.NAOK),"A99",Q1_SQ1.NAOK)}</code>
* Imposta una risposta predefinita a un tipo di domanda array all'inizio di un sondaggio: <code>{Q1_SQ1=((is_empty(Q1_SQ1.NAOK),"A99",Q1_SQ1.NAOK)}</code>  
* Set a default answer to an array texts question type at start of a survey : <code>{Q1_SQY1_SQX1 = ((is_empty(Q1_SQY1_SQX1.NAOK),"Inserted answer", Q1_SQY1_SQX1.NAOK)}</code>
* Imposta una risposta predefinita a un tipo di domanda di tipo array all'inizio di un sondaggio: <code>{Q1_SQY1_SQX1 = ((is_empty(Q1_SQY1_SQX1.NAOK),"Inserted answer", Q1_SQY1_SQX1.NAOK)}</code>  
* Set an answer with condition : <code>{QCODE=if(YesNo="Y","A1","")}</code>
* Imposta una risposta con condizione: <code>{QCODE=if(YesNo="Y","A1","")}</code>


== XSS security ==
== Sicurezza XSS ==


With XSS enable, some expression manager system can not be used :  
Con XSS abilitato, alcuni sistemi di gestione delle espressioni non possono essere utilizzati:  
* starting a HTML tag in expression but ending in another expression
* inizia un tag HTML nell'espressione ma termina con un'altra espressione
* use a complex expression in URL.  
* utilizza un'espressione complessa nell'URL.  


Example and workaround
Esempio e soluzione alternativa
* <code>{if( 1 ,"&lt;strong&gt;","")}information{if( 1 ,"&lt;/strong&gt;","")}</code> is broken with XSS security, here you can use <code>{if(1,"<strong&gt;information&lt;/strong&gt;","information")}</code>
* <code>{if( 1 ,"<strong>","")}information{if( 1 ,"</strong>","")}</code> funzionanti con la sicurezza XSS, qui puoi utilizzare <code>
* <code>&lt;a href="/script.php?value={if(QCODE == "Y","yes","no")}"&gt;next&lt;/a&gt;</code>, here you can use an equation question because using a complete question code is OK : <code>&lt;a href="/script.php?value={EQUATION.NAOK}"&gt;next&lt;/a&gt;</code>
* <code><a href="/script.php?value={if(QCODE == "Y","yes","no")}">next</a></code>, here you can use an equation question because using a complete question code is OK : <code><a href="/script.php?value={EQUATION.NAOK}">next</a></code></code> <strong>information</strong>","information"</code> <code>
* <code><a href="/script.php?value={if(QCODE == "Y","yes","no")}">next</a></code>, here you can use an equation question because using a complete question code is OK : <code><a href="/script.php?value={EQUATION.NAOK}">next</a></code></code>


==Access to Variables==
==Accesso alle variabili==


Expression Manager provides read-only access to whichever variables we might need.  For backwards compatibility, it provides access to the following:
Expression Manager fornisce l'accesso in sola lettura a qualsiasi variabile di cui potremmo aver bisogno. Per retrocompatibilità, fornisce l'accesso a quanto segue:
*TOKEN:xxx - the value of a TOKEN (e.g. TOKEN:FIRSTNAME, TOKEN:ATTRIBUTE_5) (Only for NOT anonymous survey).
*TOKEN:xxx - il valore di un TOKEN (ad es. TOKEN:FIRSTNAME, TOKEN:ATTRIBUTE_5) (solo per sondaggi NON anonimi).
*[[Adding a question#Information_from_previous_answers|INSERTANS:SGQA]] - the display value of an answer (e.g. "Yes"). For Expression Manager it's the same that using {QCODE.shown}.
*[[Aggiunta di un question#Information_from_previous_answers|INSERTANS:SGQA]] - il valore visualizzato di una risposta (es. ""). Per Expression Manager è lo stesso che usando {QCODE.shown}.
*All [[The_template_editor#Keywords|{XXX} values used by templates]].
*Tutti [[The_template_editor#Keywords|{XXX} valori usati dai modelli]].
*In question text, you can use {QID} replaced by the question id and {SGQ} replaced by the SGQA of the question
*Nel testo della domanda, puoi usare {QID} sostituito dall'id della domanda e {SGQ} sostituiti dall'SGQA della domanda


In addition, Expression Manager lets you refer to variables by the Question Code (the 'title' column in the questions table within the database).  This is also the variable label used when you export your data to SPSS, R, or SAS.  For example, if you have questions about name, age, and gender, you could call those variables ''name'', ''age'', and ''gender'' instead of ''12345X13X22'', ''12345X13X23'', and  ''12345X13X24''.  This makes equations easier for everyone to read and validate the logic, plus makes it possible to shuffle questions around without having to keep track of group or question numbers.
Inoltre, Expression Manager consente di fare riferimento alle variabili tramite il codice domanda (la colonna "titolo" nella tabella delle domande all'interno del database). Questa è anche l'etichetta della variabile utilizzata quando si esportano i dati in SPSS, R o SAS. Ad esempio, se hai domande su nome, età e sesso, puoi chiamare queste variabili ''nome'', ''età'' e ''sesso'' invece di ''12345X13X22'', ''12345X13X23' ', e ''12345X13X24''. Ciò semplifica la lettura delle equazioni e la convalida della logica da parte di tutti, inoltre consente di mescolare le domande senza dover tenere traccia dei numeri di gruppo o delle domande.


<div class='simplebox'>
<div class='simplebox'>
'''Important:''' It is only safe to refer to variables that occur in preceding pages or questions.
'''Importante:''' È sicuro fare riferimento solo a variabili che si verificano nelle pagine o domande precedenti.
</div>
</div>


Furthermore, Expression Manager lets you access many properties of the Question:
Inoltre, Expression Manager ti consente di accedere a molte proprietà della Domanda:




{| class="wikitable"
{| class="wikitable"
!Syntax!!Meaning!!Example!!Example Result
!Sintassi!!Significato!!Esempio!!Esempio Risultato
|-
|-
|Qcode||an alias for Qcode.code||{implode(',',name,gender)}||'Tom','M'
|Qcode||un alias per Qcode.code||{implode(',',name,gender )}||'Tom','M'
|-
|-
|Qcode.code||the selected response code for the question if it is relevant (otherwise blank), or the text value if it is not a coded question||{implode(',',name.code,gender.code)}||'Tom','M'
|Qcode.code||il codice di risposta selezionato per la domanda se è rilevante (altrimenti vuoto), o il valore del testo se non è un domanda in codice||{implode(',',name.code,gender.code)}||'Tom','M'
|-
|-
|Qcode.NAOK||same as Qcode - see discussion of NAOK||{gender.NAOK}||'M'
|Qcode.NAOK||uguale a Qcode - vedi discussione su NAOK||{gender.NAOK}||'M'
|-
|-
|Qcode.value||the assessment value for the question if it is relevant (otherwise blank), or the text value if it is not a coded question||{gender.value}||'1'
|Qcode.value||il valore di valutazione per la domanda se è rilevante (altrimenti vuoto), o il valore del testo se non lo è una domanda in codice||{gender.value}||'1'
|-
|-
|Qcode.valueNAOK||same as Qcode.value - see discussion about NAOK||{gender.valueNAOK}||'1'
|Qcode.valueNAOK||uguale a Qcode.value - vedi discussione su NAOK||{gender.valueNAOK}||'1 '
|-
|-
|Qcode.shown||the dispay value for the question||{implode(',',name.shown,gender.shown)}||'Tom','Male'
|Qcode.shown||il valore visualizzato per la domanda||{implode(',',name.shown,gender.shown)}||'Tom','Male'!N !|-
|Qcode.question||il testo della domanda||{gender.question}||'Qual è il tuo genere?'
|-
|-
|Qcode.question||the text of the question||{gender.question}||'What is your gender?'
|Qcode.mandatory||se la domanda è obbligatorio (S/N)||{gender.mandatory}||'N'
|-
|-
|Qcode.mandatory||whether the question is mandatory (Y/N)||{gender.mandatory}||'N'
|Qcode.qid||il numero della domanda interna (non il numero progressivo)||{gender.qid} ||337
|-
|-
|Qcode.qid||the internal question number (not the sequential number)||{gender.qid}||337
|Qcode.type||il tipo di domanda||{gender.type}||'G'
|-
|-
|Qcode.type||the question type||{gender.type}||'G'
|Qcode.jsName||il nome javascript corretto per la domanda, indipendentemente dal fatto che sia dichiarato all'interno o all'esterno di questa pagina||{gender.jsName}||'java1827X3X337'
|-
|-
|Qcode.jsName||the correct javascript name for the question, regardless whether declared on or off this page||{gender.jsName}||'java1827X3X337'
|Qcode.gid||il numero di gruppo interno (non il numero sequenziale)|| {gender.gid}||3
|-
|-
|Qcode.gid||the internal group number (not the sequential number)||{gender.gid}||3
|Qcode.qseq||il numero progressivo della domanda, partendo da 0||{gender.qseq}||5
|-
|-
|Qcode.qseq||the sequential number of the question, starting from 0||{gender.qseq}||5
|Qcode.gseq||il numero sequenziale del gruppo, a partire da 0||{gender.gseq}||1
|-
|-
|Qcode.gseq||the sequential number of the group, starting from 0||{gender.gseq}||1
|Qcode.relevanceStatus||se la domanda è attualmente pertinente (0 o 1 )||{gender.relevanceStatus}||1
|-
|-
|Qcode.relevanceStatus||whether the question is currently relevant (0 or 1)||{gender.relevanceStatus}||1
|Qcode.relevance||l'equazione di rilevanza a livello di domanda||{gender.relevance}||'!is_empty(name)'
|-
|Qcode.grelevance||l'equazione di rilevanza a livello di gruppo||{gender.grelevance}||'num_children >= 5'
|-
|-
|Qcode.relevance||the question-level relevance equation||{gender.relevance}||'!is_empty(name)'
|Qcode.sgqa||il valore SGQA per questa domanda||{gender.sgqa}||'1827X3X337'
|-
|Qcode.grelevance||the  group-level relevance equation||{gender.grelevance}||'num_children >= 5'
|-
|Qcode.sgqa||the SGQA value for this question||{gender.sgqa}||'1827X3X337'
|}
|}


=== HTML editor issue===
=== Problema con l'editor HTML===


{{Alert|This issue is fixed after 2.05 build 140803}}  
{{Avviso|Questo problema è stato risolto dopo la build 2.05 140803}}  


If you use HTML editor, some characters are replaced by HTML entities.
Se utilizzi l'editor HTML, alcuni caratteri vengono sostituiti da entità HTML.
* & by &amp;amp;
* & da &amp;
* < by &amp;lt;
* < da &lt;
* > by &amp;gt;
* > da &gt;


If you use HTML editor you need to use :
Se usi un editor HTML devi usare :
* and for &
* e for &
* lt for <
* lt for <
* le for <=
* le for <=
* gt for >
* gt for >
* ge for >=
* ge per >=


==Qcode Variable Naming==
==Denominazione variabile Qcode==


Here are the details of how to construct a Qcode (and access some properties) by question type.  In general, Qcodes are constructed as:
Ecco i dettagli su come costruire un Qcode (e accedere ad alcune proprietà) per tipo di domanda. In generale, i Qcode sono costruiti come:


  QuestionCode . '_' . SubQuestionID . '_' . ScaleId
DomandaCodice . '_'. ID domanda secondaria . '_'. ID scala


For '''comment''' and '''other''', question code are QuestionCode_comment and QuestionCode_other
Per '''comment''' e '''other''', il codice della domanda è QuestionCode_comment e QuestionCode_other


{| class="wikitable"
{| class="wikitable"
!Type!!Description!!Code!!SubQs!!Answer Options!!Scales!!Answer Code!!Answer Shown!!Relevance
!Tipo!!Descrizione!!Codice!!SubQs!!Opzioni di risposta!!Scale!!Codice di risposta!!Risposta mostrata!!Pertinenza
|-
|-
|5||5 Point Choice Radio-Buttons||Q1|| ||1-5|| ||{Q1}||{Q1.shown}||{Q1==3}
|5||5 Pulsanti radio Point Choice||Q1|| ||1-5|| ||{Q1}||{Q1.mostrato}||{Q1==3}
|-
|-
|B||Array (10 Point Choice) Radio-Buttons||Q2||L1-L6||1-10|| ||{Q2_L2}||{Q2_L2.shown}||{Q2_L2==7}
|B||Array (10 punti di scelta) Pulsanti radio||Q2||L1-L6| |1-10|| ||{Q2_L2}||{Q2_L2.mostrato}||{Q2_L2==7}
|-
|-
|A||Array (5 Point Choice) Radio-Buttons||Q3||1-5||1-5|| ||{Q3_1}||{Q3_1.shown}||{Q3_1>=3}
|A||Array (scelta a 5 punti) Pulsanti radio||Q3||1-5| |1-5|| ||{Q3_1}||{Q3_1.mostrato}||{Q3_1>=3}
|-
|-
|1||Array (Flexible Labels) Dual Scale||Q4||sq1-sq5||0:a1-a3||1:b1-b3||{Q4_sq1_0}||{Q4_sq1_1.shown}||{Q4_sq1_1=='b2'}
|1||Array (etichette flessibili) Doppia scala||Q4||sq1-sq5||0 :a1-a3||1:b1-b3||{Q4_sq1_0}||{Q4_sq1_1.mostrato}||{Q4_sq1_1=='b2'}
|-
|-
|H||Array (Flexible) - Column Format||Q5||1-5||s,m,t|| ||{Q5_1}||{Q5_1.shown}||{Q5_1=='s'}
|H||Array (flessibile) - Formato colonna||Q5||1-5||s,m,t|| ||{Q5_1}||{Q5_1.mostrato}||{Q5_1=='s'}
|-
|-
|F||Array (Flexible) - Row Format||Q6||F1-F5||1-5|| ||{Q6_F3}||{Q6_F3.shown}||{Q6_F3==4}
|F||Array (flessibile) - Formato riga||Q6||F1-F5| |1-5|| ||{Q6_F3}||{Q6_F3.mostrato}||{Q6_F3==4}
|-
|-
|E||Array (Increase/Same/Decrease) Radio-Buttons||Q7||1-7||I,S,D|| ||{Q7_4}||{Q7_4.shown}||{Q7_4=='D'}
|E||Array (Aumenta/Uguale/Diminuisci) Pulsanti Radio||Q7||1- 7||I,S,D|| ||{Q7_4}||{Q7_4.mostrato}||{Q7_4=='D'}
|-
|-
|:||Array (Multi Flexi) 1 To 10||Q8||ls1,todo,ls2||min,max,avg|| ||{Q8_ls1_max}||{Q8_ls2_avg.shown}||{Q8_ls2_min==7}
|:||Array (Multi Flexi) da 1 a 10||Q8||ls1,todo ,ls2||min,max,media|| ||{Q8_ls1_max}||{Q8_ls2_avg.shown}||{Q8_ls2_min==7}
|-
|-
|;||Array (Multi Flexi) Text||Q9||hp,st,sw||1st,2nd,3rd|| ||{Q9_hp_3rd}||{Q9_hp_3rd.shown}||{Q9_hp_3rd=='Peter'}
|;||Array (Multi Flexi) Testo||Q9||hp,st,sw|| ,,|| ||{Q9_hp_3rd}||{Q9_hp_3rd.shown}||{Q9_hp_3rd=='Peter'}
|-
|-
|C||Array (Yes/Uncertain/No) Radio-Buttons||Q10||1-5||Y,N,U|| ||{Q10_1}||{Q10_1.shown}||{Q10_3=='Y'}
|C||Array (/Incerto/No) Pulsanti radio||Q10|| 1-5||Y,N,U|| ||{Q10_1}||{Q10_1.mostrato}||{Q10_3=='Y'}
|-
|-
|X||Boilerplate Question||Q11|| || || || ||{Q11.shown}||
|X||Domanda standard||Q11|| || || || ||{Q11.mostrato}||
|-
|-
|D||Date||Q12|| || || ||{Q12}||{Q12.shown}||
|G||Data||Q12|| || || ||{Q12}||{Q12.mostrato}||
|-
|-
|*||Equation||Q13|| || || ||{Q13}||{Q13.shown}||{Q13>5}
|*||Equazione||Q13|| || || ||{Q13}||{Q13.mostrato}||{Q13>5}
|-
|-
|~124~||File Upload (records number of files uploaded)||Q14|| || || ||{Q14}|| ||{Q14>0}
|~124~||File Upload (registra il numero di file caricati)||Q14|| || || ||{Q14}|| ||{Q14>0}
|-
|-
|G||Gender Drop-Down List||Q15|| ||M,F|| ||{Q15}||{Q15.shown}||{Q15=='M'}
|G||Elenco a discesa Sesso||Q15|| ||M,F|| ||{Q15}||{Q15.mostrato}||{Q15=='M'}
|-
|-
|U||Huge Free Text||Q16|| || || ||{Q16}||{Q16.shown}||{strlen(Q16)>100}
|U||Testo libero enorme||Q16|| || || ||{Q16}||{Q16.mostrato}||{strlen(Q16)>100}
|-
|-
|I||Language Question||Q17|| || || ||{Q17}||{Q17.shown}||{Q17=='en'}
|I||Domanda Lingua||Q17|| || || ||{Q17}||{Q17.mostrato}||{Q17=='it'}
|-
|-
|!||List - Dropdown||Q18|| ||1-5|| ||{Q18}||{Q18.shown}||{Q18==3}
|!||Lista - Dropdown||Q18|| ||1-5|| ||{Q18}||{Q18.mostrato}||{Q18==3}
|-
|-
|L||List Drop-Down/Radio-Button List||Q19|| ||A-Z|| ||{Q19}||{Q19.shown}||{Q19=='X'}
|L||Elenco a discesa/Elenco pulsanti radio||Q19|| ||AZ|| ||{Q19}||{Q19.mostrato}||{Q19=='X'}
|-
|-
|O||List With Comment Drop-Down/Radio-Button List + Textarea||Q20|| ||A-F|| ||{Q20},{Q20comment}||{Q20.shown}||{Q20=='B'}
|O||Elenco con menu a tendina commenti/Elenco pulsanti radio + Area di testo||Q20 || ||AF|| ||{Q20},{Q20comment}||{Q20.shown}||{Q20=='B'}
|-
|-
|T||Long Free Text||Q21|| || || ||{Q21}||{Q21.shown}||{strstr(Q21,'hello')>0}
|T||Testo libero lungo||Q21|| || || ||{Q21}||{Q21.mostrato}||{strstr(Q21,'hello')>0}
|-
|-
|M||Multiple Choice Checkbox||Q22||A-F, other|| || ||{Q22_E}, {Q22_other}||{Q22_E.shown}, {Q22_other.shown}||{Q22_E=='Y'}
|M||Casella di scelta multipla||Q22||AF, altro| | || ||{Q22_E}, {Q22_other}||{Q22_E.shown}, {Q22_other.shown}||{Q22_E=='Y'}
|-
|-
|P||Multiple Choice With Comments Checkbox + Text||Q23||A-F|| || ||{Q23_D}, {Q23_Dcomment}||{Q23_D.shown}||{!is_empty(Q23)}
|P||Scelta multipla con commenti Casella di controllo + Testo||Q23||AF|| || ||{Q23_D}, {Q23_Dcomment}||{Q23_D.mostrato}||{!is_empty(Q23)}
|-
|-
|K||Multiple Numerical Question||Q24||self,mom,dad|| || ||{Q24_self}||{Q24_self.shown}||{Q24_self>30}
|K||Domanda numerica multipla||Q24||se stesso, mamma, papà || || ||{Q24_self}||{Q24_self.mostrato}||{Q24_self>30}
|-
|-
|Q||Multiple Short Text||Q25||A-F|| || ||{Q25_B}||{Q25_B.shown}||{substr(Q25_B,1,1)=='Q'}
|Q||Testo breve multiplo||Q25||AF|| || ||{Q25_B}||{Q25_B.mostrato}||{substr(Q25_B,1,1)=='Q'}
|-
|-
|N||Numerical Question Type||Q26|| || || ||{Q26}||{Q26.shown}||{Q26 > 30}
|N||Tipo di domanda numerica||Q26|| || || ||{Q26}||{Q26.mostrato}||{Q26 > 30}
|-
|-
|R||Ranking Style||Q27||1-4|| || ||{Q27_1}||{Q27_1.shown}||{Q27_1==3}
|R||Stile classifica||Q27||1-4|| || ||{Q27_1}||{Q27_1.mostrato}||{Q27_1==3}
|-
|-
|S||Short Free Text||Q28|| || || ||{Q28}||{Q28.shown}||{Q28=='mine'}
|S||Testo libero breve||Q28|| || || ||{Q28}||{Q28.mostrato}||{Q28=='mio'}
|-
|-
|Y||Yes/No Radio-Buttons||Q29|| || || ||{Q29}||{Q29.shown}||{Q29=='Y'}
|Y||Pulsanti radio Sì/No||Q29|| || || ||{Q29}||{Q29.mostrato}||{Q29=='S'}
|}
|}


==The reserved 'this', 'self', and 'that' variables==
==Le variabili riservate 'this', 'self' e 'that'==


Quite often, you want to evalute all parts of a question, such as counting how many subquestions have been answered, or summing the scores.  Other times, you want to process just certain rows or columns of a question (such as getting the row or column sums and storing them in the database).  These reserved variables make that process relatively painless.
Molto spesso, si desidera valutare tutte le parti di una domanda, ad esempio contando quante sottodomande hanno ricevuto risposta o sommando i punteggi. Altre volte, vuoi elaborare solo determinate righe o colonne di una domanda (come ottenere le somme di righe o colonne e memorizzarle nel database). Queste variabili riservate rendono tale processo relativamente indolore.


The 'this' variable is used exclusively within the "Whole question validation equation" and "Sub-question validation equation" advanced question options.  It expands to the variable names of each of the cells within those questions.  So, if you want to make sure that each entry is greater than three, you would set the "Sub-question validation equation" to (this > 3).
La variabile "questa" viene utilizzata esclusivamente all'interno delle opzioni di domanda avanzata "Equazione di convalida dell'intera domanda" e "Equazione di convalida della sottodomanda". Si espande ai nomi delle variabili di ciascuna delle celle all'interno di tali domande. Quindi, se vuoi assicurarti che ogni voce sia maggiore di tre, devi impostare "Equazione di convalida della sottodomanda" su (this > 3).


The 'self' and 'that' variable are more powerful, and serve as macros which are expanded prior to processing equations.  The syntax choices are:
Le variabili "sé" e "quella" sono più potenti e fungono da macro che vengono espanse prima dell'elaborazione delle equazioni. Le scelte di sintassi sono:
*self
*self
*self.''suffix''
*self.''suffix''
*self.''sub-selector''
*self.''sub-selector''
*self.''sub-selector''.''suffix''
*self.''sub-selector''.'' suffisso''


''suffix'' is any of the normal qcode suffixes (e.g. NAOK, value, shown)
''suffisso'' è uno qualsiasi dei normali suffissi qcode (es. NAOK, valore, mostrato)


''sub-selector'' is one of:
''sub-selector'' è uno di:
*comments - only subquestions that are comments (e.g., from multiple choice with comment and list with comment)
*comments - solo sottodomande che sono commenti (ad esempio, da scelta multipla con commento ed elenco con commento)
*nocomments - only subquestions that are not comments
*nocomments - solo sottodomande che non sono commenti
*sq_X - where X is a row or column identifier. Only subquestions matching pattern X are selected. Note that search is done on complete code identifier, then sq_X match and include subquestions nX, X, Xn (e.g. if you use sq_1, subquestions a1, 1a, 1, 11 or 001 was included). Put attention at dual scale question type where subquestions code are QCODE_SQCODE_1 and QCODE_SQCODE_1 and to ranking question type where subquestions code are QCODE_1,QCODE_2 ....
*sq_X - dove X è un identificatore di riga o colonna. Vengono selezionate solo le sottodomande che corrispondono al modello X. Si noti che la ricerca viene eseguita sull'identificatore di codice completo, quindi sq_X corrisponde e include le sottodomande nX, X, Xn (ad esempio, se si utilizza sq_1, le sottodomande a1, 1a, 1, 11 o 001 sono state incluse). Prestare attenzione al tipo di domanda a doppia scala in cui il codice delle domande secondarie è QCODE_SQCODE_1 e QCODE_SQCODE_1 e al tipo di domanda di classificazione in cui il codice delle domande secondarie è QCODE_1,QCODE_2 ....
*nosq_X - where X is a row or column identifier. Only subquestions not matching pattern X are selected. Note that search is done on complete code identifier, then nosq_X match and does not include subquestions nX, X, Xn
*nosq_X - dove X è un identificatore di riga o colonna. Vengono selezionate solo le domande secondarie che non corrispondono al modello X. Si noti che la ricerca viene eseguita sull'identificatore di codice completo, quindi nosq_X corrisponde e non include le sottodomande nX, X, Xn


Examples:
Esempi:
*Has any part of a question been answered?  {count(self.NAOK)>0}
*È stata data risposta a qualche parte di una domanda? {count(self.NAOK)>0}
*What is the assessment score for this question?  {sum(self.value)}
*Qual è il punteggio di valutazione per questa domanda? {somma(self.valore)}


You can also use these to get row and column totals.  Say you have a array of numbers with rows A-E and columns 1-5.
Puoi anche usarli per ottenere i totali di righe e colonne. Supponi di avere un array di numeri con righe AE e colonne 1-5.
*What is the grand total?  {sum(self.NAOK)}
*Qual è il totale complessivo? {sum(self.NAOK)}
*What is the total of row B?  {sum(self.sq_B.NAOK)}
*Qual è il totale della riga B? {sum(self.sq_B.NAOK)}
*What is the total of column 3? {sum(self.sq_3.NAOK)}
*Qual è il totale della colonna 3? {sum(self.sq_3.NAOK)}


The 'that' variable is like the 'self' variable, but lets you refer to other questions.  Its syntax is:
La variabile "quella" è come la variabile "self", ma ti consente di fare riferimento ad altre domande. La sua sintassi è:
*that.''qname''
*that.''qname''
*that.''qname''.''suffix''
*that.''qname''.''suffix''
*that.''qname''.''sub-selector''
*that.''qname''.''sub-selector' '
*that.''qname''.''sub-selector''.''suffix''
*quello.''qname''.''sottoselettore''.''suffisso''


''qname'' is the question name without any subquestion extensions.  So, say you create a question 'q1', that is its ''qname''
''qname'' è il nome della domanda senza alcuna estensione della sottodomanda. Quindi, diciamo che crei una domanda 'q1', che è il suo ''qname''


Examples:
Esempi:
*Has any part of question q1 been answered?  {count(that.q1.NAOK)>0}
*È stata data risposta a qualche parte della domanda q1? {count(that.q1.NAOK)>0}
*What is the assessment score for q2?  {sum(that.q2.NAOK)}
*Qual è il punteggio di valutazione per q2? {sum(that.q2.NAOK)}
*What is the grand total of q3? {sum(that.q3.NAOK)}
*Qual è il totale complessivo di q3? {sum(that.q3.NAOK)}
*What is the total of row C in q4?  {sum(that.q4.sq_C.NAOK)}
*Qual è il totale della riga C in q4? {sum(that.q4.sq_C.NAOK)}
*What is the total of column 2 in q4? {sum(that.q4.sq_2.NAOK)}
*Qual è il totale della colonna 2 in q4? {sum(that.q4.sq_2.NAOK)}


The 'self' and 'that' variables can be used in any relevance,  validation, or tailoring.
Le variabili "self" e "that" possono essere utilizzate in qualsiasi rilevanza, convalida o personalizzazione.


The one caveat is that when you use the [[Show Logic File|Show Logic File]] feature, it will show you the expanded value of 'self' and 'that'.  This lets you see the actual equation that will be generated so that you (and Expression Manager) can validate that the variables exist.  This may seem confusing since you may see quite lenghty equations.  However, if you edit the question, you will see the original equation using 'self' and/or 'that'
L'unica avvertenza è che quando usi la funzione [[Mostra file logico|Mostra file logico]], ti mostrerà il valore espanso di 'self' e 'that'. In questo modo è possibile visualizzare l'equazione effettiva che verrà generata in modo che l'utente (e Expression Manager) possa convalidare l'esistenza delle variabili. Questo può sembrare confuso poiché potresti vedere equazioni piuttosto lunghe. Tuttavia, se modifichi la domanda, vedrai l'equazione originale usando 'self' e/o 'that'


Also note that you should not use these variables if (a) you want to explicitly name each variable used in an equation, or (b) use variables that do not have subquestions (e.g. single response questions).  In those cases, prefixing a variable with 'that' is overkill, and you run the risk of getting unexpected results.
Si noti inoltre che non si dovrebbero utilizzare queste variabili se (a) si desidera nominare esplicitamente ciascuna variabile utilizzata in un'equazione, o (b) utilizzare variabili che non hanno sottodomande (ad esempio domande a risposta singola). In questi casi, prefissare una variabile con "quello" è eccessivo e si corre il rischio di ottenere risultati inaspettati.


==Usage of NAOK==  
==Utilizzo di NAOK==  


NAOK --> "Not Applicable" (NA) is alright (OK)
NAOK --> "Non applicabile" (NA) va bene (OK)


Using NAOK, means that all or some of the variables are irrelevant (e.g. "Not Applicable" (NA) is alright (OK)).  
L'uso di NAOK significa che tutte o alcune delle variabili sono irrilevanti (ad esempio "Non applicabile" (NA) va bene (OK)).  


When you put some variable from question in any equation : if this question (or subquestion) is hidden by condition : this disable all equation.
Quando metti una variabile dalla domanda in qualsiasi equazione: se questa domanda (o sottodomanda) è nascosta dalla condizione: disabilita tutte le equazioni.


For example : count(Q1_SQ1,Q1_SQ2,Q1_SQ3,Q1_SQ4) give always an empty string if one subquestion of Q1 is filtered.
Ad esempio: count(Q1_SQ1,Q1_SQ2,Q1_SQ3,Q1_SQ4) fornisce sempre una stringa vuota se una sottodomanda di Q1 è filtrata.
To count the number of checked subquestion in such question can be count(Q1_SQ1.NAOK,Q1_SQ2.NAOK,Q1_SQ3.NAOK,Q1_SQ4.NAOK). If the sub question is hidden :Expression manager return an empty string.
Per contare il numero di sottodomanda controllate in tale domanda può essere count(Q1_SQ1.NAOK,Q1_SQ2.NAOK ,Q1_SQ3.NAOK,Q1_SQ4.NAOK). Se la sottodomanda è nascosta :Expression manager restituisce una stringa vuota.


Without NAOK : if one question or one subquestion is hidden : Expression Manager return always an empty string, same to return false.
Senza NAOK: se una domanda o una sottodomanda è nascosta: Expression Manager restituisce sempre una stringa vuota, lo stesso per restituire false.


The .shown always use the NAOK system (empty string if hidden) but if you need the code of the answer : it's always a good idea to add .NAOK after the question code. Except if you need it and know what you do.
I .mostrati usano sempre il sistema NAOK (stringa vuota se nascosta) ma se hai bisogno del codice della risposta: è sempre una buona idea aggiungere .NAOK dopo il codice della domanda. Tranne se ne hai bisogno e sai cosa fai.


Another example and information is provided at [[#Overriding_Cascading_Conditions|Overriding Cascading Conditions]]
Un altro esempio e informazioni sono forniti in [[#Overriding_Cascading_Conditions|Sostituzione delle condizioni a cascata]]


==Access to Functions==
==Accesso alle funzioni==


Expression Manager provides access to mathematical, string, and user-defined functions, as shown below.  It has PHP and JavaScript equivalents for these functions so that they work identically on server-side (PHP) and client-side (JavaScript).  It is easy to add new functions.
Expression Manager fornisce l'accesso a funzioni matematiche, stringhe e definite dall'utente, come illustrato di seguito. Ha equivalenti PHP e JavaScript per queste funzioni in modo che funzionino in modo identico sul lato server (PHP) e sul lato client (JavaScript). È facile aggiungere nuove funzioni.


===Implemented Functions===
===Funzioni implementate===


The following functions are currently available:
Attualmente sono disponibili le seguenti funzioni:


{| class="wikitable"
{| class="wikitable"
Line 859: Line 855:
|}
|}


===Functions that are Planned or Being Considered===
===Funzioni pianificate o prese in considerazione===


Other functions that are planned (or being considered) but which are not implemented yet include the following.  Some of these are for backwards compatability with another survey tool.
Altre funzioni pianificate (o prese in considerazione) ma non ancora implementate includono quanto segue. Alcuni di questi sono compatibili con le versioni precedenti con un altro strumento di indagine.


{| class="wikitable"
{| class="wikitable"
!Syntax!!Meaning!!Comments
!Sintassi!!Significato!!Commenti
|-
|-
|e()||returns the value of e||
|e()||restituisce il valore di e||
|-
|-
|formatDate(X,PAT)||return the string value of date X formatted according to Java data format pattern PAT||
|formatDate(X, PAT)||restituisce il valore stringa della data X formattato secondo il modello di formato dati Java PAT||
|-
|-
|formatNumber(X,PAT)||return the string value of number X formatted according to Java number format pattern PAT||
|formatNumber(X,PAT)||restituisce il valore stringa del numero X formattato secondo il numero Java modello di formato PAT||
|-
|-
|getAnsOption(X)|| [[ExpressionAnswerOptions|Core plugin ExpressionAnswerOptions ]] ||
|getAnsOption(X)|| [[ExpressionAnswerOptions|Plugin principale ExpressionAnswerOptions ]] ||
|-
|-
|getAnsOption(X,Y)|| [[ExpressionAnswerOptions|Core plugin ExpressionAnswerOptions ]] ||
|getAnsOption(X,Y)|| [[ExpressionAnswerOptions|Core plugin ExpressionAnswerOptions ]] ||
|-
|-
|getRelevance(X)||returns the relevance equation for question X||
|getRelevance(X)||restituisce l'equazione di rilevanza per la domanda X||
|-
|-
|getStartTime()||returns the date corresponding to the system time when the interview was started||
|getStartTime()||restituisce la data corrispondente all'ora di sistema in cui è iniziata l'intervista||
|-
|-
|getType(X)||returns the string name of the datatype - e.g. *NA* if isNA()||
|getType(X)||restituisce il nome stringa del tipo di dato - es. *NA* se isNA()||
|-
|gotoFirst()||salta alla prima serie di domande rilevanti - questo viola il normale flusso del sistema||
|-
|-
|gotoFirst()||jumps to the first relevant set of questions - this violates the normal flow of the system||
|gotoNext()||salta alla serie successiva di domande rilevanti - questo viola il normale flusso del sistema||
|-
|-
|gotoNext()||jumps to the next set of relevant questions - this violates the normal flow of the system||
|gotoPrevious()||salta alla serie precedente di domande rilevanti - questo viola il normale flusso del sistema||
| -
|isAsked(X)||restituisce true se la risposta non è né *NA*, *INVALID*, né *UNASKED*||
|-
|-
|gotoPrevious()||jumps to the previous set of relevant questions - this violates the normal flow of the system||
|isInvalid(X)||restituisce true se la risposta è di tipo *INVALID*||
|-
|-
|isAsked(X)||returns true if the answer is neither *NA*, *INVALID*, nor *UNASKED*||
|isNA(X)||restituisce true se la risposta è di tipo *NA*||
|-
|-
|isInvalid(X)||returns true if the answer is of type *INVALID*||
|isNotUnderstood(X )||restituisce true se la risposta è di tipo *HUH*||
|-
|-
|isNA(X)||returns true if the answer is of type *NA*||
|isRefused(X)||restituisce true se la risposta è di tipo *REFUSED*||
|-! N!|isSpecial(X)||restituisce true se la risposta è di tipo *UNASKED*, *NA*, *REFUSED*, *INVALID*, *UNKNOWN* o *HUH*||
|-!N !|isUnknown(X)||restituisce vero se la risposta è di tipo *UNKNOWN*||
|-
|-
|isNotUnderstood(X)||returns true if the answer if of type *HUH*||
|jumpTo(X)||salta al gruppo contenente la domanda nominata -- questo viola il normale flusso del sistema||
|-
|-
|isRefused(X)||returns true if the answer is of type *REFUSED*||
|jumpToFirstUnasked()||salta alla prima domanda non posta <strike>ignorando così le precedenti domande con risposta</strike> questo viola il normale flusso del sistema||
|-
|-
|isSpecial(X)||returns true if the answer is of type *UNASKED*, *NA*, *REFUSED*, *INVALID*, *UNKNOWN*, or *HUH*||
| lastIndexOf(X,Y)||restituisce l'ultimo indice (base 0) della stringa Y nella stringa X. Restituisce -1 se Y non è contenuta all'interno di X||
|-
|-
|isUnknown(X)||returns true if the answer is of type *UNKNOWN*||
|list(X,.. .)||una stringa contenente un elenco separato da virgole dei valori positivi con "e" che separa gli ultimi due||
|-
|-
|jumpTo(X)||jump to the group containing the named question -- this violates the normal flow of the system||
|mean(X,...)||restituisce la media di un elenco of values||
|-
|-
|jumpToFirstUnasked()||jump to the first unasked question <strike> thus bypassing previous answered questions </strike> this violates the normal flow of the system||
|numAnsOptions(X)||restituisce il numero di opzioni di risposta che la domanda X ha||
|-
|-
|lastIndexOf(X,Y)||returns the last index (base 0) of string Y in string X. Returns -1 if Y is not contained within X||
|olist(X,...)|| una stringa contenente un elenco separato da virgole dei valori positivi, con "o" che separa gli ultimi due||
|-
|-
|list(X,...)||a string containing a comma separated list of the positive values with "and" separating the last two||
|parseDate(X,PAT)||restituisce il valore della data della stringa X analizzata con data Java format pattern PAT||
|-
|-
|mean(X,...)||returns the mean of a list of values||
|parseNumber(X,PAT)||restituisce il valore numerico della stringa X analizzata con Java number format pattern PAT||
|-
|-
|numAnsOptions(X)||returns the number of answer options that question X has||
|showAllResponsesExcept( questionList ,attributeList,attributeTitleList)||questionList = elenco delimitato da barre verticali di identificatori di domande; attributeList = elenco di attributi delimitato da barre verticali (come domanda#, titolo, testo, tipo - così puoi decidere cosa mostrare); attributeTitleList = elenco delimitato da barra verticale delle intestazioni della tabella, in modo da poter internazionalizzare il rapporto.||
|-
|-
|orlist(X,...)||a string containing a comma separated list of the positive values, with "or" separting the last two||
|showTheseResponses( questionList,attributeList,attributeTitleList)||questionList = elenco delimitato da barra verticale degli identificatori di domanda; attributeList = elenco di attributi delimitato da barre verticali (come domanda#, titolo, testo, tipo - così puoi decidere cosa mostrare); attributeTitleList = elenco di intestazioni di tabella delimitato da barra verticale, quindi può internazionalizzare il report.||  
|-
|parseDate(X,PAT)||returns the date value of string X parsed with Java date format pattern PAT||
|-
|parseNumber(X,PAT)||returns the numerical value of string X parsed with Java number format pattern PAT||
|-
|showAllResponsesExcept( questionList,attributeList,attributeTitleList)||questionList = pipe-delimited list of question identifiers; attributeList = pipe-delimited list of attributes (like question#, title, text, type - so you can decide what to show); attributeTitleList = pipe-delimited list of table headers, so can internationalize the report.||
|-
|showTheseResponses( questionList,attributeList,attributeTitleList)||questionList = pipe-delimited list of question identifiers; attributeList = pipe-delimited list of attributes (like question#, title, text, type - so you can decide what to show); attributeTitleList = pipe-delimited list of table headers, so can internationalize the report.||  
|}
|}


==Expression Manager Knows Which Variables are Local==
==Expression Manager sa quali variabili sono locali==


In order to properly build the JavaScript for page, Expression Manager needs to know which variables are set on the page, and what their JavaScript ID is (e.g. for document.getElementById(x)).  It also must know which variables are set on other pages (so that it can ensure that the needed <input type='hidden' value='x'> fields are present and populated).
Per creare correttamente il JavaScript per la pagina, Expression Manager deve sapere quali variabili sono impostate sulla pagina e qual è il loro ID JavaScript (ad esempio per document.getElementById(x)). Deve anche sapere quali variabili sono impostate su altre pagine (in modo da poter garantire che i file necessari<input type='hidden' value='x'> i campi sono presenti e popolati).


==Cascading Conditions==
==Condizioni a cascata==


If any of the variables are irrelevant, the whole equation will be irrelevant (false).  For example, in the following table, N/A means that one of the variables was not relevant
Se una qualsiasi delle variabili è irrilevante, l'intera equazione sarà irrilevante (falso). Ad esempio, nella tabella seguente, N/A significa che una delle variabili non era rilevante


{| class="wikitable"
{| class="wikitable"
!Operator!!Example!!a!!b!!Result
!Operatore!!Esempio!!a!!b!!Risultato
|-
|-
|<nowiki>+ (unary)</nowiki>||<nowiki>+a</nowiki>||N/A|| ||false
|<nowiki> + (unario)</nowiki> ||<nowiki> +a</nowiki> ||N/D|| ||falso
|-
|-
|- (unary)||-a||N/A|| ||false
|- (unario)||-a||N/A|| ||falso
|-
|-
|!||!a||N/A|| ||false
|!||!a||N/A|| ||false
|-
|-
|== (or eq)||a == b||N/A||5||false
|== (o eq)||a == b||N/A||5||false
|-
|== (or eq)||a == b||N/A||0||false
|-
|-
|== (or eq)||a == b||N/A||N/A||false
|== (o eq) ||a == b||N/A||0||false
|-
|-
|!= (or ne)||a != b||N/A||5|| false
|== (o eq)||a == b||N/A||N/A|| false
|-
|-
|!= (or ne)||a != b||N/A||N/A|| false
|!= (o ne)||a != b||N/A||5|| false
|-
|-
|!= (or ne)||a != b||N/A||0||false
|!= (o ne)||a != b||N/A||N/A|| false
|-
|-
|> (or gt)||a > b||N/A||5|| false
|!= (o ne)||a != b||N/A||0||false
|-
|-
|>= (or ge)||a >= b||N/A||5||false
|> (o gt)||a > b||N/A||5|| false
|-
|-
|< (or lt)||a < b||N/A||5||false
|>= (o ge)||a >= b||N/A||5||false
|-
|-
|<= (or le)||a <= b||N/A||5||false
|< (o lt)||a < b||N/A||5||false
|-
|-
|and||a and b||N/A||5||false
|<= (o le)||a <= b||N/A||5||false
|-
|e||a e b||N/A||5||falso
|-
|-
|and||a and b||N/A||N/A||false
|e||a e b||N/A||N/A||falso! N!|-
|o||a o b||N/A||N/A||falso
|-
|-
|or||a or b||N/A||N/A||false
|o||a o b||N/A||5 ||falso
|-
|-
|or||a or b||N/A||5||false
|<nowiki> +</nowiki> ||a + b||N/A||5||falso
|-
|-
|<nowiki>+</nowiki>||a + b||N/A||5||false
|-||a - b||N/A||5||falso
|-
|-
|-||a - b||N/A||5||false
|*||a * b||N/A||5||falso
|-
|-
|*||a * b||N/A||5||false
|/||a / b||5||N/A||falso
|-
|-! N!|()||(a)||N/A|| ||false
|/||a / b||5||N/A||false
|-
|()||(a)||N/A|| ||false
|-
|-
|(exp)||(a && b)||N/A||5||false
|(exp)||(a && b)||N/A||5||false
|-
|-
|(exp) op (exp)||(b + b) > (a && b)||N/A||5||false
|(exp) op (exp)| |(b + b) > (a && b)||N/A||5||false
|-
|function||sum(a,b,b)||N/A||5||false
|-
|-
|function||max(a,b)||N/A||5||false
|funzione||sum(a,b,b)||N/A|| 5||falso
|-
|-
|function||min(a,b)||N/A||5||false
|funzione||max(a,b)||N/A||5||falso
|-
|-
|function||implode(', ',a,b,a,b)||N/A||5||false
|funzione||min(a,b )||N/A||5||false
|-
|-
|function||if(a,a,b)||N/A||5||false
|funzione||implode(', ',a,b,a,b)||N/A||5||false! N!|-
|funzione||if(a,a,b)||N/A||5||false
|-
|-
|function||is_empty(a)||N/A|| ||false
|funzione||è_vuoto(a)||N/ A|| ||false
|-
|-
|function||is_empty(a)||0 (or blank)|| ||true
|funzione||è_vuoto(a)||0 (o vuoto)|| ||vero
|-
|-
|function||!is_empty(a)||N/A|| ||false
|funzione||!è_vuoto(a)||N/A|| ||falso
|}
|}


===Overriding Cascading Conditions===
===Sovrascrivere le condizioni a cascata===


Say you want to show a running total of all relevant answers.  You might try to use the equation {sum(q1,q2,q3,...,qN)}.  However, this gets translated internally to LEMif(LEManyNA('q1','q2','q3',...,'qN'),'',sum(LEMval('q1'),LEMval('q2'),LEMval('q3'),...,LEMval('qN'))).  So, if any of the values q1-qN are irrelevant, the equation will always return false.  In this case, the sum() will show 0 until all questions are answered.
Supponi di voler mostrare un totale parziale di tutte le risposte pertinenti. Potresti provare a usare l'equazione {sum(q1,q2,q3,...,qN)}. Tuttavia, questo viene tradotto internamente in LEMif(LEManyNA('q1','q2','q3',...,'qN'),'',sum(LEMval('q1'),LEMval('q2') ,LEMval('q3'),...,LEMval('qN'))). Quindi, se uno qualsiasi dei valori q1-qN è irrilevante, l'equazione restituirà sempre false. In questo caso, sum() mostrerà 0 fino a quando non verrà data risposta a tutte le domande.


To get around this, each variable can have a ".NAOK" suffix (meaning that Not Applicable is OK) added to it.  In such cases, the following behavior occurs.  Say you have a variable q1.NAOK
Per aggirare questo problema, a ogni variabile può essere aggiunto un suffisso ".NAOK" (che significa che non applicabile è OK). In tali casi, si verifica il seguente comportamento. Supponi di avere una variabile q1.NAOK
#q1 is not added to the LEManyNA() clause
#q1 non aggiunta alla clausola LEManyNA()
#LEMval('q1') will  continue to check whether the response is relevant, and will return <nowiki>''</nowiki> if it is not (so individual irrelevant responses will be ignored, but they will not void the entire expression).
#LEMval('q1') continuerà a verificare se la risposta è rilevante e restituirà<nowiki> ''</nowiki> in caso contrario (quindi le singole risposte irrilevanti verranno ignorate, ma non annulleranno l'intera espressione).


So, the solution to the running total problem is to use the equation sum(q1.NAOK,q2.NAOK,q3.NAOK,...,qN.NAOK).
Quindi, la soluzione al problema del totale parziale è usare l'equazione sum(q1.NAOK,q2.NAOK,q3.NAOK,...,qN.NAOK).


The use of the .NAOK suffix also lets authors design surveys that have several possible paths but then converge on common paths later.  For example, say subjects answer a survey in a way that is outside the normal range of responses.  The author could alert the subjects that they may not get valid results, and ask them whether they really want to  continue with the survey.  If they say Yes, then the rest of the questions will be shown.  The condition for the "rest of the questions" would check whether the initial responses were answered within the normal range OR whether the subject said Yes to the question that is only relevant if they answered outside the normal range.
L'uso del suffisso .NAOK consente inoltre agli autori di progettare sondaggi che hanno diversi percorsi possibili ma poi convergono su percorsi comuni in un secondo momento. Ad esempio, diciamo che i soggetti rispondono a un sondaggio in un modo che è al di fuori del normale intervallo di risposte. L'autore potrebbe avvisare i soggetti che potrebbero non ottenere risultati validi e chiedere loro se vogliono davvero continuare con il sondaggio. Se rispondono Sì, verranno mostrate le altre domande. La condizione per il "resto delle domande" verificherebbe se le risposte iniziali hanno ricevuto una risposta entro l'intervallo normale OPPURE se il soggetto ha detto Sì alla domanda che è rilevante solo se ha risposto al di fuori dell'intervallo normale.


==How does Expression Manager Support Conditional Micro-Tailoring?==
==In che modo Expression Manager supporta il microadattamento condizionale?==


Here is an example of micro-tailoring (where Question Type=='expr' means an Equation):
Ecco un esempio di micro-sartoria (dove Question Type=='expr' indica un'equazione):


{| class="wikitable"
{| class="wikitable"
!Question Code!!Relevance!!Question Type!!Question
!Codice domanda!!Rilevanza!!Tipo di domanda!!Domanda
|-
|name||1||text||What is your name?
|-
|age||1||text||How old are you?
|-
|badage||!is_empty(age)||expr||{(age<16) or (age>80)}
|-
|-
|agestop||badage||message||Sorry, {name}, you are too {if( (age<16),'young',if( (age>80),'old','middle-aged') ) } for this test.
|nome||1||testo||Come ti chiami?
|-! N!|età||1||testo||Quanti anni hai?
|-
|-
|kids||!badage||yesno||Do you have children?
|badage||!is_empty(età)||expr||{(età<16) o (età>80 )}
|-
|-
|parents||1||expr||{!badage && kids=='Y'}
|agestop||badage||messaggio||Spiacente, {nome}, anche tu sei {if( (età<16),'giovane',if( (età>80), 'vecchio','di mezza età') ) } per questo test.
|-
|-
|numKids||parents||text||How many children do you have?
|bambini||!badage||sìno||Hai figli?
|-
|-
|kid1||parents && numKids >= 1||text||How old is your first child?
|genitori ||1||expr||{!badage && kids=='Y'}
|-
|-
|kid2||parents && numKids >= 2||text||How old is your second child?
|numKids||parents||text||Quanti figli hai?
|-! N!|kid1||parents && numKids >= 1||text||Quanti anni ha il tuo primo figlio?
|-
|-
|kid3||parents && numKids >= 3||text||How old is your third child?
|kid2||parents && numKids >= 2||text||Quanti anni ha il tuo secondo figlio?
|-
|-
|kid4||parents && numKids >= 4||text||How old is your fourth child?
|kid3||parents && numKids >= 3||text||Quanti anni ha il tuo terzo figlio?
|-
|-
|kid5||parents && numKids >= 5||text||How old is your fifth child?
|kid4||parents && numKids > = 4||testo||Quanti anni ha il tuo quarto figlio?
|-
|-
|sumage||1||expr||{sum(kid1.NAOK,kid2.NAOK,kid3.NAOK,kid4.NAOK,kid5.NAOK)}
|kid5||genitori && numRagazzi >= 5||testo||Quanti anni ha il tuo quinto figlio?
|-! N!|sumage||1||expr||{sum(kid1.NAOK,kid2.NAOK,kid3.NAOK,kid4.NAOK,kid5.NAOK)}
|-
|-
|report||parents||yesno||{name}, you said you are {age} and that you have {numKids}.  The sum of ages of your first {min(numKids,5)} kids is {sumage}
|report||genitori| |yesno||{name}, hai detto che sei {age} e che hai {numKids}. La somma delle età dei tuoi primi {min(numKids,5)} figli è {sumage}
|}
|}


All of these questions can be on a single page (e.g. in the same group), and only the relevant questions will display.  Moreover, as you enter the ages of children, the sum() expression in the last question will dynamically update on the page.
Tutte queste domande possono trovarsi su un'unica pagina (ad es. nello stesso gruppo) e verranno visualizzate solo le domande pertinenti. Inoltre, quando inserisci l'età dei bambini, l'espressione sum() nell'ultima domanda si aggiornerà dinamicamente sulla pagina.


Expression Manager provides this functionality by surrounding each expression with a named <nowiki><span></nowiki> element.  Every time a value changes, it recomputes the expression that should appear in that <nowiki><span></nowiki> element and regenerates the display.  You can have dozens, or even hundreds, of such tailored expressions on the same page, and the page will re-display all of them in a single screen refresh.
<html>Expression Manager fornisce questa funzionalità circondando ogni espressione con un named<nowiki></nowiki> <span>elemento. Ogni volta che un valore cambia, ricalcola l'espressione che dovrebbe apparire in quello</span><nowiki></nowiki> <span><span>elemento e rigenera il display. Puoi avere dozzine, o addirittura centinaia, di tali espressioni personalizzate sulla stessa pagina e la pagina le visualizzerà nuovamente tutte in un singolo aggiornamento dello schermo.</span></span>


==Mapping of LimeSurvey 1.91+ to Expression Manager Functionality==
==Mappatura di LimeSurvey 1.91+ alla funzionalità Expression Manager==


{| class="wikitable"
{| class="wikitable"
!Old Feature!!New Feature!!Comments
!Vecchia funzionalità!!Nuova funzionalità!!Commenti
|-
|Conditions||Relevance||You can use very complex conditional equations, and access a broader range of variables
|-
|-
|Assessments||Equation||Any assessment scores can be re-structured into an Equation. This both ensures that the score is written to the database, and also lets you see dynamic changes to the score value on the current page
|Condizioni||Rilevanza||Puoi utilizzare equazioni condizionali molto complesse e accedere a una gamma più ampia di variabili!N !|-
|Valutazioni||Equazione||Qualsiasi punteggio di valutazione può essere riorganizzato in un'equazione. Questo assicura che il punteggio sia scritto nel database e ti consente anche di vedere le modifiche dinamiche al valore del punteggio nella pagina corrente
|-
|-
|Replacements||Expression Manager||The core engine takes the input string and treats everything within curly braces as an Expression - so it handles all historical replacements types.  To avoid messing up embedded JavaScript, Expression Manager only processes content between curly braces as long as (a)  there is no leading or trailing whitespace within the curly braces - e.g. {expr} is an expression, but { expr}, {expr }, and { expr } are not expressions.  Furthermore, Expression Manager does not process content within its own strings (e.g. {list('hi','there {braces}')} generates "hi there {braces}").  It also ignores escaped curly braces (e.g. \{this is not an expression\})
|Sostituzioni||Expression Manager||Il motore principale accetta la stringa di input e tratta tutto ciò che è racchiuso tra parentesi graffe come un'espressione, quindi gestisce tutti i tipi di sostituzioni storiche. Per evitare di incasinare JavaScript incorporato, Expression Manager elabora solo il contenuto tra parentesi graffe purché (a) non ci siano spazi bianchi iniziali o finali all'interno delle parentesi graffe - ad esempio {expr} è un'espressione, ma { expr}, {expr}, e { expr } non sono espressioni. Inoltre, Expression Manager non elabora il contenuto all'interno delle proprie stringhe (ad es. {list('hi','there {braces}')} genera "hi there {braces}"). Ignora anche le parentesi graffe con escape (ad es. \{questa non è un'espressione\})
|-
|-
|Validation||Expression Manager||The plan is to take the current min/max Question Attributes and have Expression Manager process them.  That way the min/max values can be expressions themselves
|Convalida||Expression Manager||Il piano è prendere gli attributi domanda min/max correnti e avere Expression Manager elaborarli. In questo modo i valori min/max possono essere essi stessi espressioni
|}
|}


=Syntax Highlighting=
=Evidenziazione della sintassi=


To help with entering and validating expressions, EM provides syntax highlighting with the following features:
Per facilitare l'immissione e la convalida delle espressioni, EM fornisce l'evidenziazione della sintassi con le seguenti funzionalità:


==Types and Meanings of Syntax Highlighting==
==Tipi e significati dell'evidenziazione della sintassi==


{| class="wikitable"
{| class="wikitable"
!Color!!Sample!!Meaning!!Tooltip!!Comments
!Colore!!Esempio!!Significato!!Descrizione comandi!!Commenti
|-
|tan background||style='background-color: #eee8aa'|Sample||the whole equation||none||Anything within curly braces that is recognized as an equation (e.g. there is no leading or trailing whitepace) will be color-coded with a tan background to help distinguish it from surrounding text
|-
|-
|bold red text||style='color:#ff0000; background-color:#eee8aa'|'''Sample'''||An error||Some explanation on error||Can be an unknow variable or an error in function, .... Survey can be totally broken, this don't show to public user.
|tan background||style='background-color: #eee8aa'|Esempio||il equazione intera||nessuno||Qualsiasi elemento all'interno delle parentesi graffe riconosciuto come equazione (ad es. non ci sono spazi bianchi all'inizio o alla fine) sarà codificato a colori con uno sfondo marrone chiaro per distinguerlo dal testo circostante
|-!N !|testo in grassetto rosso||style='color:#ff0000; background-color:#eee8aa'|'''Campione'''||Un errore||Qualche spiegazione sull'errore||Può essere una variabile sconosciuta o un errore nella funzione, .... Il sondaggio può essere completamente interrotto, questo don 'non mostrare all'utente pubblico.
|-
|-
|blue text||style='color:#0000ff; background-color:#eee8aa'|Sample||function name||meaning and allowable syntax||function names, or things that should be functions since they are followed by an opening parenthesis, are presented in bold blue text. Tooltips show the meaning and allowable syntax for the function.
|blue text||style='color:#0000ff; background-color:#eee8aa'|Esempio||nome funzione||significato e sintassi consentita||i nomi delle funzioni, o cose che dovrebbero essere funzioni poiché sono seguite da una parentesi di apertura, sono presentati in grassetto blu. I tooltip mostrano il significato e la sintassi consentita per la funzione.
|-
|-
|grey text||style='color:#808080; background-color:#eee8aa'|Sample||string||none||single and double-quoted strings are shown in grey text
|grey text||style='color:#808080; background-color:#eee8aa'|Sample||string||none||le stringhe tra virgolette singole e doppie sono mostrate in testo grigio
|-
|-
|cyan text||style='color:#4169e1; background-color:#eee8aa'|Sample||variable set on the same page,||<nowiki>[</nowiki>name or SGQA code]: question; value; answerList showing codes for each value||Any variable that is set on the same page to the current question is shown in cyan text, showning it can be updated in javascript. The tooltip shows its name (if you used INSERTANS:xxx) or SGQA code (if you used the new naming system), the actual question, and its current value (or blank if not set). If the question type expects responses from an enumerated value set, the mapping of the codes to display values is show.
|testo ciano||style='color:#4169e1; background-color:#eee8aa'|Campione||variabile impostata sulla stessa pagina,||<nowiki> [</nowiki> nome o codice SGQA]: domanda; valore; answerList che mostra i codici per ogni valore||Qualsiasi variabile impostata sulla stessa pagina della domanda corrente viene mostrata in testo ciano, a indicare che può essere aggiornata in javascript. Il tooltip mostra il suo nome (se hai utilizzato INSERTANS:xxx) o il codice SGQA (se hai utilizzato il nuovo sistema di denominazione), la domanda effettiva e il suo valore corrente (o vuoto se non impostato). Se il tipo di domanda prevede risposte da un insieme di valori enumerati, la mappatura dei codici per visualizzare i valori è show.
|-
|-
|green text||style='color:#008000; background-color:#eee8aa'|Sample||variable set on a prior page||<nowiki>[</nowiki>name or SGQA code]: question; value; answerList showing codes for each value||Any variable that is set on a prior page is shown in bold green text. The tooltip shows its name (if you used INSERTANS:xxx) or SGQA code (if you used the new naming system), the actual question, and its current value (or blank if not set). If the question type expects responses from an enumerated value set, the mapping of the codes to display values is show.
|green text||style='color:#008000; background-color:#eee8aa'|Esempio||variabile impostata su una pagina precedente||<nowiki> [</nowiki> nome o codice SGQA]: domanda; valore; answerList che mostra i codici per ogni valore||Qualsiasi variabile impostata su una pagina precedente è mostrata in grassetto verde. Il tooltip mostra il suo nome (se hai utilizzato INSERTANS:xxx) o il codice SGQA (se hai utilizzato il nuovo sistema di denominazione), la domanda effettiva e il suo valore corrente (o vuoto se non impostato). Se il tipo di domanda prevede risposte da un set di valori enumerati, la mappatura dei codici per visualizzare i valori è show.
|-
|-
|bold pink text||style='color:#9370db; background-color:#eee8aa'|Sample||variable set on a later page <sup>in general : empty at survey start, but can be filled with index or move previous</sup>||<nowiki>[</nowiki>name or SGQA code]: question; value; answerList showing codes for each value||Any variable that is set on a next page is shown in bold pink text. The tooltip shows its name (if you used INSERTANS:xxx) or SGQA code (if you used the new naming system), the actual question, and its current value (or blank if not set). If the question type expects responses from an enumerated value set, the mapping of the codes to display values is show.
|bold pink text||style='color:#9370db; background-color:#eee8aa'|Sample||variabile impostata in una pagina successiva <sup>in generale : vuota all'inizio del sondaggio, ma può essere riempita con indice o sposta precedente</sup> ||<nowiki> [</nowiki> nome o codice SGQA]: domanda; valore; answerList che mostra i codici per ogni valore||Qualsiasi variabile impostata su una pagina successiva viene mostrata in grassetto rosa. Il tooltip mostra il suo nome (se hai utilizzato INSERTANS:xxx) o il codice SGQA (se hai utilizzato il nuovo sistema di denominazione), la domanda effettiva e il suo valore corrente (o vuoto se non impostato). Se il tipo di domanda prevede risposte da un set di valori enumerati, la mappatura dei codici per visualizzare i valori è show.
|-
|-
|bold tan text||style='color:#a0522d; background-color:#eee8aa'|Sample||a lime replacement value||the value||Lime Replacement Strings (like {TOKEN:xxx}, {PRIVACY_MESSAGE}) are shown in bold tan text.
|bold tan text||style='color:#a0522d; background-color:#eee8aa'|Campione||un valore di sostituzione del lime||il valore||Le stringhe di sostituzione del lime (come {TOKEN:xxx}, {PRIVACY_MESSAGE}) sono mostrate in grassetto marrone chiaro.  
|-
|-
|red text||style='color:#ff4500; background-color:#eee8aa'|Sample||assignment operator (=) ||warning message||If you use one of the assignment operator (=) that operator will be displayed in red text. This is meant to help prevent accidental re-assignment of values when you really meant to check whether a == b instead of  setting the value of a = b.
|testo rosso||style='color:#ff4500; background-color:#eee8aa'|Esempio||operatore di assegnazione (=) ||messaggio di avviso||Se usi uno degli operatori di assegnazione (=) quell'operatore verrà visualizzato in rosso. Questo ha lo scopo di aiutare a prevenire la riassegnazione accidentale di valori quando volevi davvero verificare se a == b invece di impostare il valore di a = b.
|-
|-
|normal black text||style='color:black; background-color:#eee8aa'|Sample||punctuation||none||All other punctuation within the expression is shown as normal black text.
|testo nero normale||style=' colore nero; background-color:#eee8aa'|Esempio||punteggiatura||none||Tutti gli altri segni di punteggiatura all'interno dell'espressione vengono mostrati come normale testo nero.
|-
|-
|red-boxed text||a bold red line surrounds the error||syntax error||description of the error||Any detected syntax errors are shown by surrounding the error with a red box. The tooltip shows the error. Examples include unmatched parentheses, use of undefined functions, passing the wrong number of arguments to functions, poorly structured expressions (e.g. missing operators between variables), trying to assign a new value to a read-only variable, trying to assign values to non-variables, or using unsupported syntax. Note that the syntax error dectection system may only report one error in an expression even if there are multiple errors; however, if any errors are detected, at least one error will be shown.
|testo con riquadro rosso||una linea rossa in grassetto circonda l'errore||errore di sintassi||descrizione dell'errore||Eventuali errori di sintassi rilevati vengono mostrati circondando l'errore con una casella rossa. Il tooltip mostra l'errore. Gli esempi includono parentesi non corrispondenti, uso di funzioni non definite, passaggio di un numero errato di argomenti alle funzioni, espressioni mal strutturate (ad es. operatori mancanti tra variabili), tentativi di assegnare un nuovo valore a una variabile di sola lettura, tentativi di assegnare valori a variabili non variabili o utilizzando una sintassi non supportata. Si noti che il sistema di rilevamento degli errori di sintassi può segnalare solo un errore in un'espressione anche se sono presenti più errori; tuttavia, se vengono rilevati errori, verrà mostrato almeno un errore.
|}
|}


=Additional Reading=
=Lettura aggiuntiva=
 
==[[Sondaggi campione di Expression Manager|Sondaggi campione di Expression Manager]]==


==[[Expression Manager sample surveys|Expression Manager sample surveys]]==
==[[ExpressionScript How-tos|Casi d'uso e How-To]]==


==[[ExpressionScript How-tos|Use Cases and HowTos]]==
==[[Esempi ExpressionScript|Esempi passo-passo]]==


==[[ExpressionScript examples|Step-by-Step examples]]==
==[[StatFunctions|Expression Manager statistic functions]]==


==[[Expression Manager for developers|Reference for Developers]]==
==[[Expression Manager per sviluppatori|Riferimento per sviluppatori]]==


==[[Expression Manager roadmap|RoadMap/Status/ToDo List]]==
==[[Roadmap di Expression Manager|RoadMap/Stato/Elenco cose da fare]]==

Latest revision as of 17:07, 2 April 2024

Nota: questa funzionalità è disponibile solo a partire dalla versione 1.92 di LimeSurvey 1.92.

Quick Start Tutorial

Introduzione

Nella gestione dei sondaggi, spesso è necessario utilizzare alcune delle seguenti caratteristiche:

  1. Navigazione/Ramificazione - fare in modo che le risposte inserite precedentemente condizionino l'ordine in cui le domande sono mostrate.
  2. Personalizzazione e incatenamento degli eventi (Tailoring & Piping) - fare in modo che le domande siano declinate in base a risposte fornite precedente, ad esempio coniugando i verbi in base al numero o al genere dei sostantivi; oppure generazione di report personalizzati come ad esempio valutazioni con punteggio o suggerimenti mirati.
  3. Convalida - imporre il rispetto di determinati criteri per le risposte inserite: ad esempio valore massimo e minimo, oppure il rispetto di un certo formato.

Il Gestore delle Espressioni o GE (in Inglese, Expression Manager o EM) fornisce una modalità intuitiva per specificare la logica delle funzionalità descritte. È possibile costruire espressioni valide per praticamente ogni equazione matematica standard, anche contenente funzioni. Il Gestore Espressioni consente l'utilizzo di 80 funzioni e può anche essere esteso per includerne di ulteriori. Le variabili possono essere chiamate con nomi facilmente leggibili e non solo con i codici SGQA.

Le sezioni seguenti mostrano i vari posti nei quali si può utilizzare il Gestore Espressioni

Rilevanza (Controllo della navigazione/Ramificazione)

Alcuni sistemi di gestione per sondaggi utilizzano una logica di tipo "GoTo": ad esempio, se si sceglie l'opzione C per la Domanda 1, allora vai alla Domanda 5. Questo approccio è piuttosto limitato, perché implica difficoltà di convalida e soprattutto perché la struttura logica si rompe se le domande vengono riordinate. Il GE utilizza una equazione di rilevanza booleana, con la quale sono specificate tutte le condizioni che una domanda deve rispettare per essere valida. Se la domanda ha "rilevanza", allora essa viene mostrata; altrimenti, è "non applicabile" e il valore NULL è salvato nel database delle risposte. Si tratta di qualcosa di simile a quanto può essere fatto dall'editor delle condizioni ma il GE permette di specificare facilmente criteri molto più complessi e potenti - e, inoltre, permette di usare il nome della variabile invece dei codici SGQA.

L'immagine seguente mostra un modo di sfruttare la logica di rilevanza in un sondaggio. il sondaggio dell'esempio calcola l'Indice di Massa Corporea, in inglese "Body Mass Index" o BMI. L'esempio è in inglese. L'equazione di rilevanza è mostrata in parentesi quadrate, subito dopo il nome della variabile (che è scritto in verde). Quindi, la rilevanza di weight, weight_units, height and height_units vale in tutti i casi 1, pertanto tutte queste domande sono sempre mostrate. L'equazione di rilevanza per il BMI, invece, è {!is_empty(height) and !is_empty(weight)}: questo significa che il BMI sarà calcolato solo se chi risponde al sondaggio ha inserito un valore sia per height ("altezza") che per weight ("peso"); in tal modo si evita di eseguire una divisione per zero con conseguente messaggio di errore. Anche la domanda Report è mostrata solo se sono state fornite a tutte e quattro le domande principali (height, height_units, weight, weight_units).

La pertinenza è mostrata e modificabile nei seguenti punti:

Visualizzazione/modifica della pertinenza a livello di domanda

Questa equazione calcola l'indice di massa corporea (BMI). Viene chiesto solo se la persona inserisce prima altezza e peso.

Questa è la schermata di modifica per la domanda BMI.

Si noti che non si utilizzano le parentesi graffe quando si immette un'equazione di rilevanza.

Visualizzazione/modifica della pertinenza a livello di gruppo

Questo è un campione di censimento. La prima pagina chiede quante persone vivono con te e le memorizza nella variabile "cohabs". Questa pagina viene mostrata solo se hai più di un convivente (quindi viene mostrata per la seconda persona che convive con te), e mostra anche solo se hai specificato in che modo la Persona Uno è imparentata con te (p1_rel).

Come puoi vedere, il gruppo ha anche criteri di pertinenza a livello di domanda, in modo tale che ogni domanda appaia solo dopo che hai risposto alla domanda precedente (es. {!is_empty(p1_sex)}). EM combina per te la pertinenza a livello di gruppo e di domanda. Le domande in un gruppo vengono poste solo se il gruppo nel suo insieme è rilevante. Quindi, viene chiesto solo il sottoinsieme di domande pertinenti all'interno del gruppo.

Ecco la schermata per modificare la pertinenza a livello di gruppo per quella domanda:

Si noti che non si utilizzano le parentesi graffe quando si immette un'equazione di rilevanza.

Sartoria/Piping

EM ti consente di eseguire facilmente adattamenti condizionali semplici e complessi delle tue domande. A volte hai solo bisogno di una semplice sostituzione, come dire: "Hai detto di aver acquistato [ Prodotto]. Cosa ti è piaciuto di più?". A volte hai bisogno di una sostituzione condizionale come " [ Signor signora.] [ Cognome], saresti disposto a completare il nostro sondaggio?". In questo caso, vuoi usare Mr. o Mrs. in base al sesso della persona. Altre volte hai bisogno di sostituzioni ancora più complesse (come basate su un calcolo matematico) EM supporta ciascuno di questi tipi di sartoria/piping.

Equazioni condizionali

L'esempio dell'indice di massa corporea mostra la capacità di calcolare l'indice di massa corporea di una persona, anche lasciandole inserire altezza e peso in unità metriche o non metriche.

File:Sartoria7.jpg

Qui peso_kg è {if(weight_units == 'kg', peso, peso * .453592)}. Questa funzione if() significa che se il soggetto ha inserito il peso usando i chilogrammi, usa quel valore, altrimenti moltiplica il valore inserito (che era in libbre) per .453592 per convertirlo in chilogrammi. La variabile height_m usa un approccio simile per calcolare l'altezza della persona in metri, anche se ha inserito la sua altezza in pollici.

BMI calcola la formula del peso come {peso_kg / (altezza_m * altezza_m)}.

Infine, il rapporto adatta in modo condizionale il messaggio al soggetto, dicendogli cosa ha inserito. ("Hai detto che sei alto 2 metri e pesi 70 kg.")

Anche se non ben mostrato nell'immagine sopra, weight_status utilizza istruzioni if() nidificate per classificare la persona da sottopeso a gravemente obesa. Puoi vedere la sua equazione nella vista Mostra logica

File:Sartoria8.jpg

Dalla finestra di modifica per questa domanda, puoi vedere due cose:

  1. Tailoring deve circondare le espressioni con parentesi graffe
  2. Le espressioni possono estendersi su più righe se, come in questo caso, vuoi rendere più facile la lettura del logica condizionale annidata.

File:Sartoria9.jpg

Domande, risposte e rapporti su misura

Nota: la personalizzazione dinamica potrebbe non funzionare se le opzioni di risposta sono rese disponibili in caselle selezionate nella stessa pagina della domanda. Ciò deriva dal fatto che la sartoria inserisce a tag che non è valido all'interno delle opzioni selezionate.

Questo esempio mostra il rapporto BMI.

Ecco la finestra di modifica per la stessa domanda.

Come puoi vedere, qualsiasi cosa tra parentesi graffe viene trattata come un'espressione, quindi viene evidenziata la sintassi (con codice colore) nell'immagine precedente. In caso di errori di battitura (come nomi di variabili o funzioni con errori di ortografia o non definiti), EM mostrerebbe un errore, come questo, che mostra che height_unit è un nome di variabile non definito (in realtà è height_units) e rnd() è una funzione non definita (il nome corretto della funzione è round()). In entrambi i casi, gli errori sono circondati da un riquadro rosso per facilitarne l'individuazione e la correzione.

Puoi anche vedere che puoi creare rapidamente report complessi, come una tabella di valori inseriti o consigli personalizzati.

Ricorda che tutte le personalizzazioni devono circondare le espressioni con parentesi graffe, in modo che LimeSurvey sappia quali parti della domanda sono testo libero e quali devono essere analizzate tramite Expression Manager.

Convalida

EM controlla il funzionamento della maggior parte delle opzioni di domande avanzate. Questi controllano aspetti come il numero minimo/massimo di risposte; valori individuali min/max; valori somma min/max; e controllando che i valori immessi corrispondano ai modelli di stringa specificati. Continui a inserire quelle opzioni di domande avanzate come al solito. Tuttavia, ora qualsiasi valore in uno di questi campi è considerato un'espressione, quindi puoi avere criteri min/max con relazioni condizionali complesse con altre domande.

In tutti questi casi, poiché l'opzione della domanda avanzata è sempre considerata un'espressione, non si usano le parentesi graffe quando la si specifica.

Le pagine Sondaggi di esempio mostrano molti esempi funzionanti dell'utilizzo delle espressioni per le convalide.

Introduzione

LimeSurvey utilizza il nuovo modulo Expression Manager (EM) che consentirà a LimeSurvey di supportare branching, valutazioni, convalida e personalizzazione più complessi. Sostituirà il modo in cui LimeSurvey gestisce le sostituzioni, le condizioni e le valutazioni nel back-end. Inoltre, accelererà notevolmente l'elaborazione poiché elimina la maggior parte delle letture del database in fase di esecuzione. EM è stato sviluppato dal Dr. Thomas White (TMSWhite).

Questa pagina wiki è il riferimento definitivo per la sintassi e la funzionalità di Expression Manager.

Definizioni chiave

  1. Espressione: Qualsiasi cosa racchiusa tra parentesi graffe
    • Sempre che non vi siano spazi bianchi immediatamente dopo la parentesi graffa di apertura o prima della parentesi graffa di chiusura
#*I contenuti delle espressioni sono valutati da EM, quindi possono contenere formule matematiche, funzioni ed elaborazioni complesse di stringhe e date.
  1. Adattamento: a volte chiamato "piping", questo è il processo di modifica condizionale del testo
    • Hai accesso a tutti i "campi sostitutivi", ai dati dei partecipanti e ai dati delle risposte.
    • Hai anche un accesso più facile a domande, risposte e alle loro proprietà.
  2. 'Rilevanza' Equazione: un nuovo attributo della domanda che controlla la visibilità della domanda
    • Se esiste un'equazione di rilevanza, la domanda viene mostrata solo se la pertinenza risulta vera.
    • Internamente, tutti array_filter e array_filter_exclude i comandi diventano rilevanti a livello di sottodomanda
  3. Equazione Tipo di domanda: un nuovo tipo di domanda che salva calcoli o report nel database
    • È come una domanda Boilerplate, ma il suo contenuto viene salvato in il database anche se imposti "Nascondi sempre questa domanda"
  4. Codice domanda: questo è il nome di variabile preferito per EM
    • Questo può essere un nome descrittivo che indica lo scopo della domanda , facilitando la lettura di logiche complesse
    • I codici domanda validi NON devono iniziare con un numero, quindi quando si utilizza il codice domanda per numerare le domande, utilizzare semplicemente "q1", o "q1a" o "g1q2".! N!#*Questo è ciò che attualmente diventa il nome della variabile se esporti i dati in SPSS o R, quindi se esegui un'analisi statistica, probabilmente l'hai già reso univoco.

Devo usare EM?

La risposta breve è No (ma anche sì).

EM è completamente retrocompatibile con i sondaggi esistenti. Quindi, se sei felice di utilizzare Condizioni e Valutazioni nello stile utilizzato da LimeSurvey nelle versioni <= 1.91+, puoi continuare a farlo.

Tuttavia, EM sostituisce completamente il modo in cui LimeSurvey gestisce internamente le condizioni. Sebbene tu possa ancora utilizzare l'editor delle condizioni per creare e gestire le condizioni, LimeSurvey 1.92 le convertirà nelle equazioni di pertinenza equivalenti. Come parte dell'aggiornamento, LimeSurvey 1.92 convertirà automaticamente tutte le condizioni esistenti in equazioni di rilevanza.

Questo dovrebbe darti il meglio di entrambi i mondi: puoi continuare a utilizzare LimeSurvey come sei abituato, ma vedrai l'equivalente di Equazione di pertinenza in modo da poter migrare gradualmente a Equazioni di pertinenza direttamente ogni volta che lo ritieni opportuno.

Posso combinare l'uso di Condizioni e Rilevanza?

SÌ. Puoi utilizzare l'editor delle condizioni per alcune domande e l'editor della pertinenza per altre. Le condizioni vengono convertite automaticamente in Rilevanza quando salvi la domanda.

Nota, supponiamo che se stai utilizzando l'editor delle condizioni, desideri che tali condizioni sovrascrivano qualsiasi equazione di rilevanza inserita manualmente. Pertanto, se disponi di Condizioni esistenti e desideri modificare manualmente la Rilevanza, elimina prima le Condizioni per quella domanda. Nello specifico, copia l'equazione di pertinenza generata in un editor di testo, utilizza il menu Condizioni per eliminare tutte le condizioni per quella domanda (che eliminerà anche la pertinenza), quindi modifica la domanda e incolla nuovamente l'equazione di pertinenza generata dall'editor di testo in il campo di pertinenza per quella domanda (e salva la domanda). Se c'è una domanda sufficiente per eliminare le condizioni senza eliminare l'equazione di pertinenza generata, potremmo aggiungere un processo di conversione in blocco.

Come devo scegliere tra Condizioni e Rilevanza?

Ecco un elenco di pro e contro di ogni stile:

Stile Pro Svantaggi
Condizioni 1. Bella GUI per la creazione di condizioni semplici
2. GUI ben documentata e compresa dal team di supporto
1. Supporta solo semplici confronti e non AND/OR condiziona bene
2. Le condizioni a cascata funzionano in modo irregolare
3. Lento: database intensivo, quindi può rallentare lunghi sondaggi
4. Alcuni problemi segnalati con le condizioni di ricaricamento
5. La GUI non si adatta bene quando ci sono dozzine, centinaia o migliaia di domande
6. Potrebbe essere lento convertire i sondaggi cartacei poiché devono utilizzare i nomi SGQA
7. Spesso è necessario un programmatore per codificare in modo personalizzato la logica necessaria per ramificazioni complesse
Rilevanza 1. Supporta logiche molto complesse, incluse oltre 80 funzioni e operatori matematici/stringa
2. Supporto perfetto per la logica a cascata
3. Veloce: nessuna chiamata aggiuntiva al database, quindi supporta oltre 1000 sondaggi di domande
4. Nessun problema con la logica di ricarica poiché non richiede codici SGQA
5. L'evidenziazione della sintassi scala fino a oltre 1000 sondaggi di domande
6. Facile e veloce da usare per i gruppi che vogliono informatizzare i sondaggi cartacei esistenti.
7. Supporta facilmente interviste semi-strutturate e indagini epidemiologiche senza bisogno di programmatori
1. Nessuna GUI per condizioni semplici: usa invece l'evidenziazione della sintassi
2. Nuovo, quindi i team di supporto non hanno ancora acquisito padronanza di EM.

Il fondo è che se sei soddisfatto di come funziona LimeSurvey 1.91+, non c'è motivo di cambiare ciò che fai.

Quali sono gli altri vantaggi dell'utilizzo di EM?

Ecco alcuni degli altri motivi per cui potresti voler utilizzare EM.

  1. Calcoli: puoi creare qualsiasi calcolo ti venga in mente:
    • Hai accesso a tutti i comuni operatori e funzioni matematiche
    • Hai accesso a oltre 70 funzioni matematiche, di data e di elaborazione di stringhe
    • È abbastanza facile per gli sviluppatori aggiungere nuove funzioni se gli utenti ne hanno bisogno
  2. Memorizzazione dei calcoli nel database
    • Ora puoi calcolare calcoli semplici e complessi e/o punteggi di scala E li hai memorizzati nel database senza bisogno di JavaScript.
    • Usa il tipo di domanda Equazione per eseguire questa operazione.
  3. Valutazioni
    • Ora puoi creare valutazioni o ridimensionare i punteggi di qualsiasi tipo di domanda, non solo del sottoinsieme che era supportato
    • Puoi utilizzare Tailoring per mostrare i punteggi delle valutazioni correnti o totali ovunque sia necessario, anche sulla stessa pagina
    • Hai più controllo sui report generati in base a tali punteggi di valutazione
    • Puoi memorizzare i punteggi di valutazione nel database senza bisogno di JavaScript
    • Puoi nascondere i punteggi di valutazione senza bisogno di JavaScript o CSS
  4. Campi sostitutivi
  5. *Invece di utilizzare {INSERTANS:SGQA}, puoi semplicemente utilizzare il codice domanda: questo semplifica la lettura e la convalida.
    • Questo evita anche la necessità comune di modificare le domande per cambiare il codice SGQA per far funzionare tutto .
  6. Tailoring - puoi visualizzare in modo condizionale il testo basato su altri valori
    • Usa il titolo appropriato per un oggetto, come (es. "Ciao [ Mr./Mrs.] Smith")
    • Produce frasi grammaticalmente corrette in base al singolare/plurale: (ad es. "You have 1 child" vs. "You have 2 children")
    • Coniugazione appropriata dei verbi e rifiuta i nomi in base al genere e alla pluralità del soggetto.
  7. Nuovi attributi variabili: puoi accedere a quanto segue per personalizzare:
    • (nessun suffisso) - un alias per qcode.code
    • . code - il codice di risposta selezionato per la domanda se è rilevante (altrimenti vuoto), o il valore del testo se non è una domanda codificata
    • .NAOK - uguale a .code, ma può far parte di calcoli o elenchi anche se irrilevante
    • .value - il valore di valutazione per la domanda se è rilevante (altrimenti vuoto), o il valore di testo se non è una domanda codificata -- disponibile se le valutazioni sono abilitate per il sondaggio, altrimenti sempre zero
    • .valueNAOK - uguale a .value, ma può far parte di calcoli o liste anche se irrilevante
    • .shown - la risposta mostrata all'utente (questo è ciò che fa {INSERTANS:xxx} )
    • .qid - l'ID domanda
    • .gid - l'ID gruppo
    • .sgqa - il valore SGQA per la domanda
    • .jsName - il nome corretto della variabile javascript per la domanda, indipendentemente dal fatto che sia definita in questa pagina o in un'altra
    • .qseq - la sequenza della domanda (a partire da 0)
    • .gseq - la sequenza del gruppo (a partire da 0)
    • . obbligatori - se la domanda è obbligatoria (S/N)
    • .question - il testo della domanda
    • .relevance - l'equazione di rilevanza per la domanda
    • .grelevance - l'equazione di rilevanza per il gruppo
    • .relevanceStatus - se la domanda è attualmente pertinente o meno (booleano (può essere diverso in PHP e JS))
    • .type - il tipo di domanda (il codice di un carattere)!N !#Modifiche dinamiche sulla pagina
    • Tutte le pertinenze, i calcoli e la personalizzazione funzionano in modo dinamico su una pagina, quindi le modifiche ai valori aggiornano istantaneamente la pagina
    • Quindi, le domande appaiono/scompaiono dinamicamente a seconda che sono pertinenti
    • Anche le domande sono adattate dinamicamente in base alle risposte sulla pagina, quindi puoi vedere i totali parziali, le frasi personalizzate e i rapporti personalizzati.
  8. Nuova schermata di immissione dati
    • Oltre a utilizzare l'attuale sistema di inserimento dati, puoi semplicemente utilizzare Survey-All-In-One.
    • Questo supporta la pertinenza e la personalizzazione della pagina, quindi gli addetti all'inserimento dati possono scorrere rapidamente e dovranno solo inserire il risposte pertinenti
    • Questo può essere fondamentale se la persona che inserisce i dati ha bisogno di vedere la personalizzazione, che è anche dinamica.
  9. Elimina la necessità della maggior parte dei JavaScript personalizzati
    • EM supporta facilmente calcoli complicati, punteggio , sartoria e logica condizionale.
    • Alcune cose avranno ancora bisogno di JavaScript (come layout personalizzati e sotto-elementi delle domande nascosti in modo condizionale), ma il tuo JavaScript può utilizzare le funzioni EM in modo che tu possa accedere alle domande tramite il loro Qcode invece di SGQA e accedere a qualsiasi proprietà della domanda sopra elencata.

Quali sono altre utili nuove funzionalità abilitate da EM?

Indipendentemente dal fatto che tu continui a utilizzare l'editor delle condizioni o a comporre manualmente le equazioni di pertinenza, ottieni questi vantaggi aggiuntivi:

  1. Puoi creare criteri di convalida più complessi
    • Tutti gli attributi delle domande avanzate (come max_answers, min_num_value_n, max_num_value) può utilizzare le espressioni. Pertanto, i criteri min/max possono essere facilmente regolati in base alle risposte precedenti, anche se si trovano sulla stessa pagina.
    • EM gestisce anche tutte le convalide basate sulle espressioni regolari, in modo da poter combinare in modo affidabile preg ed equazione- basati sugli attributi delle domande.
  2. Facile riordinamento (o eliminazione) di domande e gruppi
    • Prima della versione 1.92, non era possibile riordinare domande o gruppi se LimeSurvey riteneva che tale riordinamento potesse interrompersi condizioni in cui sono stati utilizzati. Allo stesso modo, non è possibile eliminare le domande se qualsiasi altra domanda dipende da esse.
    • Con l'evidenziazione della sintassi di EM, è facile vedere e convalidare se si tenta di utilizzare le domande prima che vengano dichiarate. Quindi, ora ti consentiamo di riordinare o eliminare domande e gruppi quando vuoi. EM aggiornerà tutta l'evidenziazione della sintassi per mostrarti potenziali errori.
    • La visualizzazione delle domande di riordino è stata migliorata per facilitare tale revisione. Ora mostra l'equazione di pertinenza e l'adattamento della domanda, in modo da poter vedere immediatamente se le variabili diventano rosa (nel senso che vengono utilizzate prima di essere dichiarate).
  3. L'indice di navigazione della domanda/gruppo è sempre disponibile e accurato
    • Prima della versione 1.92, questi indici non erano disponibili in presenza di condizioni complesse
    • Con EM, possiamo garantire che siano accurati.
    • I soggetti possono persino tornare indietro, a una domanda precedente, modificare la risposta , quindi salta in avanti (o invia)
      • Quando salti in avanti, EM convaliderà nuovamente tutte le domande/gruppi intervenuti.
      • Se qualsiasi domanda diventa irrilevante, verrà NULLATA nel database in modo che i tuoi dati siano internamente coerenti
      • Se qualsiasi domanda diventa pertinente o non rispetta le regole obbligatorie o di convalida, EM si fermerà su quella pagina e obbligherà l'utente a rispondere a tali domande prima di passare alla destinazione finale.
#Conversione automatica delle condizioni in pertinenza
    • Quando aggiorni il tuo database, tutte le indagini esistenti che hanno condizioni avranno equazioni di pertinenza generate per esse
    • Ogni volta che importi un'indagine, le equazioni di pertinenza verranno create secondo necessità
    • Ogni volta che aggiungi, elimini o modifichi condizioni, EM genererà l'equazione di rilevanza appropriata.
  1. Evidenziazione della sintassi conveniente
    • Quando EM mostra l'equazione di rilevanza, mostrerà il Qcode, anche se hai inserito un codice SGQA, poiché presumiamo che sarà più facile da leggere.
    • Tutte le variabili sono codificate a colori per mostrare se sono state dichiarate prima o dopo la domanda corrente (o prima o dopo il gruppo corrente). Ciò ti consente di rilevare e correggere rapidamente i casi in cui provi a utilizzare le variabili per la pertinenza (incluso array_filter), la personalizzazione o le equazioni di convalida prima di dichiararle.
    • Inoltre, se passi il mouse sopra la variabile con codice colore , vedrai i metadati più importanti relativi a quella domanda. Ciò include la sequenza di gruppo n., la sequenza di domande n., il Qcode, il testo della domanda e tutte le scelte di risposta disponibili (se si tratta di un tipo di domanda con scelte di risposta enumerate).
      • L'elenco delle scelte di risposta utilizza questa sintassi : 'risposte':{key:val, ... }.
      • key ha la sintassi 'scale~code' dove scale è la scala della risposta (es. per doppia scala), e code è il codice di risposta.
      • val ha la sintassi 'value~shown' dove value è il valore della valutazione (se si utilizzano le valutazioni, altrimenti code)(es. Qcode.value), e shown è il valore visualizzato dal soggetto (es. Qcode.shown)
      • Questo significa che molti sondaggi possono utilizzare i calcoli senza bisogno della modalità di valutazione. Se hai enumerato opzioni di risposta univoche, non decimali e non negative, puoi semplicemente eseguire calcoli sui valori Qcode.code.
  2. Facile revisione dell'intera logica e contenuto del sondaggio
    • C'è una nuova funzione Mostra logica sondaggio che ti consente di vedere tutto ciò che riguarda il sondaggio (o gruppo o domanda) su una singola pagina.
    • Mostra i dettagli a livello di gruppo, domanda, sotto-domanda e risposta per l'ambito selezionato (sondaggio vs. gruppo vs. domanda)
    • Mostra anche la pertinenza, la pertinenza a livello di sottodomanda (per array_filter e array_filter_exclude) e l'equazione di validazione generata (per preg e qualsiasi regola di validazione come min/max sum/number of valori) e tutti gli attributi delle domande non vuote.
    • Tutto è evidenziato in sintassi in modo da poter vedere potenziali errori di sintassi (come parentesi non bilanciate o uso di variabili prima che fossero dichiarate)
    • La sintassi- l'evidenziazione supporta la navigazione e la modifica rapide del sondaggio.
      • Se fai clic sul nome di una variabile, si apre una finestra del browser (o scheda) che mostra quella domanda e ti consente di modificarla.
      • Se fai clic sul nome di un gruppo, si apre una finestra del browser (o scheda) che mostra la vista di riordino del gruppo in modo da poter spostare facilmente le domande.
      • Tutti gli attributi della domanda sono anche evidenziati nella sintassi. Ciò ti consente di impostare e visualizzare le espressioni all'interno delle opzioni di domanda avanzate (come basare il numero massimo/minimo/la somma dei valori su un'espressione)
    • L'autore di EM ha utilizzato una visualizzazione simile (un po' più chiara) per consentire ai suoi collaboratori epidemiologi e istituzionali Review Board convalida e autorizza sondaggi con migliaia di domande in interviste strutturate altamente ramificate e personalizzate

Per iniziare

Il modo migliore per iniziare con EM è:

  • Installare l'ultima versione stabile da http://www.limesurvey.org/en/download
  • Importare ed esplorare i sondaggi di esempio .
  • Esplora casi d'uso e HowTo e esempi passo-passo.
  • Esplora la documentazione EM (questa pagina)! N!*Esamina la suite di test EM integrata
    • Da qualsiasi sondaggio, in Strumenti, seleziona l'opzione EM
    • Funzioni disponibili elenca le oltre 70 funzioni e la sintassi
    • Test unitari di test isolati Expressions
      • mostra esempi di utilizzo di tutte le funzioni e gli operatori EM e i risultati PHP e JavaScript
      • nota che ci sono poche funzioni che generano risultati diversi nelle versioni PHP e JavaScript, quindi questa pagina ti consente pianifica la tua logica EM di conseguenza.

Quali funzionalità vengono estese/sostituite da Expression Manager? (LimeSurvey <= 1.91+)

Condizioni => Rilevanza

Le condizioni controllano quali domande sono visibili. La sintassi generale era SGQA operator Value, come 111X2X3 == "Y". Le condizioni potevano essere combinate in AND o OR insieme, ma mescolare AND e OR era difficile. Le condizioni stesse erano memorizzate in una tabella separata e gran parte del codice di LimeSurvey era dedicato alla gestione delle condizioni. A causa dell'ampio accesso al database, l'elaborazione di un numero elevato di condizioni potrebbe causare notevoli problemi di prestazioni. Inoltre, una volta assegnate le condizioni alle domande o ai gruppi, spesso non era consentito riordinarli o eliminarli.

Valutazioni => Equazioni e Micro-Adattamento

Le valutazioni consentono agli utenti di creare punteggi di scala da una raccolta di domande. Tuttavia, non potevano cambiare dinamicamente nella pagina corrente e i loro valori non venivano archiviati nel database.

Sostituzioni => Micro-Sartoria

Gli utenti possono personalizzare alcuni messaggi e domande in base alle risposte precedenti. Ad esempio, una domanda potrebbe essere {TOKEN:FIRSTNAME}, hai detto che {INSERTANS:111X3X4} era il tuo sport preferito. Tuttavia, non era possibile adattare le condizioni (come dire "Mr." o "Mrs." a seconda del genere della persona), o coniugare verbi o rifiutare sostantivi senza JavaScript di fantasia. Gli autori potevano implementare sondaggi che sembravano adattare le domande, ma richiedevano domande separate per ogni permutazione e condizioni complesse per decidere quali domande visualizzare.

Convalida

La domanda può essere convalidata con espressioni regolari o valori minimo/massimo oppure lasciare che una risposta SGQA serva come valore minimo o massimo. Tuttavia, le convalide non possono essere basate su calcoli di altre variabili senza JavaScript di fantasia.

Equazioni

Le equazioni non erano supportate senza JavaScript di fantasia.

Tipo di domanda equazione

Le equazioni non possono essere salvate nel database (ad es. il punteggio finale per una valutazione) senza JavaScript sofisticato.

In che modo Expression Manager sostituirà/estenderà tale funzionalità?

Expression Manager è un nuovo modulo principale all'interno di LimeSurvey che rende molto più semplice supportare il tipo di funzionalità complesse che prima richiedevano JavaScript personalizzato. Sta anche sostituendo il modo in cui LimeSurvey attualmente gestisce Condizioni e Valutazioni.

Nuova terminologia quando si fa riferimento a Expression Manager (EM)

EM "pensa" alla sua funzionalità nei seguenti termini:

  • Branching basato sulla pertinenza - se una domanda è rilevante, allora ponila, altrimenti non farlo (ad es. rendila invisibile e contrassegnala come NULL nel database). C'è un nuovo campo Rilevanza per tutti i tipi di domanda e anche per ogni gruppo (quindi puoi applicare una serie di condizioni a un intero gruppo senza dover copiare la stessa condizione a ogni domanda e/o combinare condizioni di gruppo e a livello di domanda logica).
  • Tailoring - Una volta che sai quali domande dovrebbero essere poste, il tailoring (a volte chiamato piping) specifica come la domanda dovrebbe essere posta. Ciò ti consente di supportare non solo la semplice sostituzione (come {TOKEN:FIRSTNAME}), ma anche la coniugazione dei verbi e la declinazione dei sostantivi in base al genere o al numero dei tuoi soggetti. Ti consente anche di modificare il messaggio che invii a un soggetto in base al fatto che abbia risposto (o come abbia risposto) ad altre domande.
  • Equazioni - EM aggiunge un nuovo tipo di domanda chiamato Equazione che memorizza il risultato di un'Espressione. I risultati di queste equazioni vengono calcolati e scritti nel database, anche se li nascondi nella pagina. Pertanto, sono utili per calcoli di punteggio nascosti, navigazione basata su equazioni complesse, valutazioni e report che dovrebbero essere generati e facilmente disponibili all'interno del database.

Pertinenza e pertinenza a cascata

Ogni tipo di domanda ora ha un'opzione Rilevanza che controlla se la domanda viene visualizzata. EM elabora ciascuna delle equazioni di rilevanza nell'ordine in cui dovrebbe apparire nel sondaggio. Se l'espressione è vera (o mancante - per supportare i sondaggi precedenti), verrà visualizzata la domanda. Se non è rilevante, la domanda verrà nascosta e il valore verrà annullato nel database. Se non ci sono domande pertinenti in un gruppo, l'intero gruppo verrà saltato.

Inoltre, se una qualsiasi delle variabili all'interno di un'espressione è irrilevante, l'espressione restituisce sempre false. Ciò abilita la pertinenza a cascata in modo da non dover scrivere equazioni di pertinenza molto lunghe per ogni domanda.

Supponiamo che tu abbia 5 domande Q1-Q5 e desideri solo mostrare Q2 se è stata data risposta a Q1 e Q3 se è stata data risposta a Q2, ecc. Le equazioni di rilevanza potrebbero essere:

Codice domanda Rilevanza Domanda
Q1 1 Come ti chiami?
Q2 Q1 {Q1}, quanti anni hai?
Q3 Q2 Allora, hai {Q2} anni. Sei sposato?
Q4 Q3 == "S" {Q1}, da quanto tempo sei sposato?
Q5 Q4 Quanti figli hai, {Q1}?

I calcoli di pertinenza funzionano anche in JavaScript, quindi puoi inserire tutte le domande di cui sopra su una pagina e funzionerebbe comunque come previsto. In effetti, EM sostituisce totalmente il modo in cui EM elabora i formati di indagine Survey vs. Group vs. Question-at-a-time. Ora utilizzano tutti esattamente lo stesso motore di navigazione, quindi funzionano in modo identico indipendentemente dallo stile del sondaggio.

Finché ti trovi sulla stessa pagina, tutti i dati che hai inserito saranno ancora lì, solo nascosti. Quindi, se inserisci alcune informazioni, quindi scegli un'opzione che le rende irrilevanti, quindi rendile nuovamente rilevanti, le tue risposte saranno ancora disponibili. Tuttavia, non appena si passa a una pagina diversa, tutte le risposte irrilevanti andranno perse per l'integrità del set di dati.

Rilevanza a livello di gruppo

Expression Manager supporta anche la pertinenza a livello di gruppo. Ciò semplifica l'implementazione del looping. Supponiamo che tu voglia raccogliere informazioni su un massimo di 10 entità (come prodotti o persone in una famiglia), dove prima determini quante entità necessitano di follow-up (ad esempio chiedendo quante persone vivono in una famiglia o chiedendo alle persone di controllare quali prodotti preferiscono da un lungo elenco). Dopo aver saputo quante entità necessitano di follow-up, puoi utilizzare la pertinenza a livello di gruppo come {count >= 1}, {count >=2}, ... {count >= 10} per ciascuno dei 10 gruppi di follow- domande. All'interno di ogni gruppo, puoi avere una logica condizionale a livello di domanda (ad es. domande di follow-up specifiche per sesso o età per ogni materia). La domanda e le equazioni di rilevanza a livello di gruppo vengono combinate in AND insieme per determinare quale deve essere mostrato.

Sartoria / Tubazioni

Tutto ciò che si trova all'interno delle parentesi graffe viene ora trattato come un'espressione (con un'eccezione descritta di seguito). Le espressioni hanno accesso a tutti i LimeReplacementFields, a tutte le variabili (tramite diversi alias), a tutti i tipici operatori di equazioni (matematici, logici e di confronto) e a dozzine di funzioni (che funzionano anche dinamicamente sul lato client).

Usando queste equazioni, puoi fare cose come:

  1. Mostrare in modo condizionale messaggi personalizzati agli intervistati in base alle risposte precedenti
  2. Creare Valutazioni e mostrare i risultati della Valutazione (o diramare in modo condizionale o mostrare messaggi) in base a tali risultati, tutti senza utilizzare il modulo Valutazioni stesso
  3. Coniuga i verbi e rifiuta i nomi all'interno di domande, risposte e rapporti.
  4. Mostra i riepiloghi delle risposte prima della pagina "Mostra le tue risposte" alla fine del sondaggio

Equazioni

C'è un nuovo tipo di domanda chiamato Equazione. È come una domanda Boilerplate, tranne per il fatto che memorizza il valore di ciò che viene visualizzato nel database. Pertanto, se il testo della domanda sull'equazione contiene un calcolo di valutazione, tale valore verrà archiviato nel database in una variabile che può essere visualizzata all'interno di statistiche pubbliche o private.

Questo risolve una richiesta comune per l'archiviazione dei punteggi di valutazione all'interno del database

Sintassi

Tutto ciò che è contenuto all'interno delle parentesi graffe è ora considerato un'espressione (con un'eccezione: non devono essere presenti spazi bianchi iniziali o finali, necessari per garantire che Expression Manager non tenti di elaborare JavaScript incorporato).

Nota, è OK che le espressioni si estendano su più righe, purché non ci siano spazi bianchi dopo la parentesi graffa di apertura o prima della parentesi graffa di chiusura. Ciò è particolarmente utile per istruzioni if() annidate come questa:

{if(is_empty(PFTotals),
 '',
 if(PFTotals >= -5 && PFTotals <= -4,
 'Very Soft',
 if(PFTotals >= -3 && PFTotals <= -2,
 'Morbido',
 if(PFTotals == -1,
 'Un po' debole',
 if(PFTotals == 0,
 'Moderato',! N! if(PFTotals == 1,
 'Un po' difficile',
 if(PFTotals >= 2 && PFTotals <= 3,
 'Difficile',
 if(PFTotals >= 4 && PFTotals <= 5,
 'Molto difficile',
 ''
 )
 )
 )
 )
 )
 )
 )
)}
Expression Manager supporta la seguente sintassi:
  • Tutti gli operatori matematici standard (ad es. +,-,*,/,!)
  • Tutti gli operatori di confronto standard (ad es. <,<=,==,!=,>,>=, più questi equivalenti: lt,le,eq,ne,gt,ge)
  • Parentesi (così puoi raggruppare le sottoespressioni)
  • Operatori condizionali (es. &&,| | e questi equivalenti: and,or)
  • Stringhe con virgolette singole e doppie (ognuna delle quali può incorporare stringhe con l'altro tipo di virgolette)
  • Operatore virgola (quindi può avere un elenco di espressioni e restituire solo il risultato finale)
  • Operatore di assegnazione (=)!N !*Variabili predefinite (per fare riferimento a domande, attributi delle domande e risposte) - ad es. tutti i codici SGQA
  • Funzioni predefinite (ce ne sono già più di 70 ed è facile aggiungerne altre)

Operatori

La sintassi EM segue la normale precedenza degli operatori:

Livello Operatore(i) Descrizione
1 () parentesi per raggruppare o chiamare funzioni
2 ! - + operatori unari: non, negazione, unario-più
3 * / volte, dividere
4 + - più , minus
5 < <= > >= lt le gt ge confronti relativi
6 == != eq ne confronti di uguaglianza
7 e AND logico
8 o OR logico
9 = assegnazione operatore
10 , operatore virgola

Avviso con operatore più (+)

Per coerenza tra JavaScript e PHP, l'operatore più (+) esegue l'addizione se entrambi gli operandi sono numerici, ma esegue la concatenazione se entrambe le parti sono stringhe non numeriche. Tuttavia, ti consigliamo di utilizzare la funzione join() per la concatenazione e la funzione sum() per l'addizione, in quanto ciò rende più chiaro il tuo intento ed evita risultati imprevisti se ti aspettavi delle stringhe ma hai invece dei numeri (o viceversa versa).

Avviso con mancata corrispondenza tra numero e stringa e confronto alfabetico

Quando si desidera confrontare il valore con confronti relativi o di uguaglianza, prestare attenzione alla mancata corrispondenza del tipo. Il valore inserito dall'utente o il codice di risposta selezionato può essere utilizzato come numero se è chiaramente un numero. Se racchiudi uno dei valori tra " , verrà forzato il confronto come testo (confronto alfabetico). Se desideri confrontare numericamente, non racchiudere mai il numero tra virgolette, " .

Ad esempio Q0.NAOK > "50" è vero se Q0.NAOK è una domanda numerica con 9 come valore. Questo perché l'operatore > assumerà che sia un confronto alfabetico e non numerico.

Per essere sicuri di confrontare il valore intero, puoi usare intval(Q0.NAOK) > 50 , ricorda solo che se Q0.NAOK non è un numero (vuoto o una stringa), allora intval(Q0. NAOK) === 0. Per confrontare il valore stringa ("A" < "B") utilizzare strcmp direttamente: strcmp(Q0.NAOK,"B") o strcmp(Q0.NAOK,"A5") .

Attenzione sull'uso dell'operatore di assegnazione (=)

Nota, dovresti evitare di utilizzare gli operatori di assegnazione a meno che non sia assolutamente necessario, poiché potrebbero causare effetti collaterali imprevisti. Ad esempio, se modifichi il valore di una risposta precedente, la pertinenza a cascata e la logica di convalida tra quella domanda e la domanda corrente non vengono ricalcolate, quindi potresti ritrovarti con dati internamente incoerenti (ad es. stato annullato NULL o domande che sono state saltate ma avrebbero dovuto avere una risposta). In generale, se si desidera assegnare un valore a una variabile, è necessario creare un tipo di domanda Equazione e utilizzare un'espressione per impostarne il valore. Tuttavia, ci sono alcune rare volte in cui le persone hanno davvero bisogno di questo operatore, quindi l'abbiamo reso disponibile.

Per aiutarti a metterti in guardia su questo operatore, è mostrato in carattere rosso all'interno delle equazioni di sintassi (in modo da non confonderlo con "==")

Utilizzo dell'operatore di assegnazione

I motivi principali per cui potresti voler utilizzare l'assegnazione sono:

  • Devi impostare il valore predefinito per una domanda che non accetta i valori predefiniti tramite equazione (come list radio, dove l'interfaccia utente ti consente di scegliere una delle opzioni di risposta, ma non ti consente di inserire un'equazione). Tuttavia, fai attenzione, poiché LimeSurvey non sarà in grado di convalidare che la tua equazione generi una delle risposte consentite per quella domanda.
  • Devi forzare la modifica della risposta a una domanda precedente basata su una risposta successiva
  • Hai bisogno di una quota complessa: usa una singola scelta nascosta per la quota e impostala usando l'assegnazione! N! * ecc ...

È possibile utilizzare tutti i sistemi di gestione delle espressioni per questo scopo.

  L'assegnazione viene eseguita solo in PHP. Questo non aggiorna alcun valore sulla stessa pagina, ma solo quando l'utente naviga con next, previous, save ….


  Se non si utilizza un tipo di equazione domanda per questo scopo: l'assegnazione viene eseguita solo dopo che la logica della pagina corrente è terminata. Il metodo consigliato è utilizzare sempre una domanda sull'equazione.


Alcuni esempi:

  • Imposta la risposta a una breve domanda di testo in minuscolo: {QCODE=strtolower(QCODE.NAOK)}
  • Imposta una risposta predefinita a un tipo di domanda array all'inizio di un sondaggio: {Q1_SQ1=((is_empty(Q1_SQ1.NAOK),"A99",Q1_SQ1.NAOK)}
  • Imposta una risposta predefinita a un tipo di domanda di tipo array all'inizio di un sondaggio: {Q1_SQY1_SQX1 = ((is_empty(Q1_SQY1_SQX1.NAOK),"Inserted answer", Q1_SQY1_SQX1.NAOK)}
  • Imposta una risposta con condizione: {QCODE=if(YesNo="Y","A1","")}

Sicurezza XSS

Con XSS abilitato, alcuni sistemi di gestione delle espressioni non possono essere utilizzati:

  • inizia un tag HTML nell'espressione ma termina con un'altra espressione
  • utilizza un'espressione complessa nell'URL.

Esempio e soluzione alternativa

  • {if( 1 ,"","")}information{if( 1 ,"","")} funzionanti con la sicurezza XSS, qui puoi utilizzare
  • <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"
  • <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>

Accesso alle variabili

Expression Manager fornisce l'accesso in sola lettura a qualsiasi variabile di cui potremmo aver bisogno. Per retrocompatibilità, fornisce l'accesso a quanto segue:

  • TOKEN:xxx - il valore di un TOKEN (ad es. TOKEN:FIRSTNAME, TOKEN:ATTRIBUTE_5) (solo per sondaggi NON anonimi).
  • INSERTANS:SGQA - il valore visualizzato di una risposta (es. "Sì"). Per Expression Manager è lo stesso che usando {QCODE.shown}.
  • Tutti {XXX} valori usati dai modelli.
  • Nel testo della domanda, puoi usare {QID} sostituito dall'id della domanda e {SGQ} sostituiti dall'SGQA della domanda

Inoltre, Expression Manager consente di fare riferimento alle variabili tramite il codice domanda (la colonna "titolo" nella tabella delle domande all'interno del database). Questa è anche l'etichetta della variabile utilizzata quando si esportano i dati in SPSS, R o SAS. Ad esempio, se hai domande su nome, età e sesso, puoi chiamare queste variabili nome, età e sesso invece di 12345X13X22, 12345X13X23' ', e 12345X13X24. Ciò semplifica la lettura delle equazioni e la convalida della logica da parte di tutti, inoltre consente di mescolare le domande senza dover tenere traccia dei numeri di gruppo o delle domande.

Importante: È sicuro fare riferimento solo a variabili che si verificano nelle pagine o domande precedenti.

Inoltre, Expression Manager ti consente di accedere a molte proprietà della Domanda:


Sintassi Significato Esempio Esempio Risultato
Qcode un alias per Qcode.code {implode(',',name,gender )} 'Tom','M'
Qcode.code il codice di risposta selezionato per la domanda se è rilevante (altrimenti vuoto), o il valore del testo se non è un domanda in codice {implode(',',name.code,gender.code)} 'Tom','M'
Qcode.NAOK uguale a Qcode - vedi discussione su NAOK {gender.NAOK} 'M'
Qcode.value il valore di valutazione per la domanda se è rilevante (altrimenti vuoto), o il valore del testo se non lo è una domanda in codice {gender.value} '1'
Qcode.valueNAOK uguale a Qcode.value - vedi discussione su NAOK {gender.valueNAOK} '1 '
Qcode.shown il valore visualizzato per la domanda {implode(',',name.shown,gender.shown)} - Qcode.question il testo della domanda {gender.question} 'Qual è il tuo genere?'
Qcode.mandatory se la domanda è obbligatorio (S/N) {gender.mandatory} 'N'
Qcode.qid il numero della domanda interna (non il numero progressivo) {gender.qid} 337
Qcode.type il tipo di domanda {gender.type} 'G'
Qcode.jsName il nome javascript corretto per la domanda, indipendentemente dal fatto che sia dichiarato all'interno o all'esterno di questa pagina {gender.jsName} 'java1827X3X337'
Qcode.gid il numero di gruppo interno (non il numero sequenziale) {gender.gid} 3
Qcode.qseq il numero progressivo della domanda, partendo da 0 {gender.qseq} 5
Qcode.gseq il numero sequenziale del gruppo, a partire da 0 {gender.gseq} 1
Qcode.relevanceStatus se la domanda è attualmente pertinente (0 o 1 ) {gender.relevanceStatus} 1
Qcode.relevance l'equazione di rilevanza a livello di domanda {gender.relevance} '!is_empty(name)'
Qcode.grelevance l'equazione di rilevanza a livello di gruppo {gender.grelevance} 'num_children >= 5'
Qcode.sgqa il valore SGQA per questa domanda {gender.sgqa} '1827X3X337'

Problema con l'editor HTML

Template:Avviso

Se utilizzi l'editor HTML, alcuni caratteri vengono sostituiti da entità HTML.

  • & da &
  • < da <
  • > da >

Se usi un editor HTML devi usare :

  • e for &
  • lt for <
  • le for <=
  • gt for >
  • ge per >=

Denominazione variabile Qcode

Ecco i dettagli su come costruire un Qcode (e accedere ad alcune proprietà) per tipo di domanda. In generale, i Qcode sono costruiti come:

DomandaCodice . '_'. ID domanda secondaria . '_'. ID scala

Per comment e other, il codice della domanda è QuestionCode_comment e QuestionCode_other

Tipo Descrizione Codice SubQs Opzioni di risposta Scale Codice di risposta Risposta mostrata Pertinenza
5 5 Pulsanti radio Point Choice Q1 1-5 {Q1} {Q1.mostrato} {Q1==3}
B Array (10 punti di scelta) Pulsanti radio Q2 |1-10 {Q2_L2} {Q2_L2.mostrato} {Q2_L2==7}
A Array (scelta a 5 punti) Pulsanti radio Q3 |1-5 {Q3_1} {Q3_1.mostrato} {Q3_1>=3}
1 Array (etichette flessibili) Doppia scala Q4 sq1-sq5 0 :a1-a3 1:b1-b3 {Q4_sq1_0} {Q4_sq1_1.mostrato} {Q4_sq1_1=='b2'}
H Array (flessibile) - Formato colonna Q5 1-5 s,m,t {Q5_1} {Q5_1.mostrato} {Q5_1=='s'}
F Array (flessibile) - Formato riga Q6 |1-5 {Q6_F3} {Q6_F3.mostrato} {Q6_F3==4}
E Array (Aumenta/Uguale/Diminuisci) Pulsanti Radio Q7 1- 7 I,S,D {Q7_4} {Q7_4.mostrato} {Q7_4=='D'}
: Array (Multi Flexi) da 1 a 10 Q8 ls1,todo ,ls2 min,max,media {Q8_ls1_max} {Q8_ls2_avg.shown} {Q8_ls2_min==7}
; Array (Multi Flexi) Testo Q9 hp,st,sw 1°,2°,3° {Q9_hp_3rd} {Q9_hp_3rd.shown} {Q9_hp_3rd=='Peter'}
C Array (Sì/Incerto/No) Pulsanti radio Q10 1-5 Y,N,U {Q10_1} {Q10_1.mostrato} {Q10_3=='Y'}
X Domanda standard Q11 {Q11.mostrato}
G Data Q12 {Q12} {Q12.mostrato}
* Equazione Q13 {Q13} {Q13.mostrato} {Q13>5}
~124~ File Upload (registra il numero di file caricati) Q14 {Q14} {Q14>0}
G Elenco a discesa Sesso Q15 M,F {Q15} {Q15.mostrato} {Q15=='M'}
U Testo libero enorme Q16 {Q16} {Q16.mostrato} {strlen(Q16)>100}
I Domanda Lingua Q17 {Q17} {Q17.mostrato} {Q17=='it'}
! Lista - Dropdown Q18 1-5 {Q18} {Q18.mostrato} {Q18==3}
L Elenco a discesa/Elenco pulsanti radio Q19 AZ {Q19} {Q19.mostrato} {Q19=='X'}
O Elenco con menu a tendina commenti/Elenco pulsanti radio + Area di testo Q20 AF {Q20},{Q20comment} {Q20.shown} {Q20=='B'}
T Testo libero lungo Q21 {Q21} {Q21.mostrato} {strstr(Q21,'hello')>0}
M Casella di scelta multipla Q22 | {Q22_E}, {Q22_other} {Q22_E.shown}, {Q22_other.shown} {Q22_E=='Y'}
P Scelta multipla con commenti Casella di controllo + Testo Q23 AF {Q23_D}, {Q23_Dcomment} {Q23_D.mostrato} {!is_empty(Q23)}
K Domanda numerica multipla Q24 se stesso, mamma, papà {Q24_self} {Q24_self.mostrato} {Q24_self>30}
Q Testo breve multiplo Q25 AF {Q25_B} {Q25_B.mostrato} {substr(Q25_B,1,1)=='Q'}
N Tipo di domanda numerica Q26 {Q26} {Q26.mostrato} {Q26 > 30}
R Stile classifica Q27 1-4 {Q27_1} {Q27_1.mostrato} {Q27_1==3}
S Testo libero breve Q28 {Q28} {Q28.mostrato} {Q28=='mio'}
Y Pulsanti radio Sì/No Q29 {Q29} {Q29.mostrato} {Q29=='S'}

Le variabili riservate 'this', 'self' e 'that'

Molto spesso, si desidera valutare tutte le parti di una domanda, ad esempio contando quante sottodomande hanno ricevuto risposta o sommando i punteggi. Altre volte, vuoi elaborare solo determinate righe o colonne di una domanda (come ottenere le somme di righe o colonne e memorizzarle nel database). Queste variabili riservate rendono tale processo relativamente indolore.

La variabile "questa" viene utilizzata esclusivamente all'interno delle opzioni di domanda avanzata "Equazione di convalida dell'intera domanda" e "Equazione di convalida della sottodomanda". Si espande ai nomi delle variabili di ciascuna delle celle all'interno di tali domande. Quindi, se vuoi assicurarti che ogni voce sia maggiore di tre, devi impostare "Equazione di convalida della sottodomanda" su (this > 3).

Le variabili "sé" e "quella" sono più potenti e fungono da macro che vengono espanse prima dell'elaborazione delle equazioni. Le scelte di sintassi sono:

  • self
  • self.suffix
  • self.sub-selector
  • self.sub-selector. suffisso

suffisso è uno qualsiasi dei normali suffissi qcode (es. NAOK, valore, mostrato)

sub-selector è uno di:

  • comments - solo sottodomande che sono commenti (ad esempio, da scelta multipla con commento ed elenco con commento)
  • nocomments - solo sottodomande che non sono commenti
*sq_X - dove X è un identificatore di riga o colonna. Vengono selezionate solo le sottodomande che corrispondono al modello X. Si noti che la ricerca viene eseguita sull'identificatore di codice completo, quindi sq_X corrisponde e include le sottodomande nX, X, Xn (ad esempio, se si utilizza sq_1, le sottodomande a1, 1a, 1, 11 o 001 sono state incluse). Prestare attenzione al tipo di domanda a doppia scala in cui il codice delle domande secondarie è QCODE_SQCODE_1 e QCODE_SQCODE_1 e al tipo di domanda di classificazione in cui il codice delle domande secondarie è QCODE_1,QCODE_2 ....
  • nosq_X - dove X è un identificatore di riga o colonna. Vengono selezionate solo le domande secondarie che non corrispondono al modello X. Si noti che la ricerca viene eseguita sull'identificatore di codice completo, quindi nosq_X corrisponde e non include le sottodomande nX, X, Xn

Esempi:

  • È stata data risposta a qualche parte di una domanda? {count(self.NAOK)>0}
  • Qual è il punteggio di valutazione per questa domanda? {somma(self.valore)}

Puoi anche usarli per ottenere i totali di righe e colonne. Supponi di avere un array di numeri con righe AE e colonne 1-5.

  • Qual è il totale complessivo? {sum(self.NAOK)}
  • Qual è il totale della riga B? {sum(self.sq_B.NAOK)}
  • Qual è il totale della colonna 3? {sum(self.sq_3.NAOK)}

La variabile "quella" è come la variabile "self", ma ti consente di fare riferimento ad altre domande. La sua sintassi è:

  • that.qname
  • that.qname.suffix
  • that.qname.sub-selector' '
  • quello.qname.sottoselettore.suffisso

qname è il nome della domanda senza alcuna estensione della sottodomanda. Quindi, diciamo che crei una domanda 'q1', che è il suo qname

Esempi:

  • È stata data risposta a qualche parte della domanda q1? {count(that.q1.NAOK)>0}
  • Qual è il punteggio di valutazione per q2? {sum(that.q2.NAOK)}
  • Qual è il totale complessivo di q3? {sum(that.q3.NAOK)}
  • Qual è il totale della riga C in q4? {sum(that.q4.sq_C.NAOK)}
  • Qual è il totale della colonna 2 in q4? {sum(that.q4.sq_2.NAOK)}

Le variabili "self" e "that" possono essere utilizzate in qualsiasi rilevanza, convalida o personalizzazione.

L'unica avvertenza è che quando usi la funzione Mostra file logico, ti mostrerà il valore espanso di 'self' e 'that'. In questo modo è possibile visualizzare l'equazione effettiva che verrà generata in modo che l'utente (e Expression Manager) possa convalidare l'esistenza delle variabili. Questo può sembrare confuso poiché potresti vedere equazioni piuttosto lunghe. Tuttavia, se modifichi la domanda, vedrai l'equazione originale usando 'self' e/o 'that'

Si noti inoltre che non si dovrebbero utilizzare queste variabili se (a) si desidera nominare esplicitamente ciascuna variabile utilizzata in un'equazione, o (b) utilizzare variabili che non hanno sottodomande (ad esempio domande a risposta singola). In questi casi, prefissare una variabile con "quello" è eccessivo e si corre il rischio di ottenere risultati inaspettati.

Utilizzo di NAOK

NAOK --> "Non applicabile" (NA) va bene (OK)

L'uso di NAOK significa che tutte o alcune delle variabili sono irrilevanti (ad esempio "Non applicabile" (NA) va bene (OK)).

Quando metti una variabile dalla domanda in qualsiasi equazione: se questa domanda (o sottodomanda) è nascosta dalla condizione: disabilita tutte le equazioni.

Ad esempio: count(Q1_SQ1,Q1_SQ2,Q1_SQ3,Q1_SQ4) fornisce sempre una stringa vuota se una sottodomanda di Q1 è filtrata. Per contare il numero di sottodomanda controllate in tale domanda può essere count(Q1_SQ1.NAOK,Q1_SQ2.NAOK ,Q1_SQ3.NAOK,Q1_SQ4.NAOK). Se la sottodomanda è nascosta :Expression manager restituisce una stringa vuota.

Senza NAOK: se una domanda o una sottodomanda è nascosta: Expression Manager restituisce sempre una stringa vuota, lo stesso per restituire false.

I .mostrati usano sempre il sistema NAOK (stringa vuota se nascosta) ma se hai bisogno del codice della risposta: è sempre una buona idea aggiungere .NAOK dopo il codice della domanda. Tranne se ne hai bisogno e sai cosa fai.

Un altro esempio e informazioni sono forniti in Sostituzione delle condizioni a cascata

Accesso alle funzioni

Expression Manager fornisce l'accesso a funzioni matematiche, stringhe e definite dall'utente, come illustrato di seguito. Ha equivalenti PHP e JavaScript per queste funzioni in modo che funzionino in modo identico sul lato server (PHP) e sul lato client (JavaScript). È facile aggiungere nuove funzioni.

Funzioni implementate

Attualmente sono disponibili le seguenti funzioni:

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 (Updated in 3.0.2 ) 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)
log The logarithm of number to base, if given, or the natural logarithm. number log(number,base=e)
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)

Funzioni pianificate o prese in considerazione

Altre funzioni pianificate (o prese in considerazione) ma non ancora implementate includono quanto segue. Alcuni di questi sono compatibili con le versioni precedenti con un altro strumento di indagine.

Sintassi Significato Commenti
e() restituisce il valore di e
formatDate(X, PAT) restituisce il valore stringa della data X formattato secondo il modello di formato dati Java PAT
formatNumber(X,PAT) restituisce il valore stringa del numero X formattato secondo il numero Java modello di formato PAT
getAnsOption(X) Plugin principale ExpressionAnswerOptions
getAnsOption(X,Y) Core plugin ExpressionAnswerOptions
getRelevance(X) restituisce l'equazione di rilevanza per la domanda X
getStartTime() restituisce la data corrispondente all'ora di sistema in cui è iniziata l'intervista
getType(X) restituisce il nome stringa del tipo di dato - es. *NA* se isNA()
gotoFirst() salta alla prima serie di domande rilevanti - questo viola il normale flusso del sistema
gotoNext() salta alla serie successiva di domande rilevanti - questo viola il normale flusso del sistema
gotoPrevious() salta alla serie precedente di domande rilevanti - questo viola il normale flusso del sistema - isAsked(X) restituisce true se la risposta non è né *NA*, *INVALID*, né *UNASKED*
isInvalid(X) restituisce true se la risposta è di tipo *INVALID*
isNA(X) restituisce true se la risposta è di tipo *NA*
isNotUnderstood(X ) restituisce true se la risposta è di tipo *HUH*
isRefused(X) restituisce true se la risposta è di tipo *REFUSED*
jumpTo(X) salta al gruppo contenente la domanda nominata -- questo viola il normale flusso del sistema
jumpToFirstUnasked() salta alla prima domanda non posta ignorando così le precedenti domande con risposta questo viola il normale flusso del sistema
lastIndexOf(X,Y) restituisce l'ultimo indice (base 0) della stringa Y nella stringa X. Restituisce -1 se Y non è contenuta all'interno di X
list(X,.. .) una stringa contenente un elenco separato da virgole dei valori positivi con "e" che separa gli ultimi due
mean(X,...) restituisce la media di un elenco of values
numAnsOptions(X) restituisce il numero di opzioni di risposta che la domanda X ha
olist(X,...) una stringa contenente un elenco separato da virgole dei valori positivi, con "o" che separa gli ultimi due
parseDate(X,PAT) restituisce il valore della data della stringa X analizzata con data Java format pattern PAT
parseNumber(X,PAT) restituisce il valore numerico della stringa X analizzata con Java number format pattern PAT
showAllResponsesExcept( questionList ,attributeList,attributeTitleList) questionList = elenco delimitato da barre verticali di identificatori di domande; attributeList = elenco di attributi delimitato da barre verticali (come domanda#, titolo, testo, tipo - così puoi decidere cosa mostrare); attributeTitleList = elenco delimitato da barra verticale delle intestazioni della tabella, in modo da poter internazionalizzare il rapporto.
showTheseResponses( questionList,attributeList,attributeTitleList) questionList = elenco delimitato da barra verticale degli identificatori di domanda; attributeList = elenco di attributi delimitato da barre verticali (come domanda#, titolo, testo, tipo - così puoi decidere cosa mostrare); attributeTitleList = elenco di intestazioni di tabella delimitato da barra verticale, quindi può internazionalizzare il report.

Expression Manager sa quali variabili sono locali

Per creare correttamente il JavaScript per la pagina, Expression Manager deve sapere quali variabili sono impostate sulla pagina e qual è il loro ID JavaScript (ad esempio per document.getElementById(x)). Deve anche sapere quali variabili sono impostate su altre pagine (in modo da poter garantire che i file necessari<input type='hidden' value='x'> i campi sono presenti e popolati).

Condizioni a cascata

Se una qualsiasi delle variabili è irrilevante, l'intera equazione sarà irrilevante (falso). Ad esempio, nella tabella seguente, N/A significa che una delle variabili non era rilevante

Operatore Esempio a b Risultato
+ (unario) +a N/D falso
! !a N/A false
== (o eq) a == b N/A 5 false
== (o eq) a == b N/A 0 false
== (o eq) a == b N/A N/A false
!= (o ne) a != b N/A 5 false
!= (o ne) a != b N/A N/A false
!= (o ne) a != b N/A 0 false
> (o gt) a > b N/A 5 false
>= (o ge) a >= b N/A 5 false
< (o lt) a < b N/A 5 false
<= (o le) a <= b N/A 5 false
e a e b N/A 5 falso
e a e 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 false
|(b + b) > (a && b) N/A 5 false
funzione sum(a,b,b) N/A 5 falso
funzione max(a,b) N/A 5 falso
funzione min(a,b ) N/A 5 false
funzione implode(', ',a,b,a,b) N/A 5 - funzione if(a,a,b) N/A 5 false
funzione è_vuoto(a) N/ A false
funzione è_vuoto(a) 0 (o vuoto) vero
funzione !è_vuoto(a) N/A falso

Sovrascrivere le condizioni a cascata

Supponi di voler mostrare un totale parziale di tutte le risposte pertinenti. Potresti provare a usare l'equazione {sum(q1,q2,q3,...,qN)}. Tuttavia, questo viene tradotto internamente in LEMif(LEManyNA('q1','q2','q3',...,'qN'),,sum(LEMval('q1'),LEMval('q2') ,LEMval('q3'),...,LEMval('qN'))). Quindi, se uno qualsiasi dei valori q1-qN è irrilevante, l'equazione restituirà sempre false. In questo caso, sum() mostrerà 0 fino a quando non verrà data risposta a tutte le domande.

Per aggirare questo problema, a ogni variabile può essere aggiunto un suffisso ".NAOK" (che significa che non applicabile è OK). In tali casi, si verifica il seguente comportamento. Supponi di avere una variabile q1.NAOK

  1. q1 non aggiunta alla clausola LEManyNA()
  2. LEMval('q1') continuerà a verificare se la risposta è rilevante e restituirà '' in caso contrario (quindi le singole risposte irrilevanti verranno ignorate, ma non annulleranno l'intera espressione).

Quindi, la soluzione al problema del totale parziale è usare l'equazione sum(q1.NAOK,q2.NAOK,q3.NAOK,...,qN.NAOK).

L'uso del suffisso .NAOK consente inoltre agli autori di progettare sondaggi che hanno diversi percorsi possibili ma poi convergono su percorsi comuni in un secondo momento. Ad esempio, diciamo che i soggetti rispondono a un sondaggio in un modo che è al di fuori del normale intervallo di risposte. L'autore potrebbe avvisare i soggetti che potrebbero non ottenere risultati validi e chiedere loro se vogliono davvero continuare con il sondaggio. Se rispondono Sì, verranno mostrate le altre domande. La condizione per il "resto delle domande" verificherebbe se le risposte iniziali hanno ricevuto una risposta entro l'intervallo normale OPPURE se il soggetto ha detto Sì alla domanda che è rilevante solo se ha risposto al di fuori dell'intervallo normale.

In che modo Expression Manager supporta il microadattamento condizionale?

Ecco un esempio di micro-sartoria (dove Question Type=='expr' indica un'equazione):

Codice domanda Rilevanza Tipo di domanda Domanda
nome 1 testo Come ti chiami?
badage !is_empty(età) expr {(età<16) o (età>80 )}
agestop badage messaggio Spiacente, {nome}, anche tu sei {if( (età<16),'giovane',if( (età>80), 'vecchio','di mezza età') ) } per questo test.
bambini !badage sìno Hai figli?
genitori 1 expr {!badage && kids=='Y'}
numKids parents text Quanti figli hai?
kid2 parents && numKids >= 2 text Quanti anni ha il tuo secondo figlio?
kid3 parents && numKids >= 3 text Quanti anni ha il tuo terzo figlio?
kid4 parents && numKids > = 4 testo Quanti anni ha il tuo quarto figlio?
kid5 genitori && numRagazzi >= 5 testo Quanti anni ha il tuo quinto figlio?
report |yesno {name}, hai detto che sei {age} e che hai {numKids}. La somma delle età dei tuoi primi {min(numKids,5)} figli è {sumage}

Tutte queste domande possono trovarsi su un'unica pagina (ad es. nello stesso gruppo) e verranno visualizzate solo le domande pertinenti. Inoltre, quando inserisci l'età dei bambini, l'espressione sum() nell'ultima domanda si aggiornerà dinamicamente sulla pagina.

<html>Expression Manager fornisce questa funzionalità circondando ogni espressione con un named elemento. Ogni volta che un valore cambia, ricalcola l'espressione che dovrebbe apparire in quello elemento e rigenera il display. Puoi avere dozzine, o addirittura centinaia, di tali espressioni personalizzate sulla stessa pagina e la pagina le visualizzerà nuovamente tutte in un singolo aggiornamento dello schermo.

Mappatura di LimeSurvey 1.91+ alla funzionalità Expression Manager

Vecchia funzionalità Nuova funzionalità Commenti
Condizioni Rilevanza - Valutazioni Equazione Qualsiasi punteggio di valutazione può essere riorganizzato in un'equazione. Questo assicura che il punteggio sia scritto nel database e ti consente anche di vedere le modifiche dinamiche al valore del punteggio nella pagina corrente
Sostituzioni Expression Manager Il motore principale accetta la stringa di input e tratta tutto ciò che è racchiuso tra parentesi graffe come un'espressione, quindi gestisce tutti i tipi di sostituzioni storiche. Per evitare di incasinare JavaScript incorporato, Expression Manager elabora solo il contenuto tra parentesi graffe purché (a) non ci siano spazi bianchi iniziali o finali all'interno delle parentesi graffe - ad esempio {expr} è un'espressione, ma { expr}, {expr}, e { expr } non sono espressioni. Inoltre, Expression Manager non elabora il contenuto all'interno delle proprie stringhe (ad es. {list('hi','there {braces}')} genera "hi there {braces}"). Ignora anche le parentesi graffe con escape (ad es. \{questa non è un'espressione\})
Convalida Expression Manager Il piano è prendere gli attributi domanda min/max correnti e avere Expression Manager elaborarli. In questo modo i valori min/max possono essere essi stessi espressioni

Evidenziazione della sintassi

Per facilitare l'immissione e la convalida delle espressioni, EM fornisce l'evidenziazione della sintassi con le seguenti funzionalità:

Tipi e significati dell'evidenziazione della sintassi

Colore Esempio Significato Descrizione comandi Commenti
tan background Esempio il equazione intera nessuno Qualsiasi elemento all'interno delle parentesi graffe riconosciuto come equazione (ad es. non ci sono spazi bianchi all'inizio o alla fine) sarà codificato a colori con uno sfondo marrone chiaro per distinguerlo dal testo circostante
blue text Esempio nome funzione significato e sintassi consentita i nomi delle funzioni, o cose che dovrebbero essere funzioni poiché sono seguite da una parentesi di apertura, sono presentati in grassetto blu. I tooltip mostrano il significato e la sintassi consentita per la funzione.
grey text Sample string none le stringhe tra virgolette singole e doppie sono mostrate in testo grigio
testo ciano Campione variabile impostata sulla stessa pagina, [ nome o codice SGQA]: domanda; valore; answerList che mostra i codici per ogni valore Qualsiasi variabile impostata sulla stessa pagina della domanda corrente viene mostrata in testo ciano, a indicare che può essere aggiornata in javascript. Il tooltip mostra il suo nome (se hai utilizzato INSERTANS:xxx) o il codice SGQA (se hai utilizzato il nuovo sistema di denominazione), la domanda effettiva e il suo valore corrente (o vuoto se non impostato). Se il tipo di domanda prevede risposte da un insieme di valori enumerati, la mappatura dei codici per visualizzare i valori è show.
green text Esempio variabile impostata su una pagina precedente [ nome o codice SGQA]: domanda; valore; answerList che mostra i codici per ogni valore Qualsiasi variabile impostata su una pagina precedente è mostrata in grassetto verde. Il tooltip mostra il suo nome (se hai utilizzato INSERTANS:xxx) o il codice SGQA (se hai utilizzato il nuovo sistema di denominazione), la domanda effettiva e il suo valore corrente (o vuoto se non impostato). Se il tipo di domanda prevede risposte da un set di valori enumerati, la mappatura dei codici per visualizzare i valori è show.
bold pink text Sample variabile impostata in una pagina successiva in generale : vuota all'inizio del sondaggio, ma può essere riempita con indice o sposta precedente [ nome o codice SGQA]: domanda; valore; answerList che mostra i codici per ogni valore Qualsiasi variabile impostata su una pagina successiva viene mostrata in grassetto rosa. Il tooltip mostra il suo nome (se hai utilizzato INSERTANS:xxx) o il codice SGQA (se hai utilizzato il nuovo sistema di denominazione), la domanda effettiva e il suo valore corrente (o vuoto se non impostato). Se il tipo di domanda prevede risposte da un set di valori enumerati, la mappatura dei codici per visualizzare i valori è show.
bold tan text Campione un valore di sostituzione del lime il valore Le stringhe di sostituzione del lime (come {TOKEN:xxx}, {PRIVACY_MESSAGE}) sono mostrate in grassetto marrone chiaro.
testo rosso Esempio operatore di assegnazione (=) messaggio di avviso Se usi uno degli operatori di assegnazione (=) quell'operatore verrà visualizzato in rosso. Questo ha lo scopo di aiutare a prevenire la riassegnazione accidentale di valori quando volevi davvero verificare se a == b invece di impostare il valore di a = b.
testo nero normale Esempio punteggiatura none Tutti gli altri segni di punteggiatura all'interno dell'espressione vengono mostrati come normale testo nero.
testo con riquadro rosso una linea rossa in grassetto circonda l'errore errore di sintassi descrizione dell'errore Eventuali errori di sintassi rilevati vengono mostrati circondando l'errore con una casella rossa. Il tooltip mostra l'errore. Gli esempi includono parentesi non corrispondenti, uso di funzioni non definite, passaggio di un numero errato di argomenti alle funzioni, espressioni mal strutturate (ad es. operatori mancanti tra variabili), tentativi di assegnare un nuovo valore a una variabile di sola lettura, tentativi di assegnare valori a variabili non variabili o utilizzando una sintassi non supportata. Si noti che il sistema di rilevamento degli errori di sintassi può segnalare solo un errore in un'espressione anche se sono presenti più errori; tuttavia, se vengono rilevati errori, verrà mostrato almeno un errore.

Lettura aggiuntiva

Sondaggi campione di Expression Manager

Casi d'uso e How-To

Esempi passo-passo

Expression Manager statistic functions

Riferimento per sviluppatori

RoadMap/Stato/Elenco cose da fare