Menedżer wyrażeń
From LimeSurvey Manual
Samouczek szybkiego startu
Przegląd
Dostosowując ankiety, zazwyczaj potrzebujesz sposobu na określenie następujących elementów:
- Nawigacja/Rozgałęzienia — umożliwienie odpowiedzi podmiotu zmiany kolejności zadawania pytań
- Krawiectwo/ Piping — jak sformułować pytanie (np. odnosząc się do wcześniejszych odpowiedzi lub odmieniając zdania w oparciu o liczbę lub płeć badanych) lub jak generować niestandardowe raporty (takie jak wyniki oceny lub dostosowane porady).
#Walidacja — upewnianie się, że odpowiedzi spełniają określone kryteria, takie jak wartości minimalne i maksymalne lub pasują do wzorca wejściowego
Menedżer wyrażeń (EM) zapewnia intuicyjny sposób określania logiki dla każdej z tych funkcji. Prawie wszystko, co można zapisać jako standardowe równanie matematyczne, jest poprawnym wyrażeniem, nawet jeśli wywołujesz funkcje. EM zapewnia obecnie dostęp do 80 funkcji i można go łatwo rozszerzyć, aby obsługiwał więcej. Umożliwia także dostęp do zmiennych przy użyciu nazw zmiennych czytelnych dla człowieka (a nie nazw SGQA).
W poniższych sekcjach przedstawiono główne miejsca, w których używany jest Menedżer wyrażeń
Istotność (kontrola nawigacji/rozgałęzień)
Niektóre ankiety wykorzystują „Goto Logic”, tak że jeśli odpowiesz na pytanie 1 opcją C, przejdź do pytania 5. To podejście jest bardzo ograniczające, ponieważ jest trudne do sprawdzenia i łatwo się psuje, gdy trzeba zmienić kolejność pytań. EM używa równania istotności logicznej, aby określić wszystkie warunki, pod którymi pytanie może być ważne. Jeżeli pytanie jest istotne, to jest ono wyświetlane, w przeciwnym razie jest nie dotyczy, a w bazie danych zapisana jest wartość NULL. Jest to podobne do tego, co można zrobić za pomocą edytora warunków, ale EM pozwala łatwo określić znacznie bardziej złożone i wydajne kryteria (i pozwala używać nazwy zmiennej zamiast nazewnictwa SGQA).
Ten obraz przedstawia jeden ze sposobów przeglądu logiki trafności ankiety. Oblicza wskaźnik masy ciała. Równanie istotności jest pokazane w nawiasie kwadratowym zaraz po nazwie zmiennej (która jest zaznaczona na zielono). Zatem znaczenie wagi, jednostek wagi, wzrostu i jednostek wysokości wynosi 1, co oznacza, że te pytania są zawsze zadawane. Jednakże znaczenie dla BMI to {!is_empty(height) i !is_empty(weight)}, co oznacza, że BMI zostanie obliczone tylko wtedy, gdy osoba badana wprowadzi wartość zarówno wzrostu, jak i masy ciała (w ten sposób unikając ryzyka dzielenia przez zero błąd). Ponadto pytanie Raport jest wyświetlane tylko wtedy, gdy badany odpowie na wszystkie cztery główne pytania (wzrost, jednostki wzrostu, waga, jednostki wagi).
Trafność jest wyświetlana i edytowalna w następujących miejscach:
Wyświetlanie/edytowanie trafności na poziomie pytania
To równanie oblicza wskaźnik masy ciała (BMI). Pytanie dotyczy tylko tego, czy osoba najpierw wprowadza swój wzrost i wagę.
To jest ekran edycji pytania BMI.
Należy pamiętać, że podczas wprowadzania równania istotności nie używa się nawiasów klamrowych.
Wyświetlanie/edytowanie trafności na poziomie grupy
To jest przykładowe badanie spisowe. Pierwsza strona pyta, ile osób z tobą mieszka i zapisuje tę informację w zmiennej „cohabs”. Ta strona jest wyświetlana tylko wtedy, gdy masz więcej niż jednego konkubenta (a więc jest wyświetlana dla drugiej osoby mieszkającej z Tobą), a także wyświetla się tylko wtedy, gdy określiłeś, w jaki sposób Osoba Pierwsza jest z Tobą powiązana (p1_rel).
Jak widać, grupa ma również kryteria trafności na poziomie pytania, tak że każde pytanie pojawia się dopiero po udzieleniu odpowiedzi na pytanie poprzedzające (np. {!is_empty(p1_sex)}). EM łączy dla Ciebie znaczenie na poziomie grupy i pytania. Pytania w grupie są zadawane tylko wtedy, gdy grupa jako całość jest istotna. Następnie zadawany jest tylko podzbiór pytań w obrębie grupy, które są istotne.
Oto ekran edycji trafności tego pytania na poziomie grupy:
Należy pamiętać, że podczas wprowadzania równania istotności nie używa się nawiasów klamrowych.
Krawiectwo/Wyszywanie
EM umożliwia łatwe i złożone warunkowe dostosowywanie pytań. Czasami wystarczy prosta zamiana, na przykład powiedzenie: „Powiedziałeś, że kupiłeś [ Produkt]. Co Ci się w tym najbardziej podobało?”. Czasami potrzebujesz podstawienia warunkowego, np. „ [ Pan Pani.] [ Nazwisko], czy byłbyś skłonny wypełnić naszą ankietę?”. W tym przypadku chcesz użyć „Pan lub Pani” w zależności od płci danej osoby. Innym razem potrzebujesz jeszcze bardziej złożonego podstawienia (np. w oparciu o obliczenia matematyczne) EM obsługuje każdy z tych typów krawiectwa/lamówek.
Równania warunkowe
Przykład wskaźnika masy ciała pokazuje możliwość obliczenia BMI danej osoby, nawet jeśli pozwala ona na wprowadzenie wzrostu i masy ciała w jednostkach metrycznych lub niemetrycznych.
Tutaj waga_kg to {if(weight_units == 'kg', waga, waga * .453592)}. Ta funkcja if() oznacza, że jeśli podmiot wprowadził wagę w kilogramach, użyj tej wartości, w przeciwnym razie pomnóż wprowadzoną wartość (w funtach) przez 0,453592, aby przeliczyć ją na kilogramy. Zmienna height_m wykorzystuje podobne podejście do obliczania wzrostu osoby w metrach, nawet jeśli wprowadziła ona swój wzrost w calach.
BMI oblicza wzór na wagę jako {waga_kg / (wysokość_m * wysokość_m)}.
Na koniec raport warunkowo dopasowuje przekaz do tematu, informując go o tym, co wprowadził. („Powiedziałeś, że masz 2 metry wzrostu i ważysz 70 kg.”)
Chociaż na powyższym obrazku nie zostało to dobrze pokazane, funkcja Weight_status wykorzystuje zagnieżdżone instrukcje if(), aby sklasyfikować osobę jako z niedowagą lub z dużą otyłością. Możesz zobaczyć jego równanie w widoku Pokaż logikę
W oknie edycji tego pytania możesz zobaczyć dwie rzeczy:
- Krawiectwo musi otaczać wyrażenia nawiasami klamrowymi
- Wyrażenia mogą obejmować wiele linii, jeśli – jak w tym przypadku – chcesz, aby było łatwiej przeczytać zagnieżdżona logika warunkowa.
Dostosowane pytania, odpowiedzi i raporty
Ten przykład pokazuje raport BMI.
Oto okno edycji tego samego pytania.
Jak widać, wszystko w nawiasach klamrowych jest traktowane jako wyrażenie, więc składnia jest wyróżniona (oznaczona kolorami) na poprzednim obrazie. Jeśli masz jakieś literówki (takie jak błędnie napisane lub niezdefiniowane nazwy zmiennych lub funkcji), EM wyświetli błąd, taki jak ten, pokazując, że height_unit to niezdefiniowana nazwa zmiennej (w rzeczywistości są to height_units), a rnd() to niezdefiniowana funkcja (właściwa nazwa funkcji to round()). W obu przypadkach błędy są otoczone czerwoną ramką, aby ułatwić ich wykrycie i naprawienie.
Widzisz także, że możesz szybko tworzyć rozbudowane raporty, takie jak tabela wprowadzonych wartości czy dostosowane porady.
Proszę pamiętać, że każde dostosowywanie musi otaczać wyrażenia nawiasami klamrowymi, aby LimeSurvey wiedziało, które części pytania są tekstem wolnym, a które należy przeanalizować za pomocą Menedżera wyrażeń.
Weryfikacja
EM kontroluje działanie większości zaawansowanych opcji pytań. Te aspekty kontroli, takie jak minimalna/maksymalna liczba odpowiedzi; min./maks. poszczególne wartości; wartości sumy min./maks.; i sprawdzanie, czy wprowadzone wartości odpowiadają określonym wzorcom ciągów. Kontynuujesz wprowadzanie zaawansowanych opcji pytań w zwykły sposób. Jednak teraz dowolna wartość w jednym z tych pól jest uważana za wyrażenie, więc możesz mieć kryteria min./maks. ze złożonymi relacjami warunkowymi z innymi pytaniami.
We wszystkich tych przypadkach, ponieważ opcja pytania zaawansowanego jest zawsze uważana za wyrażenie, przy jej określaniu nie używa się nawiasów klamrowych.
Strony Przykładowe ankiety pokazują wiele działających przykładów użycia wyrażeń do walidacji.
Wprowadzenie
LimeSurvey korzysta z nowego modułu Expression Manager (EM), który umożliwi LimeSurvey obsługę bardziej złożonych rozgałęzień, ocen, walidacji i dostosowywania. Zastąpi sposób, w jaki LimeSurvey zarządza wymianami, warunkami i ocenami na zapleczu. Przyspieszy to również znacznie przetwarzanie, ponieważ eliminuje większość odczytów baz danych w czasie wykonywania. EM został opracowany przez dr Thomasa White'a (TMSWhite).
Ta strona wiki stanowi ostateczne źródło informacji na temat składni i funkcjonalności Menedżera wyrażeń.
Najważniejsze definicje
- Wyrażenie: Wszystko otoczone nawiasami klamrowymi
- Pod warunkiem, że bezpośrednio po nawiasie otwierającym lub przed zamykającym nawiasem klamrowym nie ma spacji
#*Zawartość wyrażeń jest oceniana przez EM, więc mogą zawierać formuły matematyczne, funkcje oraz złożone przetwarzanie ciągów i dat.
- Krawiectwo: Czasami nazywany „rurociągiem”, jest to proces warunkowa modyfikacja tekstu
- Masz dostęp do wszystkich „pól zastępczych”, danych uczestników i danych odpowiedzi.
- Masz także łatwiejszy dostęp do pytań, odpowiedzi i ich właściwości.
- Równanie „Istotność”: nowy atrybut pytania kontrolujący widoczność pytania
- Jeśli istnieje równanie trafności, pytanie jest wyświetlane tylko wtedy, gdy trafność ma wartość true.
- Wewnętrznie wszystkie array_filter i array_filter_exclude polecenia stają się trafne na poziomie podpytania
- Równanie Typ pytania: nowy typ pytania, który zapisuje obliczenia lub raporty w bazie danych
- To przypomina pytanie standardowe, ale jego zawartość jest zapisywana bazy danych, nawet jeśli ustawisz opcję „Zawsze ukrywaj to pytanie”
- Kod pytania: To jest preferowana nazwa zmiennej dla EM
- Może to być nazwa opisowa wskazująca cel pytania , co ułatwia czytanie złożonej logiki
- Prawidłowe kody pytań NIE powinny zaczynać się od cyfry, więc jeśli używasz kodu pytania do numerowania pytań, po prostu użyj „q1”, „q1a” lub „g1q2”.!
- To jest obecnie nazwa zmiennej, jeśli eksportujesz dane do SPSS lub R, więc jeśli przeprowadzasz analizę statystyczną, prawdopodobnie już ją stworzyłeś.
Czy muszę używać EM?
Krótka odpowiedź brzmi: nie (ale także tak).
EM jest w pełni kompatybilny wstecz z istniejącymi ankietami. Jeśli więc podoba Ci się korzystanie z Warunków i Ocen w stylu, jaki LimeSurvey stosował w wersjach <= 1.91+, możesz to nadal robić.
Jednak EM całkowicie zastępuje sposób, w jaki LimeSurvey wewnętrznie radzi sobie z Warunkami. Chociaż nadal możesz używać Edytora warunków do tworzenia warunków i zarządzania nimi, LimeSurvey 1.92 przekonwertuje je na równoważne równania istotności. W ramach aktualizacji LimeSurvey 1.92 automatycznie przekonwertuje wszystkie istniejące warunki na równania istotności.
To powinno dać ci to, co najlepsze z obu światów — możesz nadal korzystać z LimeSurvey tak, jak jesteś przyzwyczajony, ale zobaczysz odpowiednik równania trafności, dzięki czemu będziesz mógł stopniowo migrować bezpośrednio do równań trafności, kiedy tylko uznasz to za stosowne.
Czy mogę łączyć Warunki i Trafność?
Tak. W przypadku niektórych pytań możesz użyć edytora warunków, a w przypadku innych – edytora trafności. Warunki są automatycznie konwertowane na trafność po zapisaniu pytania.
Uwaga: zakładamy, że jeśli używasz edytora warunków, chcesz, aby te warunki nadpisywały wszelkie ręcznie wprowadzone równania istotności. Jeśli więc masz istniejące Warunki i chcesz ręcznie edytować Trafność, najpierw usuń Warunki dotyczące tego pytania. W szczególności skopiuj wygenerowane równanie trafności do edytora tekstu, użyj menu Warunki, aby usunąć wszystkie warunki tego pytania (co spowoduje również usunięcie trafności), następnie edytuj pytanie i wklej wygenerowane równanie trafności z edytora tekstu z powrotem do pole istotności dla tego pytania (i zapisz pytanie). Jeśli istnieje wystarczające zapotrzebowanie na usuwanie warunków bez usuwania wygenerowanego równania trafności, możemy dodać proces konwersji zbiorczej.
Jak wybrać pomiędzy Warunkami a Trafnością?
Oto lista zalet i wad każdego stylu:
Styl | Zalety | Wady |
---|---|---|
Warunki | 1. Ładny GUI do tworzenia prostych warunków 2. GUI dobrze udokumentowane i zrozumiałe przez zespół wsparcia |
1. Obsługuje tylko proste porównania i nie obsługuje dobrze warunków ORAZ/LUB 2. Warunki kaskadowe działają nieprawidłowo 3. Powolny – intensywnie korzysta z bazy danych, co może spowolnić długie ankiety 4. Niektórzy zgłaszali problemy z warunkami ponownego ładowania 5. GUI nie skaluje się dobrze, gdy są dziesiątki, setki lub tysiące pytań 6. Konwersja ankiet w formie papierowej może być powolna, ponieważ należy używać nazw SGQA 7. Często potrzebny jest programista do niestandardowego kodu logiki potrzebnego do skomplikowanych rozgałęzień |
Trafność | 1. Obsługuje bardzo złożoną logikę, w tym ponad 80 funkcji i operatorów matematycznych/łańcuchowych 2. Doskonałe wsparcie dla logiki kaskadowej 3. Szybko – bez dodatkowych wywołań do bazy danych, dzięki czemu obsługuje ankiety zawierające ponad 1000 pytań 4. Nie ma problemów z ponownym załadowaniem logiki, ponieważ nie wymaga kodów SGQA 5. Skale podświetlania składni do ankiet zawierających ponad 1000 pytań 6. Łatwy i szybki w użyciu dla grup chcących skomputeryzować istniejące ankiety w formie papierowej. 7. Z łatwością obsługuje częściowo ustrukturyzowane wywiady i badania epidemiologiczne bez konieczności korzystania z programisty |
1. Brak GUI dla prostych warunków - zamiast tego użyj podświetlania składni 2. Nowość, więc zespoły wsparcia nie opanowały jeszcze EM. |
Najważniejsze jest to, że jeśli jesteś zadowolony z działania LimeSurvey 1.91+, nie ma powodu zmieniać tego, co robisz.
Jakie są inne korzyści wynikające z używania EM?
Oto kilka innych powodów, dla których warto używać EM.
- Obliczenia — możesz utworzyć dowolne obliczenia, jakie tylko przyjdą Ci do głowy:
- Masz dostęp do wszystkich popularnych operatorów i funkcji matematycznych
- Masz dostęp do ponad 70 funkcji matematycznych, dat i przetwarzania ciągów znaków
- Programiści mogą dość łatwo dodawać nowe funkcje, jeśli użytkownicy ich potrzebują
- Przechowywanie obliczeń w bazie danych
- Możesz teraz wykonywać obliczenia proste i złożone obliczenia i/lub wyniki skali ORAZ przechowuj je w bazie danych bez konieczności używania JavaScript.
- Aby to osiągnąć, użyj pytania typu Równanie.
- Oceny
- Możesz teraz tworzyć oceny lub skaluj wyniki z dowolnego typu pytań, a nie tylko z podzbioru, który był wcześniej obsługiwany
- Możesz użyć funkcji Krawiectwo, aby pokazać bieżące lub całkowite wyniki oceny w dowolnym miejscu - nawet na tej samej stronie
- Masz większą kontrolę nad raportami wygenerowanymi na podstawie tych ocen
- Możesz przechowywać wyniki ocen w bazie danych bez potrzeby używania JavaScript
- Możesz ukrywać wyniki ocen bez potrzeby używania JavaScript lub CSS
- Pola zastępcze
- *Zamiast używać {INSERTANS:SGQA}, możesz po prostu użyć kodu pytania - ułatwia to czytanie i sprawdzanie poprawności.
- Pozwala to również uniknąć typowej konieczności edytowania pytań w celu zmiany kodu SGQA, aby wszystko działało .
- Krawiectwo - możesz warunkowo wyświetlać tekst w oparciu o inne wartości
- Użyj odpowiedniego tytułu tematu, np. (np. „Witam [ Pan/Pani] Smith”)
- Wypisz poprawne gramatycznie zdania w liczbie pojedynczej/mnogiej: (np. „Masz 1 dziecko” vs. „Masz 2 dzieci”)
- Odpowiednio odmienione czasowniki i odrzuć rzeczowniki w oparciu o płeć podmiotu i liczbę mnogą.
- Nowe atrybuty zmiennych - możesz uzyskać dostęp do następujących opcji, aby dostosować:
- (bez przyrostka) - alias dla qcode.code
- . code - wybrany kod odpowiedzi na pytanie, jeśli jest istotne (w przeciwnym razie puste) lub wartość tekstowa, jeśli nie jest to pytanie zakodowane
- .NAOK - to samo co .code, ale może być częścią obliczeń lub list nawet jeśli nieistotne
- .value - wartość oceny pytania, jeśli jest istotne (w przeciwnym razie puste) lub wartość tekstowa, jeśli nie jest to pytanie zakodowane - dostępna, jeśli w ankiecie włączono ocenianie, w przeciwnym razie zawsze zero
- .valueNAOK - to samo co .value, ale może być częścią obliczeń lub list, nawet jeśli jest nieistotne
- .show - odpowiedź wyświetlana użytkownikowi (to właśnie robi {INSERTANS:xxx} )
- .qid - identyfikator pytania
- .gid - identyfikator grupy
- .sgqa - wartość SGQA dla pytania
- .jsName - poprawna nazwa zmiennej JavaScript dla pytania, niezależnie od tego, czy jest zdefiniowane na tej stronie, czy na innej
- .qseq - sekwencja pytań (zaczynając od 0)
- .gseq - sekwencja grupowa (zaczynając od 0)
- . obowiązkowe - czy pytanie jest obowiązkowe (T/N)
- .question - treść pytania
- .relevance - równanie istotności dla pytania
- .grelevance - równanie istotności dla grupy
- .relevanceStatus - czy pytanie jest aktualnie aktualne (boolean (może być inne w PHP i JS))
- .type - typ pytania (jednoznakowy kod)!N !#Dynamiczne zmiany na stronie
- Wszystkie trafności, obliczenia i dostosowywanie działają dynamicznie na stronie — więc zmiany wartości natychmiast aktualizują stronę
- Więc pytania pojawiają się/ znikają dynamicznie w zależności od tego, czy są istotne
- Pytania są również dynamicznie dopasowywane na podstawie odpowiedzi na stronie, dzięki czemu możesz zobaczyć bieżące sumy, dostosowane zdania i spersonalizowane raporty.
- Nowy ekran wprowadzania danych
- Oprócz korzystania w obecnym systemie wprowadzania danych możesz po prostu użyć Survey-All-In-One.
- Obsługuje to trafność i dostosowywanie na stronie, dzięki czemu urzędnicy wprowadzający dane mogą szybko przeglądać i będą musieli jedynie wprowadzić odpowiednie odpowiedzi
- Może to mieć kluczowe znaczenie, jeśli osoba wprowadzająca dane musi zobaczyć dostosowywanie, które jest również dynamiczne.
- Eliminuje potrzebę stosowania większości niestandardowych JavaScript
- EM z łatwością obsługuje skomplikowane obliczenia, punktację , dostosowywanie i logika warunkowa.
- Niektóre rzeczy nadal będą wymagały JavaScriptu (np. niestandardowe układy i warunkowe ukrywanie podelementów pytań), ale Twój JavaScript może korzystać z funkcji EM, dzięki czemu będziesz mieć dostęp do pytań za pomocą Qcode zamiast SGQA i uzyskaj dostęp do dowolnych właściwości pytania wymienionych powyżej.
Jakie są inne przydatne nowe funkcje udostępnione przez firmę EM?
Niezależnie od tego, czy będziesz nadal korzystać z Edytora warunków, czy ręcznie tworzyć równania trafności, uzyskasz następujące dodatkowe korzyści:
- Możesz utworzyć bardziej złożone kryteria walidacji
- Wszystkie zaawansowane atrybuty pytań (takie jak max_answers, min_num_value_n, max_num_value) mogą używać wyrażeń. Zatem kryteria min./maks. można łatwo dostosować w oparciu o wcześniejsze odpowiedzi, nawet jeśli znajdują się na tej samej stronie.
- EM obsługuje również całą walidację opartą na wyrażeniach regularnych, dzięki czemu można solidnie łączyć preg i równanie- oparte na atrybutach pytań.
- Łatwa zmiana kolejności (lub usuwanie) pytań i grup
- Przed wersją 1.92 nie można było zmienić kolejności pytań ani grup, jeśli LimeSurvey uważał, że taka zmiana kolejności może się zepsuć warunkach, w jakich były używane. Podobnie nie można było usunąć pytań, jeśli od nich zależało jakiekolwiek inne pytanie.
- Dzięki podświetlaniu składni EM łatwo jest zobaczyć i sprawdzić, czy próbujesz użyć pytań, zanim zostaną one zadeklarowane. Dzięki temu możesz teraz zmieniać kolejność pytań i grup lub je usuwać, kiedy tylko chcesz. EM zaktualizuje wszystkie podświetlenia składni, aby pokazać potencjalne błędy.
- Widok pytań dotyczących ponownej kolejności został udoskonalony, aby ułatwić taką ocenę. Pokazuje teraz równanie trafności i dopasowanie pytania, dzięki czemu można od razu sprawdzić, czy jakiekolwiek zmienne stają się różowe (co oznacza, że zostały użyte przed zadeklarowaniem).
- Indeks pytania/nawigacji po grupie jest zawsze dostępny i dokładny
- Przed wersją 1.92 te indeksy nie były dostępne w przypadku złożonych warunków
- Dzięki EM możemy zagwarantować, że są dokładne.
- Badanie może nawet cofnąć się do poprzedniego pytania i zmienić odpowiedź , następnie przejdź do przodu (lub prześlij)
- Podczas przeskakiwania do przodu EM ponownie zweryfikuje wszystkie pytania/grupy interweniujące.
- Jeśli jakiekolwiek pytania staną się nieistotne, w bazie danych będą miały wartość NULL tak, aby Twoje dane były wewnętrznie spójne
- Jeśli jakiekolwiek pytania staną się istotne lub ponownie nie spełnią wymagań obowiązkowych lub zasad sprawdzania poprawności, EM zatrzyma się na tej stronie i zmusi użytkownika do odpowiedzi na te pytania przed przejściem do miejsca docelowego.
#Automatyczna konwersja warunków na trafność
- Po uaktualnieniu bazy danych dla wszystkich istniejących ankiet zawierających warunki zostaną wygenerowane równania trafności
- Za każdym razem, gdy importujesz ankietę, równania trafności zostaną utworzone w razie potrzeby
- Za każdym razem, gdy dodasz, usuniesz lub zmodyfikujesz warunki, EM wygeneruje odpowiednie równanie istotności.
- Wygodne podświetlanie składni
- Kiedy EM pokaże równanie istotności, pokaże kod Q, nawet jeśli wpisałeś kod SGQA, ponieważ zakładamy, że będzie on łatwiejszy do odczytania.
- Wszystkie zmienne są oznaczone kolorami, aby pokazać, czy zostały zadeklarowane przed, czy po bieżącym pytaniu (lub przed czy po bieżącej grupie). Pozwala to szybko wykryć i naprawić przypadki, w których próbujesz użyć zmiennych do celów trafności (w tym array_filter), dostosowania lub sprawdzenia poprawności równań przed ich zadeklarowaniem.
- Dodatkowo, jeśli najedziesz myszką na oznaczoną kolorem zmienną , zobaczysz najważniejsze metadane dotyczące tego pytania. Obejmuje to numer sekwencji grupy, numer sekwencji pytania, kod Q, tekst pytania i wszystkie dostępne opcje odpowiedzi (jeśli jest to typ pytania z wyliczonymi opcjami odpowiedzi).
- Lista opcji odpowiedzi wykorzystuje tę składnię : 'answers':{key:val, ... }.
- key ma składnię 'scale~code' gdzie scale jest skalą odpowiedzi (np. dla podwójnej skali), a code jest kodem odpowiedzi.
- val ma składnię 'wartość~pokazana', gdzie wartość to wartość oceny (w przypadku korzystania z ocen, w przeciwnym razie „kod”) (np. Qcode.value), a „pokazana” to wartość wyświetlana widziana przez podmiot (np. Qcode.pokazana)
- To oznacza, że wiele ankiet może korzystać z obliczeń bez konieczności korzystania z trybu oceny. Jeśli wyliczyłeś opcje odpowiedzi, które są unikalne, nie dziesiętne i nieujemne, możesz po prostu wykonać obliczenia na wartościach Qcode.code.
- Łatwy przegląd całej logiki i treści ankiety
- Jest nowa funkcja Pokaż logikę ankiety, która pozwala zobaczyć wszystko na temat ankiety (lub grupy lub pytania) na jednej stronie.
- Pokazuje szczegóły grupy, pytania, pytania podrzędnego i odpowiedzi dla wybranego zakresu (ankieta vs. grupa vs. pytanie)
- Pokazuje także trafność, trafność na poziomie podpytania (dla array_filter i array_filter_exclude) oraz wygenerowane równanie walidacyjne (dla preg i wszelkich reguł walidacji, takich jak min./maks. suma/liczba wartości) i wszystkie niepuste atrybuty pytań.
- Wszystko jest podświetlone składnią, dzięki czemu można zobaczyć potencjalne błędy składniowe (takie jak niezrównoważone nawiasy lub użycie zmiennych przed ich zadeklarowaniem)
- Składnia- zaznaczenie umożliwia szybką nawigację i edycję ankiety.
- Jeśli klikniesz nazwę zmiennej, otworzy się okno przeglądarki (lub karta), w którym zostanie wyświetlone to pytanie i umożliwisz jego edycję.
- Jeśli klikniesz nazwę grupy, otworzy się okno przeglądarki (lub karta) pokazujące widok zmiany kolejności grup, dzięki czemu możesz łatwo przenosić pytania.
- Wszystkie atrybuty pytań są również podświetlona składnia. Pozwala to ustawić i zobaczyć wyrażenia w zaawansowanych opcjach pytań (takich jak oparcie maksymalnej/min. liczby/sumy wartości na wyrażeniu)
- Autor EM użył podobnego widoku (trochę bardziej przejrzystego), aby pozwolić swoim współpracującym epidemiologom i pracownikom instytucjonalnym Rada Rewizyjna weryfikuje i autoryzuje ankiety składające się z tysięcy pytań w ramach wysoce rozbudowanych i dostosowanych do indywidualnych potrzeb wywiadów strukturalnych
Pierwsze kroki
Najlepszym sposobem na rozpoczęcie pracy z EM jest:
- Zainstalowanie najnowszej stabilnej wersji ze strony http://www.limesurvey.org/en/download
- Zaimportowanie i zapoznanie się z przykładowymi ankietami .
- Przejrzyj przypadki użycia i instrukcje i przykłady krok po kroku.
- Przejrzyj dokumentację EM (tę stronę)! N!*Sprawdź wbudowany zestaw testów EM
- Z dowolnej ankiety, w obszarze narzędzi wybierz opcję EM
- Dostępne funkcje zawierają listę ponad 70 funkcji i składni
- Testy jednostkowe izolowanych Wyrażenia
- pokazuje przykłady użycia wszystkich funkcji i operatorów EM oraz wyniki PHP i JavaScript
- pamiętaj, że istnieje kilka funkcji, które generują różne wyniki w wersjach PHP i JavaScript, więc ta strona pozwala odpowiednio zaplanuj logikę EM.
Jaką funkcjonalność rozszerza/zastępuje Menedżer wyrażeń? (LimeSurvey <= 1,91+)
Warunki => Trafność
Warunki kontrolowały, które pytania są widoczne. Ogólna składnia była następująca: „Wartość operatora SGQA”, np. „111X2X3 == „Y””. Warunki można było łączyć ze sobą AND lub OR, ale mieszanie AND i OR było trudne. Same warunki zostały zapisane w osobnej tabeli, a duża część kodu LimeSurvey została poświęcona zarządzaniu warunkami. Ze względu na rozległy dostęp do bazy danych przetwarzanie dużej liczby warunków może powodować zauważalne problemy z wydajnością. Co więcej, gdy już przypisano warunki do pytań lub grup, często nie można było ich zmienić ani usunąć.
Oceny => Równania i mikro-krawiectwo
Oceny pozwalają użytkownikom tworzyć wyniki skali na podstawie zbioru pytań. Nie mogły one jednak zmieniać się dynamicznie na bieżącej stronie, a ich wartości nie były zapisywane w bazie danych.
Zamienniki => Mikro-krawiectwo
Użytkownicy mogą dostosować niektóre wiadomości i pytania w oparciu o wcześniejsze odpowiedzi. Na przykład pytanie może brzmieć: „{TOKEN:FIRSTNAME}, powiedziałeś, że {INSERTANS:111X3X4} to Twój ulubiony sport”. Jednak nie było możliwe dokonanie dopasowania warunkowego (np. powiedzenie „Pan” lub „Pani” w zależności od płci osoby) lub odmienienie czasowników lub odmienienie rzeczowników bez fantazyjnego JavaScriptu. Autorzy mogli wdrożyć ankiety, które zdawały się dopasowywać pytania, ale wymagało to oddzielnych pytań dla każdej permutacji i skomplikowanych warunków, aby zdecydować, które pytania wyświetlić.
Weryfikacja
Pytanie można sprawdzić za pomocą wyrażeń regularnych lub wartości minimalnych/maksymalnych, albo też odpowiedź SGQA może służyć jako wartość minimalna lub maksymalna. Jednak walidacja nie mogłaby opierać się na obliczeniach innych zmiennych bez wymyślnego JavaScript.
Równania
Równania nie były obsługiwane bez fantazyjnego JavaScript.
Typ pytania dotyczącego równania
Równania nie mogłyby zostać zapisane w bazie danych (np. końcowy wynik oceny) bez fantazyjnego JavaScriptu.
W jaki sposób Menedżer wyrażeń zastąpi/rozszerze tę funkcjonalność?
Menedżer wyrażeń to nowy moduł podstawowy w LimeSurvey, który znacznie ułatwia obsługę złożonej funkcjonalności, która wcześniej wymagała niestandardowego JavaScript. Zastępuje także sposób, w jaki LimeSurvey zarządza obecnie warunkami i ocenami.
Nowa terminologia w odniesieniu do Menedżera wyrażeń (EM)
EM „myśli” o swojej funkcjonalności w następujący sposób:
- 'Rozgałęzienia oparte na trafności - jeśli pytanie jest istotne, to je zadaj, w przeciwnym razie nie (np. uczyń je niewidocznym i zaznacz jako NULL w bazie danych). Dodano nowe pole Istotność dla wszystkich typów pytań, a także dla każdej grupy (dzięki czemu można zastosować zestaw warunków do całej grupy bez konieczności kopiowania tego samego warunku do każdego pytania i/lub połączyć warunki warunkowe grupy i poziomu pytania logika).
- 'Krawiectwo - Kiedy już wiesz, jakie pytania należy zadać, krawiectwo (czasami nazywane „lamowaniem”) określa, w jaki sposób należy zadać pytanie. Dzięki temu możesz obsługiwać nie tylko proste podstawienia (takie jak {TOKEN:FIRSTNAME}), ale także koniugację czasowników i deklinację rzeczowników w zależności od płci lub liczby tematów. Umożliwia także zmianę wiadomości dostarczanej do tematu w oparciu o to, czy odpowiedział on (lub jak odpowiedział) na inne pytania.
- 'Równania - EM dodaje nowy typ pytania o nazwie Równanie, w którym przechowywany jest wynik wyrażenia. Wyniki tych równań są obliczane i zapisywane w bazie danych, nawet jeśli ukryjesz je na stronie. Są zatem przydatne do ukrytych obliczeń scoringowych, nawigacji w oparciu o złożone równania, ocen i raportów, które powinny być generowane i łatwo dostępne w bazie danych.
Trafność i trafność kaskadowa
Każdy typ pytania ma teraz opcję Trafność, która kontroluje, czy pytanie jest wyświetlane. EM przetwarza każde z równań istotności w kolejności, w jakiej powinny pojawić się w ankiecie. Jeśli wyrażenie jest prawdziwe (lub brakuje go w celu obsługi starszych ankiet), pytanie zostanie wyświetlone. Jeśli nie jest to istotne, pytanie zostanie ukryte, a wartość w bazie danych będzie wynosić NULL. Jeżeli w danej grupie nie ma odpowiednich pytań, cała grupa zostanie pominięta.
Co więcej, jeśli którakolwiek ze zmiennych w wyrażeniu jest nieistotna, wówczas wyrażenie zawsze ma wartość fałszywą. Umożliwia to kaskadowe dopasowanie trafności, dzięki czemu nie trzeba pisać bardzo długich równań trafności dla każdego pytania.
Załóżmy, że masz 5 pytań Q1-Q5 i chcesz wyświetlić tylko pytanie Q2, jeśli udzielono odpowiedzi na pytanie 1, i pytanie 3, jeśli udzielono odpowiedzi na pytanie 2 itd. Równania istotności mogą wyglądać następująco:
Kod pytania | Trafność | Pytanie |
---|---|---|
Q1 | 1 | Jak się nazywasz? |
Q2 | Q1 | {Q1}, ile masz lat? |
Q3 | Q2 | Więc masz {Q2} lat. Czy jesteś żonaty? |
Q4 | Q3 == "T" | {Q1}, jak długo jesteś żonaty? |
Q5 | Q4 | Ile masz dzieci, {Q1}? |
Obliczenia trafności działają również w JavaScript - możesz więc umieścić wszystkie powyższe pytania na jednej stronie i nadal będzie działać zgodnie z oczekiwaniami. W rzeczywistości EM całkowicie zastępuje sposób, w jaki EM przetwarza ankiety w formacie ankiety, grupy i ankiety zawierającej pytania na raz. Wszystkie korzystają teraz z dokładnie tego samego silnika nawigacyjnego, dzięki czemu działają identycznie niezależnie od stylu ankiety.
Dopóki jesteś na tej samej stronie, wszelkie wprowadzone dane będą tam nadal, tylko ukryte. Jeśli więc wprowadzisz jakieś informacje, następnie wybierzesz opcję, która sprawi, że będą one nieistotne, a następnie ponownie sprawisz, że będą istotne, Twoje odpowiedzi będą nadal dostępne. Jednak gdy tylko przejdziesz na inną stronę, wszystkie nieistotne odpowiedzi zostaną utracone i stracą integralność zbioru danych.
Trafność na poziomie grupy
Menedżer wyrażeń obsługuje także trafność na poziomie grupy. Ułatwia to implementację pętli. Załóżmy, że chcesz zebrać informacje o maksymalnie 10 podmiotach (takich jak produkty lub osoby w gospodarstwie domowym), gdzie najpierw określasz, ile podmiotów wymaga dalszych działań (na przykład poprzez zapytanie, ile osób mieszka w gospodarstwie domowym lub zlecanie ludziom sprawdzenia jakie produkty im się podobają z długiej listy). Po ustaleniu, ile podmiotów wymaga działań następczych, możesz zastosować trafność na poziomie grupy, np. {count >= 1}, {count >=2}, ... {count >= 10} dla każdej z 10 grup obserwacji zadać pytania. W każdej grupie można zastosować logikę warunkową na poziomie pytania (np. pytania uzupełniające dotyczące płci lub wieku dla każdego przedmiotu). Równania dotyczące pytania i istotności na poziomie grupy są poddawane operacji AND w celu ustalenia, które z nich powinny zostać pokazane.
Krawiectwo / Rurociągi
Wszystko w nawiasach klamrowych jest teraz traktowane jako wyrażenie (z jednym wyjątkiem opisanym poniżej). Wyrażenia mają dostęp do wszystkich pól LimeReplacementFields, wszystkich zmiennych (poprzez kilka aliasów), wszystkich typowych operatorów równań (matematycznych, logicznych i porównawczych) oraz dziesiątek funkcji (które działają nawet dynamicznie po stronie klienta).
Korzystając z tych równań, możesz wykonywać następujące czynności:
- Warunkowo wyświetlaj respondentom dostosowane wiadomości w oparciu o wcześniejsze odpowiedzi
- Twórz oceny i pokazuj wyniki oceny (lub warunkowo rozgałęziaj lub pokazuj wiadomości) w oparciu o te wyniki, wszystkie bez korzystania z samego modułu Oceny
- Odmieniaj czasowniki i rzeczowniki w pytaniach, odpowiedziach i raportach.
- Pokaż streszczenia odpowiedzi przed stroną „Pokaż swoje odpowiedzi” na końcu ankiety
Równania
Dostępny jest nowy typ pytań o nazwie Równanie. To jest jak pytania Boilerplate, z tą różnicą, że przechowuje wartość tego, co jest wyświetlane w bazie danych. Zatem, jeśli tekst pytania dotyczącego równania zawiera obliczenie oceny, wartość ta będzie przechowywana w bazie danych w postaci zmiennej, która może być wyświetlana w statystykach publicznych lub prywatnych.
Rozwiązuje to typowe żądanie przechowywania wyników oceny w bazie danych
Składnia
Wszystko, co jest zawarte w nawiasach klamrowych, jest teraz uważane za wyrażenie (z jednym wyjątkiem: nie może być żadnych początkowych ani końcowych białych znaków — jest to potrzebne, aby Menedżer wyrażeń nie próbował przetwarzać osadzonego kodu JavaScript).
Należy pamiętać, że wyrażenia mogą obejmować wiele linii, pod warunkiem że po otwierającym nawiasie klamrowym lub przed zamykającym nawiasem klamrowym nie ma białych znaków. Jest to szczególnie przydatne w przypadku zagnieżdżonych instrukcji if() takich jak ta:
{if(is_empty(PFTotals),
'',
if(PFTotals >= -5 && PFTotals <= -4,
'Bardzo miękkie',
if(PFTotals >= -3 && PFTotals <= -2,
'Miękkie',
if(PFTotals == -1,
'Nieco miękkie',
if(PFTotals == 0,
'Umiarkowane',! N! if(PFTotals == 1,
'Trochę trudne',
if(PFTotals >= 2 && PFTotals <= 3,
'Trudne',
if(PFTotals >= 4 && PFTtotals <= 5,
'Bardzo trudne',
''
)
)
)
)
)
)
)
)}
- Wszystkie standardowe operatory matematyczne (np. +,-,*,/,!)
- Wszystkie standardowe operatory porównania (np. <,<=,==,!=,>,>=, plus te odpowiedniki: lt,le,eq,ne,gt,ge)
- Nawiasy (abyś mógł grupować wyrażenia podrzędne)
- Operatory warunkowe (np. &&,| | i te odpowiedniki: i,or)
- Łańcuchy w pojedynczych i podwójnych cudzysłowach (w których można osadzać ciągi znaków z innym typem cudzysłowu)
- Operator przecinka (więc może mieć listę wyrażeń i po prostu zwracać wynik końcowy)
- Operator przypisania (=)!
- Predefiniowane zmienne (odnoszące się do pytań, atrybutów pytań i odpowiedzi) - np. wszystkie kody SGQA
- Predefiniowane funkcje (jest ich już ponad 70 i łatwo jest dodać więcej)
Operatorzy
Składnia EM jest zgodna z normalnym pierwszeństwem operatora:
Poziom | Operator(y) | Opis |
---|---|---|
1 | () | nawiasy do grupowania lub wywoływania funkcji |
2 | ! - + | operatory jednoargumentowe: nie, negacja, jednoargumentowy plus |
3 | * / | razy, dzielenie |
4 | + - | plus , minus |
5 | < <= > >= lt le gt ge | porównania względne |
6 | == != równanie ne | porównania równości |
7 | i | logiczne AND |
8 | lub | logiczne OR |
9 | = | przypisanie operator |
10 | , | operator przecinka |
Ostrzeżenie z operatorem plus (+)
Aby zapewnić spójność między JavaScriptem i PHP, operator plus (+) wykonuje dodawanie, jeśli oba operandy są numeryczne, ale dokonuje łączenia, jeśli obie części są ciągami nienumerycznymi. Jednakże „zalecamy używanie funkcji Join() do łączenia i funkcji sum() do dodawania”, ponieważ dzięki temu intencja będzie bardziej jasna i pozwoli uniknąć nieoczekiwanych wyników, jeśli spodziewałeś się ciągów, ale zamiast tego otrzymałeś liczby (lub odwrotnie odwrotnie).
Ostrzeżenie dotyczące niezgodności liczby i ciągu znaków oraz porównania alfabetycznego
Jeśli chcesz porównać wartość za pomocą porównań względnych lub równościowych, zwróć uwagę na niezgodność typów. Wartość wprowadzona przez użytkownika lub wybrany kod odpowiedzi może zostać użyta jako liczba, jeśli jest to wyraźnie liczba.
Jeśli otoczysz jedną z wartości znakiem "
, wymusi to porównanie w formie tekstowej (porównanie alfabetyczne). Jeśli chcesz porównać numerycznie, nigdy nie umieszczaj liczby w cudzysłowie, "
.
Na przykład Q0.NAOK > "50"
jest prawdą, jeśli Q0.NAOK jest pytaniem numerycznym z wartością 9. Dzieje się tak, ponieważ operator >
przyjmie, że jest to porównanie alfabetyczne, a nie numeryczne.
Aby mieć pewność porównania wartości całkowitej, możesz użyć intval(Q0.NAOK) > 50
, pamiętaj tylko, że jeśli Q0.NAOK nie jest liczbą (pustą lub ciągiem znaków), to intval(Q0. NAOK) === 0. Aby porównać wartość ciągu („A” < „B”), użyj bezpośrednio strcmp: strcmp(Q0.NAOK,"B")
lub strcmp(Q0.NAOK,"A5")
.
Uwaga dotycząca używania operatora przypisania (=)
Uwaga: powinieneś unikać używania operatorów przypisania, jeśli nie jest to absolutnie konieczne, ponieważ mogą one powodować nieoczekiwane skutki uboczne. Na przykład, jeśli zmienisz wartość poprzedniej odpowiedzi, kaskadowa trafność i logika walidacji między tym pytaniem a bieżącym pytaniem nie zostaną ponownie obliczone, więc możesz otrzymać wewnętrznie niespójne dane (np. pytania, na które nie udzielono odpowiedzi, ale powinny zostać ma wartość NULL lub pytania, które zostały pominięte, ale należało odpowiedzieć). Ogólnie rzecz biorąc, jeśli chcesz przypisać wartość zmiennej, powinieneś utworzyć pytanie typu Równanie i użyć wyrażenia, aby ustawić jego wartość. Jednak w rzadkich przypadkach ludzie naprawdę potrzebują tego operatora, dlatego udostępniliśmy go.
Aby ostrzec Cię przed tym operatorem, w równaniach składniowych jest on pokazany czerwoną czcionką (aby nie pomylić go z „==”)
Używanie operatora przypisania
Główne powody, dla których możesz chcieć użyć przypisania to:
- Musisz ustawić wartość domyślną dla pytania, które nie akceptuje wartości domyślnych za pomocą równania (takiego jak radio list, gdzie interfejs użytkownika pozwala wybrać jedną z opcji odpowiedzi, ale nie pozwala na wprowadzenie równania). Jednak bądź ostrożny, ponieważ LimeSurvey nie będzie w stanie sprawdzić, czy Twoje równanie generuje jedną z dopuszczalnych odpowiedzi na to pytanie.
- Musisz wymusić zmianę odpowiedzi na poprzednie pytanie w oparciu o późniejszą odpowiedź
- Potrzebujesz złożonego limitu: użyj jednego ukrytego pojedynczego wyboru dla limitu i ustaw go za pomocą przypisania
- itd...
Można w tym celu wykorzystać wszystkie systemy zarządzania wyrażeniami.
Oto przykład:
- Ustaw odpowiedź na pytanie z krótkim tekstem małymi literami:
{QCODE=strtolower(QCODE.NAOK)}
- Ustaw domyślną odpowiedź na pytanie typu tablicowego na początku ankiety:
{Q1_SQ1=((is_empty(Q1_SQ1.NAOK),"A99",Q1_SQ1.NAOK)}
- Ustaw domyślną odpowiedź na typ pytania w postaci tablicy tekstowej na początku ankiety:
{Q1_SQY1_SQX1 = ((is_empty(Q1_SQY1_SQX1.NAOK),"Inserted answer", Q1_SQY1_SQX1.NAOK)}
- Ustaw odpowiedź z warunkiem:
{QCODE=if(YesNo="Y","A1","")}
Bezpieczeństwo XSS
Po włączeniu XSS nie można używać niektórych systemów menedżera wyrażeń:
- rozpoczynający znacznik HTML w wyrażeniu, ale kończący się na innym wyrażeniu
- użyj wyrażenia złożonego w adresie URL.
Przykład i obejście
{if( 1 ,"","")}information{if( 1 ,"","")}
jest uszkodzona przez zabezpieczenia XSS, tutaj możesz użyć{if(1,"
<strong>information</strong>","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>
information","information")}{if(1,"
<a href="/script.php?value={if(QCODE == "Y","yes","no")}">next</a>
, here you can use an equation question because using a complete question code is OK :<a href="/script.php?value={EQUATION.NAOK}">next</a>
Dostęp do zmiennych
Menedżer wyrażeń zapewnia dostęp tylko do odczytu do dowolnych zmiennych, których możemy potrzebować. W celu zapewnienia kompatybilności wstecznej zapewnia dostęp do następujących informacji:
- TOKEN:xxx - wartość TOKENU (np. TOKEN:FIRSTNAME, TOKEN:ATTRIBUTE_5) (Tylko dla ankiety NIEanonimowej).
- INSERTANS:SGQA - wartość wyświetlana odpowiedzi (np. "Tak"). W przypadku Menedżera wyrażeń działa to tak samo, jak przy użyciu {QCODE.shown}.
- Wszystkie {XXX} wartości używane przez szablony.
- W pytaniu można zastąpić {QID} przez identyfikator pytania i {SGQ} zastąpione przez SGQA pytania
Ponadto Menedżer wyrażeń umożliwia odwoływanie się do zmiennych za pomocą kodu pytania (kolumna „tytuł” w tabeli pytań w bazie danych). Jest to również etykieta zmiennej używana podczas eksportowania danych do SPSS, R lub SAS. Na przykład, jeśli masz pytania dotyczące imienia, wieku i płci, możesz nazwać te zmienne „imięm”, „wiek” i „płeć” zamiast „12345X13X22”, „12345X13X23”. ' i 12345X13X24. Ułatwia to wszystkim czytanie równań i sprawdzanie ich logiki, a także umożliwia tasowanie pytań bez konieczności śledzenia numerów grup lub pytań.
Ważne: Bezpieczne jest odwoływanie się wyłącznie do zmiennych, które występują na poprzednich stronach lub w pytaniach.
Ponadto Menedżer wyrażeń umożliwia dostęp do wielu właściwości pytania:
Składnia | Znaczenie | Przykład | Przykład Wynik | ||||
---|---|---|---|---|---|---|---|
Qcode | alias dla Qcode.code | {implode(',',name,gender )} | 'Tom','M' | ||||
Qcode.code | wybrany kod odpowiedzi na pytanie, jeśli jest istotne (w przeciwnym razie puste) lub wartość tekstowa, jeśli nie jest to zakodowane pytanie | {implode(',',name.code,gender.code)} | 'Tom','M' | ||||
Qcode.NAOK | tak samo jak Qcode - zobacz dyskusję NAOK | {gender.NAOK} | 'M' | ||||
Qcode.value | wartość oceny dla pytania, jeśli jest istotne (w przeciwnym razie puste) lub wartość tekstowa, jeśli nie jest zakodowane pytanie | {gender.value} | '1' | ||||
Qcode.valueNAOK | tak samo jak Qcode.value - zobacz dyskusję o NAOK | {gender.valueNAOK} | '1 ' | ||||
Qcode.shown | wyświetlana wartość pytania | {implode(',',imię.pokazana,płeć.pokazana)} | - | Qcode.question | tekst pytania | {gender.question} | 'Jaka jest Twoja płeć?' |
Qcode.mandatory | czy pytanie jest obowiązkowe (T/N) | {gender.mandatory} | 'N' | ||||
Qcode.qid | wewnętrzny numer pytania (nie numer kolejny) | {gender.qid} | 337 | ||||
Qcode.type | typ pytania | {gender.type} | 'G' | ||||
Qcode.jsName | poprawna nazwa JavaScript na pytanie, niezależnie od tego, czy zadeklarowano je na tej stronie, czy poza nią | {gender.jsName} | 'java1827X3X337' | ||||
Qcode.gid | numer grupy wewnętrznej (nie numer kolejny) | {gender.gid} | 3 | ||||
Qcode.qseq | numer kolejny pytania, zaczynający się od 0 | {gender.qseq} | 5 | ||||
Qcode.gseq | numer kolejny grupy, zaczynając od 0 | {gender.gseq} | 1 | ||||
Qcode.relevanceStatus | czy pytanie jest aktualnie istotne (0 czy 1 ) | {gender.relevanceStatus} | 1 | ||||
Qcode.relevance | równanie trafności na poziomie pytania | {gender.relevance} | '!is_empty(name)' | ||||
Qcode.grelevance | równanie istotności na poziomie grupy | {gender.grelevance} | 'num_children >= 5' | ||||
Qcode.sgqa | wartość SGQA dla to pytanie | {gender.sgqa} | '1827X3X337' |
Problem z edytorem HTML
Jeśli używasz edytora HTML, niektóre znaki są zastępowane przez elementy HTML.
- & przez &
- < przez <
- > przez >
Jeśli używasz edytora HTML, musisz użyć :
- i for &
- lt for <
- le for <=
- gt for >
- ge dla >=
Nazewnictwo zmiennych Qcode
Oto szczegóły dotyczące tworzenia Qcode (i uzyskiwania dostępu do niektórych właściwości) według typu pytania. Ogólnie rzecz biorąc, kody Q są zbudowane jako:
Kod pytania. „_” . Identyfikator podpytania . „_” . Identyfikator skali
W przypadku „komentarza” i „innego” kody pytań to „QuestionCode_comment” i „QuestionCode_other”
Typ | Opis | Kod | SubQs | Opcje odpowiedzi | Skale | Kod odpowiedzi | Wyświetlona odpowiedź | Trafność |
---|---|---|---|---|---|---|---|---|
5 | 5 Przyciski opcji wyboru punktu | Q1 | 1-5 | {Q1} | {Q1.pokazane} | {Q1==3} | ||
B | Tablica (wybór 10 punktów) Przyciski opcji | Q2 | |1-10 | {Q2_L2} | {Q2_L2.pokazane} | {Q2_L2==7} | ||
A | Przyciski opcji Tablica (wybór 5 punktów) | Q3 | |1-5 | {Q3_1} | {Q3_1.pokazane} | {Q3_1>=3} | ||
1 | Tablica (Elastyczne etykiety) Podwójna skala | Q4 | sq1-sq5 | 0 :a1-a3 | 1:b1-b3 | {Q4_sq1_0} | {Q4_sq1_1.pokazane} | {Q4_sq1_1=='b2'} |
H | Tablica (elastyczna) - Format kolumny | Q5 | 1-5 | s,m,t | {Q5_1} | {Q5_1.pokazane} | {Q5_1=='} | |
F | Tablica (elastyczna) - format wierszy | Q6 | |1-5 | {Q6_F3} | {Q6_F3.pokazane} | {Q6_F3==4} | ||
E | Tablica (Zwiększ/Tak samo/Zmniejsz) Przyciski opcji | Q7 | 1- 7 | I,S,D | {Q7_4} | {Q7_4.pokazane} | {Q7_4=='D'} | |
: | Tablica (Multi Flexi) 1 do 10 | Q8 | ls1,do zrobienia ,ls2 | min,maks.,średnia | {Q8_ls1_max} | {Q8_ls2_avg.show} | {Q8_ls2_min==7} | |
; | Tablica (Multi Flexi) Tekst | Q9 | hp,st,sw | 1., 2., 3. | {Q9_hp_3rd} | {Q9_hp_3rd.pokazane} | {Q9_hp_3rd=='Peter'} | |
C | Tablica (Tak/Niepewne/Nie) Przyciski opcji | Q10 | 1-5 | T,N,U | {Q10_1} | {Q10_1.pokazane} | {Q10_3=='Y'} | |
X | Pytanie standardowe | Q11 | {Pokazane Q11} | |||||
D | Data | Q12 | {Q12} | {Q12.pokazane} | ||||
* | Równanie | Q13 | {Q13} | {Q13.pokazane} | {Q13>5} | |||
~124~ | Przesłanie pliku (rejestruje liczbę przesłanych plików) | Q14 | {Q14} | {Q14>0} | ||||
G | Lista rozwijana płci | Q15 | M,F | {Q15} | {Q15.pokazany} | {Q15=='M'} | ||
U | Duży dowolny tekst | Q16 | {Q16} | {Q16.pokazane} | {strlen(Q16)>100} | |||
I | Pytanie dotyczące języka | Q17 | {Q17} | {Q17.pokazane} | {Q17=='en'} | |||
! | Lista - menu rozwijane | Q18 | 1-5 | {Q18} | {Q18.pokazane} | {Q18==3} | ||
L | Lista rozwijana/lista przycisków radiowych | Q19 | AZ | {Q19} | {Q19.show} | {Q19=='X'} | ||
O | Lista z rozwijanym menu komentarzy/listą przycisków radiowych + obszar tekstowy | Q20 | AF | {Q20},{Q20comment} | {Q20.pokazane} | {Q20=='B'} | ||
T | Długi tekst dowolny | Q21 | {Q21} | {Q21.pokazane} | {strstr(Q21,'witaj')>0} | |||
M | Pole wyboru wielokrotnego wyboru | Q22 | | | {Q22_E}, {Q22_other} | {Q22_E.pokazane}, {Q22_other.pokazane} | {Q22_E=='Y'} | ||
P | Wielokrotny wybór z komentarzami Pole wyboru + Tekst | Q23 | AF | {Q23_D}, {Q23_Dcomment} | {Q23_D.pokazane} | {!is_empty(Q23)} | ||
K | Pytanie z wieloma liczbami | Q24 | ja, mama, tata | {Q24_self} | {Q24_self.show} | {Q24_self>30} | ||
Q | Kilka krótkich tekstów | Q25 | AF | {Q25_B} | {Q25_B.pokazane} | {substr(Q25_B,1,1)=='Q'} | ||
N | Numeryczny typ pytania | Q26 | {Q26} | {Q26.pokazane} | {Q26 > 30} | |||
R | Styl rankingu | Q27 | 1-4 | {Q27_1} | {Q27_1.pokazane} | {Q27_1==3} | ||
S | Krótki tekst dowolny | Q28 | {Q28} | {Q28.pokazane} | {Q28=='moje'} | |||
T | Przyciski opcji Tak/Nie | Q29 | {Q29} | {Q29.pokazane} | {Q29=='T'} |
Zarezerwowane zmienne „to”, „ja” i „tamto”
Dość często chcesz ocenić wszystkie części pytania, na przykład policzyć, na ile pytań podrzędnych udzielono odpowiedzi lub zsumować wyniki. Innym razem chcesz przetworzyć tylko określone wiersze lub kolumny pytania (np. uzyskać sumy wierszy lub kolumn i zapisać je w bazie danych). Te zarezerwowane zmienne sprawiają, że proces ten jest stosunkowo bezbolesny.
Zmienna „to” jest używana wyłącznie w zaawansowanych opcjach pytań „Równanie sprawdzania poprawności całego pytania” i „Równanie sprawdzania poprawności pytania podrzędnego”. Rozwija się do nazw zmiennych każdej komórki w tych pytaniach. Jeśli więc chcesz mieć pewność, że każdy wpis jest większy niż trzy, ustaw „Równanie sprawdzające podpytanie” na (to > 3).
Zmienne „ja” i „tamto” mają większą moc i służą jako makra, które są rozwijane przed przetwarzaniem równań. Dostępne składnie to:
- self
- self.sufiks
- self.podselektor
- self.podselektor. przyrostek
„sufiks” to dowolny z normalnych przyrostków qcode (np. NAOK, wartość, pokazana)
podselektor to jedno z:
- komentarze - tylko pytania podrzędne, które są komentarzami (np. z listy wielokrotnego wyboru z komentarzem i listy z komentarzem)
- nokomentarze - tylko pytania podrzędne, które nie są komentarzami
*sq_X - gdzie X jest identyfikatorem wiersza lub kolumny. Wybierane są tylko pytania podrzędne pasujące do wzorca X. Zauważ, że wyszukiwanie odbywa się na podstawie pełnego identyfikatora kodu, następnie sq_X dopasowuje i uwzględnia podpytania nX, X, Xn (np. jeśli używasz sq_1, uwzględniono podpytania a1, 1a, 1, 11 lub 001). Zwróć uwagę na typ pytania o podwójnej skali, gdzie kody pytań podrzędnych to QCODE_SQCODE_1 i QCODE_SQCODE_1 oraz na typ pytania rankingowego, gdzie kody pytań podrzędnych to QCODE_1,QCODE_2 ....
- nosq_X - gdzie X jest identyfikatorem wiersza lub kolumny. Wybierane są tylko pytania podrzędne, które nie pasują do wzorca X. Należy pamiętać, że wyszukiwanie odbywa się na podstawie pełnego identyfikatora kodu, a następnie dopasowania nosq_X i nie obejmuje pytań podrzędnych nX, X, Xn
Przykłady:
- Czy udzielono odpowiedzi na jakąkolwiek część pytania? {count(self.NAOK)>0}
- Jaki jest wynik oceny tego pytania? {suma(wartość własna)}
Można ich także użyć do uzyskania sumy wierszy i kolumn. Załóżmy, że masz tablicę liczb z wierszami AE i kolumnami 1–5.
- Jaka jest suma całkowita? {sum(self.NAOK)}
- Jaka jest suma wiersza B? {sum(self.sq_B.NAOK)}
- Jaka jest suma kolumny 3? {suma(self.sq_3.NAOK)}
Zmienna „to” działa jak zmienna „ja”, ale umożliwia odniesienie się do innych pytań. Jego składnia jest następująca:
- to.qnazwa
- tam.qnazwa.przyrostek
- to.qnazwa.podselektor' '
- to.qname.podselektor.sufiks
„qname” to nazwa pytania bez żadnych rozszerzeń podpytań. Załóżmy, że tworzysz pytanie „q1”, czyli jego „qname”
Przykłady:
- Czy udzielono odpowiedzi na jakąkolwiek część pytania q1? {count(that.q1.NAOK)>0}
- Jaki jest wynik oceny za drugi kwartał? {sum(that.q2.NAOK)}
- Jaka jest całkowita suma q3? {sum(that.q3.NAOK)}
- Jaka jest suma wiersza C w q4? {sum(that.q4.sq_C.NAOK)}
- Jaka jest suma kolumny 2 w q4? {suma(to.q4.sq_2.NAOK)}
Zmienne „ja” i „to” można wykorzystać w dowolnym kontekście, walidacji lub dostosowaniu.
Jedynym zastrzeżeniem jest to, że gdy użyjesz funkcji Pokaż plik logiczny, wyświetli się rozszerzona wartość „ja” i „tamto”. Dzięki temu zobaczysz rzeczywiste równanie, które zostanie wygenerowane, dzięki czemu Ty (i Menedżer wyrażeń) będziecie mogli sprawdzić, czy zmienne istnieją. Może się to wydawać mylące, ponieważ możesz zobaczyć dość długie równania. Jeśli jednak edytujesz pytanie, zobaczysz oryginalne równanie zawierające „ja” i/lub „to”
Pamiętaj również, że nie powinieneś używać tych zmiennych, jeśli (a) chcesz jawnie nazwać każdą zmienną używaną w równaniu lub (b) używasz zmiennych, które nie mają pytań podrzędnych (np. pytania z pojedynczą odpowiedzią). W takich przypadkach poprzedzanie zmiennej słowem „that” jest przesadą i wiąże się z ryzykiem uzyskania nieoczekiwanych wyników.
Użycie NAOK
NAOK --> „Nie dotyczy” (NA) jest w porządku (OK)
Użycie NAOK oznacza, że wszystkie lub niektóre zmienne są nieistotne (np. „Nie dotyczy” (NA) jest w porządku (OK)).
Kiedy wstawisz jakąś zmienną z pytania do dowolnego równania: jeśli to pytanie (lub pytanie podrzędne) jest ukryte pod warunkiem: powoduje to wyłączenie wszystkich równań.
Na przykład: count(Q1_SQ1,Q1_SQ2,Q1_SQ3,Q1_SQ4) podaj zawsze pusty ciąg znaków, jeśli filtrowane jest jedno pytanie podrzędne Q1. Aby policzyć liczbę sprawdzanych podpytań w takim pytaniu można liczyć(Q1_SQ1.NAOK,Q1_SQ2.NAOK ,Q1_SQ3.NAOK,Q1_SQ4.NAOK). Jeśli pytanie podrzędne jest ukryte: Menedżer wyrażeń zwraca pusty ciąg.
Bez NAOK: jeśli jedno pytanie lub jedno pytanie podrzędne jest ukryte: Menedżer wyrażeń zwraca zawsze pusty ciąg znaków, to samo zwraca fałsz.
.pokazane zawsze używają systemu NAOK (pusty ciąg znaków, jeśli jest ukryty), ale jeśli potrzebujesz kodu odpowiedzi: zawsze dobrym pomysłem jest dodanie .NAOK po kodzie pytania. Chyba, że tego potrzebujesz i wiesz, co robisz.
Inny przykład i informacje można znaleźć w Przesłanianie warunków kaskadowych
Dostęp do funkcji
Menedżer wyrażeń zapewnia dostęp do funkcji matematycznych, łańcuchowych i zdefiniowanych przez użytkownika, jak pokazano poniżej. Posiada odpowiedniki tych funkcji w PHP i JavaScript, dzięki czemu działają identycznie po stronie serwera (PHP) i po stronie klienta (JavaScript). Dodawanie nowych funkcji jest łatwe.
Zaimplementowane funkcje
Aktualnie dostępne są następujące funkcje:
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) |
Funkcje planowane lub rozważane
Inne funkcje, które są planowane (lub rozważane), ale które nie zostały jeszcze wdrożone, obejmują: Niektóre z nich zapewniają kompatybilność wsteczną z innym narzędziem ankietowym.
Składnia | Znaczenie | Komentarze | ||||
---|---|---|---|---|---|---|
e() | zwraca wartość e | |||||
formatDate(X, PAT) | zwróć wartość ciągu daty X sformatowaną zgodnie ze wzorcem formatu danych Java PAT | |||||
formatNumber(X,PAT) | zwróć wartość ciągu liczby X sformatowaną zgodnie z numerem Java wzorzec formatu PAT | |||||
getAnsOption(X) | Wtyczka podstawowa ExpressionAnswerOptions | |||||
getAnsOption(X,Y) | Wtyczka podstawowa ExpressionAnswerOptions | |||||
getRelevance(X) | zwraca równanie istotności dla pytania X | |||||
getStartTime() | zwraca data odpowiadająca czasowi systemowemu rozpoczęcia wywiadu | |||||
getType(X) | zwraca nazwę typu danych typu string - np. *NA* jeśli isNA() | |||||
gotoFirst() | przeskakuje do pierwszego odpowiedniego zestawu pytań - narusza to normalny przepływ systemu | |||||
gotoNext() | przeskakuje do następnego zestawu pytań odpowiednie pytania - narusza to normalny przepływ systemu | |||||
gotoPrevious() | przechodzi do poprzedniego zestawu odpowiednich pytań - narusza to normalny przepływ systemu | - | isAsked(X) | zwraca wartość true, jeśli odpowiedź nie brzmi ani *NA*, *INVALID*, ani *UNASKED* | ||
isInvalid(X) | zwraca wartość true, jeśli odpowiedź jest typu *INVALID* | |||||
isNA(X) | zwraca wartość true, jeśli odpowiedź jest typu *NA* | |||||
isNotUnderstood(X ) | zwraca wartość true, jeśli odpowiedź jest typu *HUH* | |||||
isRefused(X) | zwraca wartość true, jeśli odpowiedź jest typu *REFUSED* | |||||
jumpTo(X) | skok do grupy zawierającej nazwane pytanie -- narusza to normalne przepływ systemu | |||||
jumpToFirstUnasked() | przeskocz do pierwszego niezadanego pytania |
|||||
lastIndexOf(X,Y) | zwraca ostatni indeks (podstawa 0) łańcucha Y w ciągu X. Zwraca -1, jeśli Y nie jest zawarte w X | |||||
list(X,.. .) | ciąg zawierający rozdzieloną przecinkami listę wartości dodatnich z "i" oddzielającymi dwie ostatnie | |||||
mean(X,...) | zwraca średnią z listy wartości | |||||
numAnsOptions(X) | zwraca liczbę opcji odpowiedzi, jakie ma pytanie X | |||||
orlist(X,...) | ciąg znaków zawierający listę wartości dodatnich oddzielonych przecinkami, z „lub” oddzielającym dwie ostatnie | |||||
parseDate(X,PAT) | zwraca wartość daty ciągu X przeanalizowanego z datą Java wzorzec formatu PAT | |||||
parseNumber(X,PAT) | zwraca wartość liczbową łańcucha X przeanalizowanego przy użyciu wzorca formatu liczb Java PAT | |||||
showAllResponsesExcept( questionList ,attributeList,attributeTitleList) | questionList = lista identyfikatorów pytań rozdzielana pionową kreską; atrybutList = lista atrybutów rozdzielana pionową kreską (np. numer pytania, tytuł, tekst, typ — możesz zdecydować, co wyświetlić); atrybutTitleList = lista nagłówków tabeli rozdzielana pionową rurką, dzięki czemu można umiędzynarodowić raport. | |||||
showTheseResponses( questionList,attributeList,attributeTitleList) | questionList = rozdzielana pionową rurką lista identyfikatorów pytań; atrybutList = lista atrybutów rozdzielana pionową kreską (np. numer pytania, tytuł, tekst, typ — możesz zdecydować, co wyświetlić); atrybutTitleList = lista nagłówków tabel rozdzielana pionową kreską, co umożliwia umiędzynarodowienie raportu. |
Menedżer wyrażeń wie, które zmienne są lokalne
Aby poprawnie zbudować JavaScript dla strony, Menedżer wyrażeń musi wiedzieć, jakie zmienne są ustawione na stronie i jaki jest ich identyfikator JavaScript (np. dla document.getElementById(x)). Musi także wiedzieć, które zmienne są ustawione na innych stronach (aby mieć pewność, że potrzebne<input type='hidden' value='x'> pola są obecne i wypełnione).
Warunki kaskadowe
Jeśli którakolwiek ze zmiennych będzie nieistotna, całe równanie będzie nieistotne (fałszywe). Na przykład w poniższej tabeli „nie dotyczy” oznacza, że jedna ze zmiennych nie była istotna
Operator | Przykład | a | b | Wynik | |||||
---|---|---|---|---|---|---|---|---|---|
+ (jednoargumentowy) | +a | Nie dotyczy | fałsz | ||||||
! | !a | nie dotyczy | false | ||||||
== (lub równ.) | a == b | N/A | 5 | false | |||||
== (lub równ.) | a == b | Nie dotyczy | 0 | fałsz | |||||
== (lub równoważnik) | a == b | Nie dotyczy | Nie dotyczy | fałsz | |||||
!= (lub ne) | a != b | nie dotyczy | 5 | fałsz | |||||
!= (lub ne) | a != b | nie dotyczy | nie dotyczy | false | |||||
!= (lub ne) | a != b | N/A | 0 | false | |||||
> (lub gt) | a > b | nie dotyczy | 5 | fałsz | |||||
>= (lub ge) | a >= b | N/A | 5 | false | |||||
< (lub lt) | a < b | Nie dotyczy | 5 | fałsz | |||||
<= (lub le) | a <= b | nie dotyczy | 5 | fałsz | |||||
i | a i b | N/A | 5 | fałsz | |||||
i | a i b | nie dotyczy | nie dotyczy | - | lub | a lub b | Nie dotyczy | Nie dotyczy | fałsz |
lub | a lub b | Nie dotyczy | 5 | fałsz | |||||
+ | a + b | Nie dotyczy | 5 | fałsz | |||||
* | a * b | nie dotyczy | 5 | fałsz | |||||
/ | a / b | 5 | nie dotyczy | fałsz | |||||
(exp) | (a && b) | N/A | 5 | false | |||||
|(b + b) > (a && b) | Nie dotyczy | 5 | fałsz | ||||||
funkcja | suma(a,b,b) | nie dotyczy | 5 | fałsz | |||||
funkcja | max(a,b) | nie dotyczy | 5 | fałsz | |||||
funkcja | min(a,b ) | nie dotyczy | 5 | fałsz | |||||
funkcja | implode(', ',a,b,a,b) | nie dotyczy | 5 | - | funkcja | if(a,a,b) | N/A | 5 | false |
funkcja | jest_pusty(a) | N/ A | false | ||||||
funkcja | is_empty(a) | 0 (lub puste) | true | ||||||
funkcja | !is_empty(a) | nie dotyczy | fałsz |
Zastępowanie warunków kaskadowych
Załóżmy, że chcesz wyświetlić sumę wszystkich odpowiednich odpowiedzi. Możesz spróbować użyć równania {suma(q1,q2,q3,...,qN)}. Jednak jest to tłumaczone wewnętrznie na LEMif(LEManyNA('q1','q2','q3',...,'qN'),,sum(LEMval('q1'),LEMval('q2') ,LEMval('q3'),...,LEMval('qN'))). Zatem jeśli którakolwiek z wartości q1-qN jest nieistotna, równanie zawsze zwróci wartość false. W tym przypadku sum() będzie pokazywać 0, dopóki nie zostaną udzielone odpowiedzi na wszystkie pytania.
Aby obejść ten problem, do każdej zmiennej można dodać przyrostek „.NAOK” (co oznacza, że „Nie dotyczy” jest OK). W takich przypadkach ma miejsce następujące zachowanie. Załóżmy, że masz zmienną q1.NAOK
- q1 nie została dodana do klauzuli LEManyNA()
- LEMval('q1') będzie kontynuować sprawdzanie, czy odpowiedź jest istotna i zwróci „” jeśli tak nie jest (w związku z tym pojedyncze, nieistotne odpowiedzi zostaną zignorowane, ale nie unieważnią całego wyrażenia).
Zatem rozwiązaniem bieżącego problemu całkowitego jest użycie sumy równań (q1.NAOK,q2.NAOK,q3.NAOK,...,qN.NAOK).
Użycie przyrostka .NAOK pozwala także autorom projektować ankiety, które mają kilka możliwych ścieżek, ale później zbiegają się wspólnymi ścieżkami. Załóżmy na przykład, że badani odpowiadają na ankietę w sposób wykraczający poza normalny zakres odpowiedzi. Autor może ostrzec osoby badane, że wyniki mogą nie być prawidłowe, i zapytać, czy na pewno chcą kontynuować badanie. Jeśli odpowiedzą „Tak”, zostaną wyświetlone pozostałe pytania. Warunek dotyczący „pozostałych pytań” sprawdzałby, czy odpowiedzi na początkowe odpowiedzi mieściły się w normalnym zakresie LUB czy osoba badana odpowiedziała „tak” na pytanie, które jest istotne tylko wtedy, gdy odpowiedziała poza normalnym zakresem.
W jaki sposób Menedżer wyrażeń obsługuje warunkowe mikro-szycie?
Oto przykład mikrokrawiectwa (gdzie typ pytania=='wyrażenie' oznacza równanie):
Kod pytania | Trafność | Typ pytania | Pytanie |
---|---|---|---|
imie | 1 | tekst | Jak się nazywasz? |
badage | !is_empty(wiek) | expr | {(wiek<16) lub (wiek>80 )} |
agestop | badage | message | Przykro mi, {name}, ty też jesteś {if( (wiek<16),'młody',if( (wiek>80), „stary”, „w średnim wieku”) ) } do tego testu. |
dzieci | !badage | tak | Czy masz dzieci? |
rodzice | 1 | expr | {!badage && kids=='Y'} |
numKids | rodzice | text | Ile masz dzieci? |
kid2 | parents && numKids >= 2 | text | Ile lat ma Twoje pierwsze dziecko Twoje drugie dziecko? |
kid3 | parents && numKids >= 3 | text | Ile lat ma Twoje trzecie dziecko? |
kid4 | parents && numKids > = 4 | text | Ile lat ma Twoje czwarte dziecko? |
kid5 | rodzice && numKids >= 5 | text | Ile lat ma Twoje piąte dziecko? |
raport | |taknie | {name}, powiedziałeś, że masz {wiek} i że masz {numKids}. Suma wieku Twoich pierwszych {min(numKids,5)} dzieci wynosi {sumage} |
Wszystkie te pytania mogą znajdować się na jednej stronie (np. w tej samej grupie) i zostaną wyświetlone tylko istotne pytania. Co więcej, gdy podasz wiek dzieci, wyrażenie sum() w ostatnim pytaniu będzie dynamicznie aktualizowane na stronie.
<html>Menedżer wyrażeń zapewnia tę funkcjonalność, otaczając każde wyrażenie nazwaną element. Za każdym razem, gdy wartość się zmienia, ponownie oblicza wyrażenie, które powinno się w niej pojawić element i regeneruje wyświetlacz. Możesz mieć dziesiątki, a nawet setki takich dostosowanych wyrażeń na tej samej stronie, a strona wyświetli je ponownie podczas jednego odświeżenia ekranu.
Mapowanie LimeSurvey 1.91+ na funkcjonalność Expression Manager
Stara funkcja | Nowa funkcja | Komentarze | |||
---|---|---|---|---|---|
Warunki | Trafność | - | Oceny | Równanie | Każde wyniki oceny można przekształcić w równanie. Zapewnia to zarówno zapisanie wyniku w bazie danych, jak i pozwala zobaczyć dynamiczne zmiany wartości wyniku na bieżącej stronie |
Zastąpienia | Menedżer wyrażeń | Główny silnik pobiera ciąg wejściowy i traktuje wszystko w nawiasach klamrowych jako wyrażenie, więc obsługuje wszystkie historyczne typy zamian. Aby uniknąć zepsucia osadzonego kodu JavaScript, Menedżer wyrażeń przetwarza zawartość między nawiasami klamrowymi tylko pod warunkiem, że (a) w nawiasach klamrowych nie ma początkowych ani końcowych białych znaków - np. {wyrażenie} jest wyrażeniem, ale { wyrażenie}, {wyrażenie }, i { wyrażenie } nie są wyrażeniami. Co więcej, Menedżer wyrażeń nie przetwarza treści w obrębie własnych ciągów znaków (np. {list('cześć','there {braces}')} generuje „cześć {braces}”). Ignoruje także nawiasy klamrowe ze zmianą znaczenia (np. \{to nie jest wyrażenie\}) | |||
Walidacja | Menedżer wyrażeń | Plan jest taki, aby wziąć bieżące min/max atrybutów pytania i mieć Menedżera wyrażeń je przetwarzać. W ten sposób wartości min/max mogą same w sobie być wyrażeniami |
Podświetlanie składni
Aby ułatwić wprowadzanie i sprawdzanie wyrażeń, EM udostępnia podświetlanie składni za pomocą następujących funkcji:
Typy i znaczenie podświetlania składni
Kolor | Próbka | Znaczenie | Podpowiedź | Komentarze |
---|---|---|---|---|
brązowe tło | Próbka | the całe równanie | brak | Wszystko w nawiasach klamrowych, które jest rozpoznawane jako równanie (np. nie ma odstępu na początku ani na końcu) zostanie oznaczone kolorem z brązowym tłem, aby ułatwić odróżnienie tego od otaczającego tekstu |
niebieski tekst | Przykład | nazwa funkcji | znaczenie i dopuszczalna składnia | nazwy funkcji lub rzeczy, które powinny być funkcjami, ponieważ następuje po nich nawias otwierający, są przedstawione pogrubioną niebieską czcionką. Etykietki narzędzi pokazują znaczenie i dopuszczalną składnię funkcji. |
szary tekst | Próbka | string | brak | ciągi z pojedynczym i podwójnym cudzysłowem są wyświetlane w kolorze szarym |
cyjan tekst | Przykładowy | zestaw zmiennych na tej samej stronie, | [ imię i nazwisko lub kod SGQA]: pytanie; wartość; lista odpowiedzi pokazująca kody dla każdej wartości | Każda zmienna ustawiona na tej samej stronie dla bieżącego pytania jest wyświetlana w kolorze cyjan, co pokazuje, że można ją zaktualizować w javascript. Podpowiedź pokazuje jego nazwę (jeśli użyłeś INSERTANS:xxx) lub kod SGQA (jeśli użyłeś nowego systemu nazewnictwa), aktualne pytanie i jego aktualną wartość (lub pustą, jeśli nie ustawiono). Jeśli typ pytania oczekuje odpowiedzi z wyliczeniowego zestawu wartości, wyświetlane jest mapowanie kodów na wyświetlane wartości. |
zielony tekst | Przykładowy | zestaw zmiennych na poprzedniej stronie | [ imię i nazwisko lub kod SGQA]: pytanie; wartość; lista odpowiedzi pokazująca kody dla każdej wartości | Każda zmienna ustawiona na poprzedniej stronie jest wyświetlona pogrubionym zielonym tekstem. Podpowiedź pokazuje jego nazwę (jeśli użyłeś INSERTANS:xxx) lub kod SGQA (jeśli użyłeś nowego systemu nazewnictwa), aktualne pytanie i jego aktualną wartość (lub pustą, jeśli nie ustawiono). Jeśli typ pytania oczekuje odpowiedzi z wyliczeniowego zestawu wartości, wyświetlane jest mapowanie kodów na wyświetlane wartości. |
pogrubiony różowy tekst | Przykład | ustawienie zmiennych ogólnie na dalszej stronie: puste na początku ankiety, ale można je wypełnić indeksem lub przenieść poprzednio | [ imię i nazwisko lub kod SGQA]: pytanie; wartość; lista odpowiedzi pokazująca kody dla każdej wartości | Każda zmienna ustawiona na następnej stronie jest oznaczona pogrubionym różowym tekstem. Podpowiedź pokazuje jego nazwę (jeśli użyłeś INSERTANS:xxx) lub kod SGQA (jeśli użyłeś nowego systemu nazewnictwa), aktualne pytanie i jego aktualną wartość (lub pustą, jeśli nie ustawiono). Jeśli typ pytania oczekuje odpowiedzi z wyliczeniowego zestawu wartości, wyświetlane jest mapowanie kodów na wyświetlane wartości. |
pogrubiony jasnobrązowy tekst | Próbka | wartość zastępująca limonkę | wartość | Ciągi zastępujące limonkę (takie jak {TOKEN:xxx}, {PRIVACY_MESSAGE}) są wyświetlane pogrubioną, brązową czcionką. |
czerwony tekst | Przykład | operator przypisania (=) | komunikat ostrzegawczy | Jeśli użyjesz jednego z operatorów przypisania (=), operator ten zostanie wyświetlony w kolorze czerwonym. Ma to na celu zapobieganie przypadkowemu ponownemu przypisaniu wartości, gdy naprawdę chcesz sprawdzić, czy a == b zamiast ustawiać wartość a = b. |
zwykły czarny tekst | Próbka | interpunkcja | brak | Wszystkie inne znaki interpunkcyjne w wyrażeniu są wyświetlane jako zwykły czarny tekst. |
tekst w czerwonej ramce | pogrubiona czerwona linia otacza błąd | błąd składni | opis błędu | Wszelkie wykryte błędy składniowe są wyświetlane poprzez otoczenie błędu czerwoną ramką. Etykietka narzędzia pokazuje błąd. Przykładami mogą być niedopasowane nawiasy, użycie niezdefiniowanych funkcji, przekazywanie niewłaściwej liczby argumentów do funkcji, źle skonstruowane wyrażenia (np. brakujące operatory pomiędzy zmiennymi), próby przypisania nowej wartości do zmiennej tylko do odczytu, próby przypisania wartości do nie- zmiennych lub przy użyciu nieobsługiwanej składni. Należy pamiętać, że system wykrywania błędów składniowych może zgłosić tylko jeden błąd w wyrażeniu, nawet jeśli błędów jest wiele; jeśli jednak zostaną wykryte jakiekolwiek błędy, zostanie wyświetlony co najmniej jeden błąd. |