Expression Manager
From LimeSurvey Manual
त्वरित शुरुआत ट्यूटोरियल
अवलोकन
अपने सर्वेक्षण को कस्टमाइज़ करते समय आपको आमतौर पर निम्नलिखित को निर्दिष्ट करने का तरीका चाहिए होता है:
- नेविगेशन/ब्रांचिंग - किसी प्रतिभागी के उत्तरों के आधार पर प्रश्न पूछे जाने का क्रम बदलना
- टेलरिंग/पाइपिंग - प्रश्न को किस तरह प्रस्तुत करना है (जैसे पिछले उत्तरों का उल्लेख करना, या आपके प्रतिभागियों की संख्या या लिंग के आधार पर वाक्यों को बदलना), या कस्टम रिपोर्ट कैसे बनानी हैं (जैसे मूल्यांकन स्कोर या अनुकूलित सलाह)।
- सत्यापन - यह सुनिश्चित करना कि उत्तर कुछ मानदंडों को पूरा करते हैं, जैसे न्यूनतम और अधिकतम मान, या किसी इनपुट पैटर्न से मेल खाना
Expression Manager (EM) इन सभी सुविधाओं के लिए लॉजिक निर्दिष्ट करने का एक सहज तरीका प्रदान करता है। लगभग कोई भी चीज़ जिसे आप मानक गणितीय समीकरण के रूप में लिख सकते हैं, एक मान्य एक्सप्रेशन है, भले ही आप फ़ंक्शन कॉल कर रहे हों। EM फ़िलहाल 80 फ़ंक्शन उपलब्ध कराता है, और अधिक फ़ंक्शन का समर्थन जोड़ना आसान है। यह आपको मानव-पठनीय वेरिएबल नामों (SGQA नामों के बजाय) का उपयोग करके अपने वेरिएबल तक पहुँचने की सुविधा भी देता है।
निम्नलिखित अनुभाग वे मुख्य स्थान दिखाते हैं जहाँ Expression Manager का उपयोग किया जाता है
प्रासंगिकता (नेविगेशन/ब्रांचिंग को नियंत्रित करना)
कुछ सर्वेक्षण "Goto Logic" का उपयोग करते हैं, जैसे यदि आप प्रश्न 1 का उत्तर विकल्प C से देते हैं, तो प्रश्न 5 पर जाएँ। यह तरीका बहुत सीमित है, क्योंकि इसे सत्यापित करना कठिन है, और प्रश्नों का क्रम बदलने पर यह आसानी से टूट जाता है। EM उन सभी शर्तों को निर्दिष्ट करने के लिए बूलियन प्रासंगिकता समीकरण का उपयोग करता है जिनके तहत कोई प्रश्न मान्य हो सकता है। यदि प्रश्न प्रासंगिक है, तो प्रश्न दिखाया जाता है, अन्यथा वह लागू नहीं (Not Applicable) होता है, और डेटाबेस में NULL मान संग्रहीत किया जाता है। यह वैसा ही है जैसा Conditions editor के माध्यम से किया जा सकता है, लेकिन EM आपको कहीं अधिक जटिल और शक्तिशाली मानदंड आसानी से निर्दिष्ट करने देता है (और SGQA नामकरण के बजाय वेरिएबल नाम का उपयोग करने देता है)।
यह छवि किसी सर्वेक्षण के प्रासंगिकता लॉजिक की समीक्षा करने का एक तरीका दिखाती है। यह बॉडी मास इंडेक्स की गणना करता है। प्रासंगिकता समीकरण वेरिएबल नाम (जो हरे रंग में है) के ठीक बाद वर्गाकार कोष्ठक में दिखाया गया है। इसलिए weight, weight_units, height और height_units की प्रासंगिकता सभी 1 है, जिसका अर्थ है कि ये प्रश्न हमेशा पूछे जाते हैं। हालाँकि, BMI की प्रासंगिकता {!is_empty(height) and !is_empty(weight)} है, जिसका अर्थ है कि BMI की गणना तभी होगी जब प्रतिभागी height और weight दोनों के लिए मान दर्ज करेगा (जिससे शून्य से भाग की त्रुटि का जोखिम टल जाता है)। साथ ही, Report प्रश्न तभी दिखाया जाता है जब प्रतिभागी सभी चार मुख्य प्रश्नों (height, height_units, weight, weight_units) का उत्तर देता है।
प्रासंगिकता निम्नलिखित स्थानों पर दिखाई जाती है और संपादित की जा सकती है:
प्रश्न-स्तर की प्रासंगिकता देखना / एडिट करना
यह समीकरण बॉडी मास इंडेक्स (BMI) की गणना करता है। यह तभी पूछा जाता है जब व्यक्ति पहले अपनी ऊँचाई और वज़न दर्ज करता है।
यह BMI प्रश्न की एडिट स्क्रीन है।
ध्यान दें कि प्रासंगिकता समीकरण दर्ज करते समय आप कर्ली ब्रेसेस का उपयोग नहीं करते हैं।
समूह-स्तर की प्रासंगिकता देखना / एडिट करना
यह एक नमूना जनगणना सर्वेक्षण है। पहला पृष्ठ पूछता है कि आपके साथ कितने लोग रहते हैं और उसे "cohabs" वेरिएबल में संग्रहीत करता है। यह पृष्ठ केवल तभी दिखाया जाता है जब आपके साथ एक से अधिक लोग रहते हों (इसलिए यह आपके साथ रहने वाले दूसरे व्यक्ति के लिए दिखाया जाता है), और केवल तभी दिखता है जब आपने बताया हो कि पहला व्यक्ति आपसे किस प्रकार संबंधित है (p1_rel)।
जैसा कि आप देख सकते हैं, समूह में प्रश्न-स्तर की प्रासंगिकता के मानदंड भी हैं, ताकि हर प्रश्न तभी दिखे जब आप उससे पहले वाले प्रश्न का उत्तर दे चुके हों (जैसे {!is_empty(p1_sex)})। EM आपके लिए समूह और प्रश्न-स्तर की प्रासंगिकता को जोड़ देता है। किसी समूह के प्रश्न तभी पूछे जाते हैं जब पूरा समूह प्रासंगिक हो। फिर समूह के भीतर केवल वही प्रश्न पूछे जाते हैं जो प्रासंगिक हैं।
उस प्रश्न के लिए समूह-स्तर की प्रासंगिकता एडिट करने की स्क्रीन यह है:
ध्यान दें कि प्रासंगिकता समीकरण दर्ज करते समय आप कर्ली ब्रेसेस का उपयोग नहीं करते हैं।
टेलरिंग/पाइपिंग
EM आपको अपने प्रश्नों की सरल और जटिल सशर्त टेलरिंग आसानी से करने देता है। कभी-कभी आपको केवल सरल प्रतिस्थापन चाहिए होता है, जैसे यह कहना, "आपने कहा कि आपने [Product] खरीदा। आपको इसके बारे में सबसे अच्छा क्या लगा?"। कभी-कभी आपको सशर्त प्रतिस्थापन चाहिए होता है, जैसे "[श्री/श्रीमती] [LastName], क्या आप हमारा सर्वेक्षण पूरा करना चाहेंगे?"। इस स्थिति में आप व्यक्ति के लिंग के आधार पर श्री या श्रीमती का उपयोग करना चाहते हैं। अन्य समय में आपको और भी जटिल प्रतिस्थापन चाहिए होता है (जैसे किसी गणितीय गणना पर आधारित)। EM इन सभी प्रकार की टेलरिंग/पाइपिंग का समर्थन करता है।
सशर्त समीकरण
बॉडी मास इंडेक्स का उदाहरण किसी व्यक्ति के BMI की गणना करने की क्षमता दिखाता है, भले ही उन्हें अपनी ऊँचाई और वज़न मीट्रिक या गैर-मीट्रिक इकाइयों में दर्ज करने की अनुमति हो।
यहाँ weight_kg {if(weight_units == 'kg', weight, weight * .453592)} है। इस if() फ़ंक्शन का अर्थ है कि यदि विषय ने वज़न किलोग्राम में दर्ज किया है, तो उसी मान का उपयोग करें; अन्यथा दर्ज किए गए मान (जो पाउंड में था) को .453592 से गुणा करके किलोग्राम में बदलें। height_m वैरिएबल भी इसी तरीके से व्यक्ति की ऊँचाई मीटर में निकालता है, भले ही उसने अपनी ऊँचाई इंच में दर्ज की हो।
BMI वज़न का सूत्र {weight_kg / (height_m * height_m)} के रूप में गणना करता है।
अंत में, रिपोर्ट विषय के लिए संदेश को शर्त के अनुसार अनुकूलित करती है और उसे बताती है कि उसने क्या दर्ज किया था। ("आपने बताया कि आपकी ऊँचाई 2 मीटर है और वज़न 70 किलोग्राम है।")
हालाँकि ऊपर दिए गए चित्र में यह स्पष्ट रूप से नहीं दिखता, weight_status नेस्टेड if() स्टेटमेंट का उपयोग करके व्यक्ति को कम वज़न से लेकर अत्यधिक मोटापे तक की श्रेणी में रखता है। आप इसका समीकरण Show Logic View में देख सकते हैं।
इस प्रश्न की एडिट विंडो से आप दो बातें देख सकते हैं:
- टेलरिंग में एक्सप्रेशन को कर्ली ब्रेसेस से घेरना आवश्यक है
- एक्सप्रेशन कई पंक्तियों में फैले हो सकते हैं, जैसा कि यहाँ है, ताकि नेस्टेड सशर्त लॉजिक को पढ़ना आसान हो।
अनुकूलित प्रश्न, उत्तर और रिपोर्ट
यह उदाहरण BMI रिपोर्ट दिखाता है।
यह उसी प्रश्न की एडिट विंडो है।
जैसा कि आप देख सकते हैं, कर्ली ब्रेसेस में लिखी हर चीज़ को एक्सप्रेशन माना जाता है, इसीलिए पिछले चित्र में उसे सिंटैक्स-हाइलाइट (रंग-कोडित) किया गया है। यदि आपसे कोई टाइपिंग की गलती हो (जैसे वैरिएबल या फ़ंक्शन के नाम की गलत वर्तनी या अपरिभाषित नाम), तो EM इस तरह की त्रुटि दिखाएगा; यहाँ दिखाया गया है कि height_unit एक परिभाषित न किया गया वैरिएबल नाम है (सही नाम height_units है), और rnd() एक परिभाषित न किया गया फ़ंक्शन है (सही फ़ंक्शन नाम round() है)। दोनों मामलों में त्रुटियों को लाल बॉक्स से घेरा जाता है ताकि उन्हें पहचानना और ठीक करना आसान हो।
आप यह भी देख सकते हैं कि आप दर्ज किए गए मानों की तालिका या अनुकूलित सलाह जैसी जटिल रिपोर्ट तेज़ी से बना सकते हैं।
कृपया याद रखें कि सभी टेलरिंग में एक्सप्रेशन को कर्ली ब्रेसेस से घेरना आवश्यक है, ताकि LimeSurvey को पता रहे कि प्रश्न के कौन-से भाग सामान्य टेक्स्ट हैं और किन्हें Expression Manager से प्रोसेस करना है।
सत्यापन
EM यह नियंत्रित करता है कि अधिकांश उन्नत प्रश्न विकल्प कैसे काम करते हैं। ये उत्तरों की न्यूनतम/अधिकतम संख्या, अलग-अलग मानों के न्यूनतम/अधिकतम मान, योग के न्यूनतम/अधिकतम मान, और दर्ज किए गए मानों के निर्दिष्ट स्ट्रिंग पैटर्न से मेल खाने की जाँच जैसे पहलुओं को नियंत्रित करते हैं। आप इन उन्नत प्रश्न विकल्पों को पहले की तरह ही दर्ज करते रहेंगे। लेकिन अब इन फ़ील्ड में दिया गया कोई भी मान एक्सप्रेशन माना जाता है, इसलिए आप अन्य प्रश्नों से जटिल सशर्त संबंध वाले न्यूनतम/अधिकतम मानदंड रख सकते हैं।
इन सभी मामलों में, चूँकि उन्नत प्रश्न विकल्प को हमेशा एक्सप्रेशन माना जाता है, इसे दर्ज करते समय आप कर्ली ब्रेसेस का उपयोग नहीं करते।
नमूना सर्वेक्षण पृष्ठ सत्यापन के लिए एक्सप्रेशन के उपयोग के कई कार्यशील उदाहरण दिखाते हैं।
परिचय
LimeSurvey नए Expression Manager (EM) मॉड्यूल का उपयोग करता है, जिससे LimeSurvey अधिक जटिल ब्रांचिंग, आकलन, सत्यापन और टेलरिंग को सपोर्ट कर सकेगा। यह बैक-एंड पर LimeSurvey द्वारा Replacements, Conditions और Assessments को संभालने के तरीके को बदल देगा। यह प्रोसेसिंग को काफ़ी तेज़ भी करेगा, क्योंकि यह रन-टाइम पर होने वाली अधिकांश डेटाबेस रीड को समाप्त कर देता है। EM को डॉ. थॉमस व्हाइट (TMSWhite) ने विकसित किया था।
यह विकि पृष्ठ Expression Manager के सिंटैक्स और कार्यक्षमता के लिए अंतिम संदर्भ है।
मुख्य परिभाषाएँ
- एक्सप्रेशन: कर्ली ब्रेसेस से घिरी कोई भी चीज़
- बशर्ते खुलने वाले ब्रेस के तुरंत बाद या बंद होने वाले कर्ली ब्रेस से तुरंत पहले कोई रिक्त स्थान न हो
- एक्सप्रेशन की सामग्री का मूल्यांकन EM करता है, इसलिए उनमें गणितीय सूत्र, फ़ंक्शन, और जटिल स्ट्रिंग व दिनांक प्रोसेसिंग हो सकती है।
- टेलरिंग: कभी-कभी "पाइपिंग" कहलाने वाली यह प्रक्रिया शर्त के अनुसार टेक्स्ट को बदलने की है
- आपके पास सभी 'रिप्लेसमेंट फ़ील्ड', प्रतिभागी डेटा और प्रतिक्रिया डेटा तक पहुँच होती है।
- आपको प्रश्नों, उत्तरों और उनके गुणों तक भी आसान पहुँच मिलती है।
- प्रासंगिकता समीकरण: प्रश्न की दृश्यता को नियंत्रित करने वाली एक नई प्रश्न विशेषता
- यदि कोई प्रासंगिकता समीकरण है, तो प्रश्न तभी दिखाया जाता है जब प्रासंगिकता का मान सत्य हो।
- आंतरिक रूप से, सभी array_filter और array_filter_exclude कमांड उप-प्रश्न-स्तर की प्रासंगिकता बन जाते हैं
- समीकरण प्रश्न का प्रकार: एक नया प्रश्न प्रकार जो गणनाओं या रिपोर्ट को डेटाबेस में सहेजता है
- यह Boilerplate प्रश्न जैसा है, लेकिन "हमेशा इस प्रश्न को छिपाने" सेट करने पर भी इसकी सामग्री डेटाबेस में सहेजी जाती है
- प्रश्न कोड: यह EM के लिए पसंदीदा वैरिएबल नाम है
- यह प्रश्न के उद्देश्य को दर्शाने वाला वर्णनात्मक नाम हो सकता है, जिससे जटिल लॉजिक पढ़ना आसान हो जाता है
- मान्य प्रश्न कोड किसी संख्या से शुरू नहीं होने चाहिए, इसलिए प्रश्नों की क्रमांकन के लिए प्रश्न कोड का उपयोग करते समय बस "q1", "q1a" या "g1q2" का उपयोग करें।
- यदि आप डेटा को SPSS या R में निर्यात करते हैं, तो वर्तमान में यही वैरिएबल नाम बनता है, इसलिए यदि आप सांख्यिकीय विश्लेषण करते हैं, तो संभवतः आपने इसे पहले से अद्वितीय बना लिया होगा।
क्या मुझे EM का उपयोग करना ज़रूरी है?
संक्षिप्त उत्तर है: नहीं (लेकिन हाँ भी)।
EM मौजूदा सर्वेक्षणों के साथ पूरी तरह पिछड़ी-संगत है। इसलिए, यदि आप Conditions और Assessments को उसी शैली में उपयोग करना चाहते हैं जिसमें LimeSurvey ने संस्करण <= 1.91+ में किया था, तो आप ऐसा करना जारी रख सकते हैं।
हालाँकि, EM पूरी तरह बदल देता है कि LimeSurvey आंतरिक रूप से Conditions को कैसे संभालता है। यद्यपि आप अब भी Conditions Editor का उपयोग करके शर्तें बना और प्रबंधित कर सकते हैं, LimeSurvey 1.92 उन्हें समकक्ष प्रासंगिकता समीकरणों में बदल देगा। अपग्रेड के भाग के रूप में, LimeSurvey 1.92 सभी मौजूदा Conditions को स्वचालित रूप से प्रासंगिकता समीकरणों में बदल देगा।
इससे आपको दोनों का सर्वोत्तम लाभ मिलना चाहिए - आप LimeSurvey का उपयोग अपनी आदत के अनुसार जारी रख सकते हैं, लेकिन आपको उसका समतुल्य प्रासंगिकता समीकरण भी दिखेगा, ताकि आप जब उचित समझें, धीरे-धीरे सीधे प्रासंगिकता समीकरणों पर जा सकें।
क्या मैं Conditions और Relevance दोनों को मिलाकर उपयोग कर सकता हूँ?
हाँ। आप कुछ प्रश्नों के लिए Conditions एडिटर और अन्य प्रश्नों के लिए Relevance एडिटर का उपयोग कर सकते हैं। प्रश्न सेव करते समय Conditions अपने-आप Relevance में बदल जाती हैं।
ध्यान दें, यदि आप Conditions एडिटर का उपयोग कर रहे हैं, तो हम मानते हैं कि आप चाहते हैं कि वे Conditions मैन्युअल रूप से दर्ज किए गए किसी भी प्रासंगिकता समीकरण को अधिलेखित कर दें। इसलिए, यदि आपके पास पहले से Conditions हैं और आप Relevance को मैन्युअल रूप से एडिट करना चाहते हैं, तो कृपया पहले उस प्रश्न की Conditions डिलीट करें। विशेष रूप से, जनरेट किए गए प्रासंगिकता समीकरण को किसी टेक्स्ट एडिटर में कॉपी करें, उस प्रश्न की सभी Conditions डिलीट करने के लिए Conditions मेन्यू का उपयोग करें (इससे Relevance भी डिलीट हो जाएगी), फिर प्रश्न को एडिट करें और टेक्स्ट एडिटर से जनरेट किया गया प्रासंगिकता समीकरण उस प्रश्न के Relevance फ़ील्ड में वापस पेस्ट करें (और प्रश्न को सेव करें)। यदि जनरेट किए गए प्रासंगिकता समीकरण को डिलीट किए बिना Conditions डिलीट करने की पर्याप्त माँग होगी, तो हम बल्क रूपांतरण प्रक्रिया जोड़ सकते हैं।
मुझे Conditions और Relevance में से किसे चुनना चाहिए?
यहाँ प्रत्येक शैली के फायदे और नुकसान की सूची दी गई है:
| शैली | फायदे | नुकसान |
|---|---|---|
| Conditions | 1. सरल कंडीशन बनाने के लिए अच्छा GUI 2. GUI अच्छी तरह प्रलेखित है और सपोर्ट टीम इसे अच्छी तरह समझती है |
1. केवल सरल तुलनाओं का समर्थन करता है और AND/OR कंडीशन को ठीक से नहीं संभालता 2. कैस्केडिंग कंडीशन अनियमित रूप से काम करती हैं 3. धीमा - डेटाबेस पर अधिक निर्भर, इसलिए लंबे सर्वेक्षणों को धीमा कर सकता है 4. कंडीशन को दोबारा लोड करने में कुछ समस्याएँ रिपोर्ट की गई हैं 5. दर्जनों, सैकड़ों या हज़ारों प्रश्न होने पर GUI ठीक से स्केल नहीं करता 6. कागज़ आधारित सर्वेक्षणों को बदलने में समय लग सकता है क्योंकि SGQA नामों का उपयोग करना पड़ता है 7. जटिल ब्रांचिंग के लिए आवश्यक लॉजिक को कस्टम-कोड करने के लिए अक्सर प्रोग्रामर की ज़रूरत पड़ती है |
| Relevance | 1. बहुत जटिल लॉजिक का समर्थन करता है, जिसमें 80+ फ़ंक्शन और गणित/स्ट्रिंग ऑपरेटर शामिल हैं 2. कैस्केडिंग लॉजिक के लिए उत्कृष्ट समर्थन 3. तेज़ - अतिरिक्त डेटाबेस कॉल नहीं, इसलिए 1000+ प्रश्नों वाले सर्वेक्षणों का समर्थन करता है 4. लॉजिक को दोबारा लोड करने में कोई समस्या नहीं क्योंकि SGQA कोड की आवश्यकता नहीं होती 5. सिंटैक्स-हाइलाइटिंग 1000+ प्रश्नों वाले सर्वेक्षणों तक स्केल करती है 6. मौजूदा कागज़ आधारित सर्वेक्षणों को कंप्यूटरीकृत करना चाहने वाले समूहों के लिए उपयोग में आसान और तेज़ 7. प्रोग्रामर की आवश्यकता के बिना अर्ध-संरचित साक्षात्कारों और महामारी विज्ञान सर्वेक्षणों का आसानी से समर्थन करता है |
1. सरल कंडीशन के लिए कोई GUI नहीं - इसके बजाय सिंटैक्स-हाइलाइटिंग का उपयोग करें 2. नया है, इसलिए सपोर्ट टीमों ने अभी तक EM में महारत हासिल नहीं की है। |
निष्कर्ष यह है कि यदि आप LimeSurvey 1.91+ के काम करने के तरीके से संतुष्ट हैं, तो अपने काम करने के तरीके को बदलने का कोई कारण नहीं है।
EM का उपयोग करने के कुछ अन्य लाभ क्या हैं?
यहाँ कुछ अन्य कारण दिए गए हैं जिनकी वजह से आप EM का उपयोग करना चाह सकते हैं।
- गणनाएँ - आप कोई भी गणना बना सकते हैं जिसकी आप कल्पना कर सकते हैं:
- आपके पास सभी सामान्य गणितीय ऑपरेटर और फ़ंक्शन उपलब्ध हैं
- आपके पास 70+ गणितीय, तिथि और स्ट्रिंग प्रोसेसिंग फ़ंक्शन उपलब्ध हैं
- यदि उपयोगकर्ताओं को नए फ़ंक्शन की आवश्यकता हो, तो डेवलपर्स के लिए उन्हें जोड़ना काफ़ी आसान है
- गणनाओं को डेटाबेस में सेव करना
- अब आप JavaScript की आवश्यकता के बिना सरल और जटिल गणनाएँ और/या स्केल स्कोर निकाल सकते हैं और उन्हें डेटाबेस में सेव करवा सकते हैं।
- इसके लिए आप समीकरण प्रश्न के प्रकार का उपयोग करते हैं।
- मूल्यांकन
- अब आप किसी भी प्रश्न के प्रकार से मूल्यांकन या स्केल स्कोर बना सकते हैं, न कि केवल उस सीमित उपसमूह से जो पहले समर्थित था
- आप चालू या कुल मूल्यांकन स्कोर कहीं भी दिखाने के लिए Tailoring का उपयोग कर सकते हैं - यहाँ तक कि उसी पृष्ठ पर भी
- उन मूल्यांकन स्कोर के आधार पर बनने वाली रिपोर्टों पर आपका अधिक नियंत्रण होता है
- आप JavaScript की आवश्यकता के बिना मूल्यांकन स्कोर डेटाबेस में सेव कर सकते हैं
- आप JavaScript या CSS की आवश्यकता के बिना मूल्यांकन स्कोर छिपा सकते हैं
- रिप्लेसमेंट फ़ील्ड
- पिछले प्रश्नों के उत्तरों के मान डालने के लिए प्रश्न कोड का उपयोग करें - इससे पढ़ना और सत्यापित करना आसान हो जाता है।
- Tailoring - आप अन्य मानों के आधार पर शर्त के अनुसार टेक्स्ट दिखा सकते हैं
- विषय के लिए उपयुक्त संबोधन का उपयोग करें, जैसे (उदा. "नमस्कार [श्री/श्रीमती] शर्मा")
- जहाँ एकवचन/बहुवचन मायने रखता हो, वहाँ व्याकरण की दृष्टि से सही वाक्य बनाएँ: (उदा. "आपका 1 बच्चा है" बनाम "आपके 2 बच्चे हैं")
- विषय के लिंग और वचन के आधार पर क्रियाओं और संज्ञाओं के रूप उचित ढंग से बदलें।
- नए वेरिएबल एट्रिब्यूट - अपनी Tailoring के लिए आप निम्नलिखित का उपयोग कर सकते हैं:
- (कोई प्रत्यय नहीं) - qcode.code का उपनाम
- .code - प्रश्न का चुना गया प्रतिक्रिया कोड यदि वह प्रासंगिक है (अन्यथा खाली), या यदि वह कोडित प्रश्न नहीं है तो टेक्स्ट मान
- .NAOK - .code के समान, लेकिन अप्रासंगिक होने पर भी गणनाओं या सूचियों का हिस्सा हो सकता है
- .value - प्रश्न का मूल्यांकन मूल्य यदि वह प्रासंगिक है (अन्यथा खाली), या यदि वह कोडित प्रश्न नहीं है तो टेक्स्ट मान -- तभी उपलब्ध जब सर्वेक्षण के लिए मूल्यांकन सक्षम हों, अन्यथा हमेशा शून्य
- .valueNAOK - .value के समान, लेकिन अप्रासंगिक होने पर भी गणनाओं या सूचियों का हिस्सा हो सकता है
- .shown - उपयोगकर्ता को दिखाया गया उत्तर
- .qid - प्रश्न आईडी
- .gid - समूह आईडी
- .sgqa - प्रश्न का SGQA मान
- .jsName - प्रश्न का सही JavaScript वेरिएबल नाम, चाहे वह इस पृष्ठ पर परिभाषित हो या किसी अन्य पर
- .qseq - प्रश्न का क्रम (0 से शुरू)
- .gseq - समूह का क्रम (0 से शुरू)
- .mandatory - प्रश्न अनिवार्य है या नहीं (Y/N)
- .question - प्रश्न का टेक्स्ट
- .relevance - प्रश्न का प्रासंगिकता समीकरण
- .grelevance - समूह का प्रासंगिकता समीकरण
- .relevanceStatus - प्रश्न वर्तमान में प्रासंगिक है या नहीं (बूलियन (PHP और JS में भिन्न हो सकता है))
- .type - प्रश्न का प्रकार (एक अक्षर वाला कोड)
- पृष्ठ पर गतिशील बदलाव
- सभी Relevance, गणना और Tailoring पृष्ठ पर गतिशील रूप से काम करते हैं - इसलिए मानों में बदलाव होते ही पृष्ठ तुरंत अपडेट हो जाता है
- इसलिए प्रश्न प्रासंगिक होने या न होने के आधार पर गतिशील रूप से प्रकट/गायब होते हैं
- प्रश्न पृष्ठ पर दी गई प्रतिक्रियाओं के आधार पर भी गतिशील रूप से अनुकूलित होते हैं, इसलिए आप चालू योग, अनुकूलित वाक्य और कस्टम रिपोर्ट देख सकते हैं।
- नई डेटा प्रविष्टि स्क्रीन
- मौजूदा डेटा प्रविष्टि प्रणाली के अलावा, आप Survey-All-In-One का भी उपयोग कर सकते हैं।
- यह पृष्ठ पर Relevance और Tailoring का समर्थन करता है, इसलिए डेटा प्रविष्टि क्लर्क तेज़ी से टैब करके आगे बढ़ सकते हैं और उन्हें केवल प्रासंगिक प्रतिक्रियाएँ दर्ज करनी होंगी
- यदि आपके डेटा प्रविष्टि कर्मचारी को Tailoring देखनी हो, जो गतिशील भी है, तो यह बहुत महत्वपूर्ण हो सकता है।
- अधिकांश कस्टम JavaScript की आवश्यकता समाप्त करता है
- EM जटिल गणनाओं, स्कोरिंग, Tailoring और सशर्त लॉजिक का आसानी से समर्थन करता है।
- कुछ चीज़ों के लिए अभी भी JavaScript की आवश्यकता होगी (जैसे कस्टम लेआउट और प्रश्न के उप-तत्वों को शर्त के अनुसार छिपाना), लेकिन आपकी JavaScript EM फ़ंक्शन का उपयोग कर सकती है, ताकि आप SGQA के बजाय Qcode से प्रश्नों तक पहुँच सकें, और ऊपर सूचीबद्ध किसी भी प्रश्न गुण तक पहुँच सकें।
EM द्वारा सक्षम किए गए कुछ अन्य उपयोगी नए फ़ीचर क्या हैं?
चाहे आप Conditions Editor का उपयोग जारी रखें या प्रासंगिकता समीकरण मैन्युअल रूप से लिखें, आपको ये अतिरिक्त लाभ मिलते हैं:
- आप अधिक जटिल सत्यापन मानदंड बना सकते हैं
- सभी उन्नत प्रश्न विशेषता (जैसे max_answers, min_num_value_n, max_num_value) एक्सप्रेशन का उपयोग कर सकती हैं। इसलिए आपके न्यूनतम/अधिकतम मानदंड पिछली प्रतिक्रियाओं के आधार पर आसानी से समायोजित किए जा सकते हैं, भले ही वे एक ही पृष्ठ पर हों।
- EM सभी रेगुलर-एक्सप्रेशन-आधारित सत्यापन भी संभालता है, इसलिए आप preg और समीकरण-आधारित प्रश्न विशेषताओं को मज़बूती से जोड़ सकते हैं।
- प्रश्नों और समूहों का आसान क्रम बदलना (या डिलीट करना)
- संस्करण 1.92 से पहले, यदि LimeSurvey को लगता था कि क्रम बदलने से उन शर्तों में गड़बड़ी हो सकती है जिनमें वे उपयोग किए गए हैं, तो आप प्रश्नों या समूहों का क्रम नहीं बदल सकते थे। इसी तरह, यदि कोई अन्य प्रश्न किसी प्रश्न पर निर्भर होते थे, तो आप उसे डिलीट नहीं कर सकते थे।
- EM की सिंटैक्स हाइलाइटिंग से यह देखना और सत्यापित करना आसान है कि क्या आप किसी प्रश्न का उपयोग उसके घोषित होने से पहले कर रहे हैं। इसलिए अब हम आपको जब चाहें प्रश्नों और समूहों का क्रम बदलने या उन्हें डिलीट करने देते हैं। EM संभावित त्रुटियाँ दिखाने के लिए सभी सिंटैक्स हाइलाइटिंग अपडेट कर देगा।
- ऐसी समीक्षा में मदद के लिए प्रश्नों का क्रम बदलने वाला दृश्य बेहतर बनाया गया है। यह अब प्रश्न का प्रासंगिकता समीकरण और टेलरिंग दिखाता है, ताकि आप तुरंत देख सकें कि कोई वेरिएबल गुलाबी हो गया है या नहीं (यानी उसे घोषित होने से पहले उपयोग किया गया है)।
- प्रश्न/समूह नेविगेशन इंडेक्स हमेशा उपलब्ध और सटीक रहता है
- संस्करण 1.92 से पहले, जटिल शर्तें होने पर ये इंडेक्स उपलब्ध नहीं होते थे
- EM के साथ, हम इनकी सटीकता की गारंटी दे सकते हैं।
- विषय पिछले प्रश्न पर वापस जा सकते हैं, उत्तर बदल सकते हैं, फिर आगे जा सकते हैं (या सबमिट कर सकते हैं)
- आगे बढ़ते समय, EM बीच के सभी प्रश्नों/समूहों को दोबारा सत्यापित करेगा।
- यदि कोई प्रश्न अप्रासंगिक हो जाते हैं, तो उन्हें डेटाबेस में NULL कर दिया जाएगा ताकि आपका डेटा आंतरिक रूप से सुसंगत रहे
- यदि कोई प्रश्न प्रासंगिक हो जाते हैं या नए सिरे से अनिवार्य या सत्यापन नियमों में विफल होते हैं, तो EM उसी पृष्ठ पर रुक जाएगा और उपयोगकर्ता को अंतिम गंतव्य पर जाने से पहले उन प्रश्नों का उत्तर देने के लिए बाध्य करेगा।
- शर्तों का प्रासंगिकता में स्वतः रूपांतरण
- जब आप अपना डेटाबेस अपग्रेड करते हैं, तो शर्तों वाले सभी मौजूदा सर्वेक्षणों के लिए प्रासंगिकता समीकरण बना दिए जाएँगे
- जब भी आप कोई सर्वेक्षण इंपोर्ट करते हैं, आवश्यकतानुसार प्रासंगिकता समीकरण बनाए जाएँगे
- जब भी आप शर्तें जोड़ते, डिलीट करते या संशोधित करते हैं, EM उपयुक्त प्रासंगिकता समीकरण बना देगा।
- सुविधाजनक सिंटैक्स हाइलाइटिंग
- जब EM प्रासंगिकता समीकरण दिखाता है, तो वह Qcode दिखाएगा, भले ही आपने SGQA कोड दर्ज किया हो, क्योंकि हम मानते हैं कि इसे पढ़ना आसान होगा।
- सभी वेरिएबल रंग-कोडित होते हैं ताकि पता चले कि वे वर्तमान प्रश्न (या वर्तमान समूह) से पहले घोषित हुए थे या बाद में। इससे आप उन मामलों को जल्दी पहचानकर ठीक कर सकते हैं जहाँ आप प्रासंगिकता (array_filter सहित), टेलरिंग या सत्यापन समीकरणों में वेरिएबल को घोषित करने से पहले उपयोग करते हैं।
- इसके अलावा, यदि आप माउस को रंग-कोडित वेरिएबल पर ले जाते हैं, तो आपको उस प्रश्न का सबसे महत्वपूर्ण मेटाडेटा दिखेगा। इसमें समूह क्रम #, प्रश्न क्रम #, Qcode, प्रश्न का टेक्स्ट और सभी उपलब्ध उत्तर विकल्प शामिल हैं (यदि यह गणित-सूचीबद्ध उत्तर विकल्पों वाला प्रश्न का प्रकार है)।
- उत्तर विकल्पों की सूची इस सिंटैक्स का उपयोग करती है: 'answers':{key:val, ... }.
- key का सिंटैक्स 'scale~code' है, जहाँ scale उत्तर स्केल है (जैसे dual scale के लिए), और code उत्तर कोड है।
- val का सिंटैक्स 'value~shown' है, जहाँ value मूल्यांकन मान है (यदि मूल्यांकन का उपयोग हो रहा है, अन्यथा code) (जैसे Qcode.value), और shown वह प्रदर्शित मान है जो विषय को दिखता है (जैसे Qcode.shown)
- इसका अर्थ है कि कई सर्वेक्षण मूल्यांकन मोड के बिना भी गणनाएँ कर सकते हैं। यदि आपके सूचीबद्ध उत्तर विकल्प अद्वितीय, गैर-दशमलव और गैर-ऋणात्मक हैं, तो आप Qcode.code मानों पर सीधे गणना कर सकते हैं।
- पूरे सर्वेक्षण के लॉजिक और सामग्री की आसान समीक्षा
- एक नई Show Survey Logic सुविधा है, जिससे आप सर्वेक्षण (या समूह या प्रश्न) की हर चीज़ एक ही पृष्ठ पर देख सकते हैं।
- यह चुने गए दायरे (सर्वेक्षण बनाम समूह बनाम प्रश्न) के लिए समूह, प्रश्न, उप-प्रश्न और उत्तर-स्तर का विवरण दिखाती है
- यह प्रासंगिकता, उप-प्रश्न-स्तर की प्रासंगिकता (array_filter और array_filter_exclude के लिए), तैयार किया गया सत्यापन समीकरण (preg और न्यूनतम/अधिकतम योग/मानों की संख्या जैसे किसी भी सत्यापन नियम के लिए) और सभी गैर-रिक्त प्रश्न विशेषताएँ भी दिखाती है।
- सब कुछ सिंटैक्स-हाइलाइट किया गया है ताकि आप संभावित सिंटैक्स त्रुटियाँ (जैसे असंतुलित कोष्ठक या वेरिएबल का घोषित होने से पहले उपयोग) देख सकें
- सिंटैक्स हाइलाइटिंग सर्वेक्षण में तेज़ नेविगेशन और एडिटिंग में मदद करती है।
- यदि आप किसी वेरिएबल के नाम पर क्लिक करते हैं, तो एक ब्राउज़र विंडो (या टैब) खुलती है जो वह प्रश्न दिखाती है और उसे एडिट करने देती है।
- यदि आप किसी समूह के नाम पर क्लिक करते हैं, तो एक ब्राउज़र विंडो (या टैब) खुलती है जो समूह का क्रम बदलने वाला दृश्य दिखाती है ताकि आप प्रश्नों को आसानी से इधर-उधर कर सकें।
- सभी प्रश्न विशेषताएँ भी सिंटैक्स-हाइलाइट की जाती हैं। इससे आप उन्नत प्रश्न विकल्पों के भीतर एक्सप्रेशन सेट और देख सकते हैं (जैसे मानों की अधिकतम/न्यूनतम संख्या/योग को किसी एक्सप्रेशन पर आधारित करना)
- EM के लेखक ने इसी तरह के दृश्य (थोड़े साफ़-सुथरे) का उपयोग अपने सहयोगी महामारी-विज्ञानियों और संस्थागत समीक्षा बोर्ड को हज़ारों प्रश्नों वाले, अत्यधिक शाखित और टेलर किए गए संरचित साक्षात्कारों के सर्वेक्षणों को सत्यापित और अधिकृत करने देने के लिए किया
शुरू करना
EM के साथ शुरू करने का सबसे अच्छा तरीका है:
- http://www.limesurvey.org/en/download से नवीनतम स्थिर संस्करण इंस्टॉल करें
- नमूना सर्वेक्षण इंपोर्ट करें और उन्हें देखें।
- उपयोग के मामले और HowTo तथा चरण-दर-चरण उदाहरण देखें।
- EM दस्तावेज़ (यह पृष्ठ) पढ़ें
- अंतर्निहित EM परीक्षण सूट देखें
- किसी भी सर्वेक्षण से, टूल्स के अंतर्गत EM विकल्प चुनें
- उपलब्ध फ़ंक्शन 70+ फ़ंक्शन और उनका सिंटैक्स सूचीबद्ध करता है
- अलग-थलग एक्सप्रेशन के यूनिट टेस्ट
- सभी EM फ़ंक्शन और ऑपरेटर के उपयोग के उदाहरण तथा PHP और JavaScript के परिणाम दिखाता है
- ध्यान दें कि कुछ फ़ंक्शन PHP और JavaScript संस्करणों में अलग परिणाम देते हैं, इसलिए यह पृष्ठ आपको अपने EM लॉजिक की योजना उसी के अनुसार बनाने में मदद करता है।
Expression Manager किस कार्यक्षमता का विस्तार/प्रतिस्थापन करता है? (LimeSurvey <= 1.91+)
शर्तें => प्रासंगिकता
शर्तें तय करती थीं कि कौन से प्रश्न दिखाई दें। सामान्य सिंटैक्स SGQA ऑपरेटर मान था, जैसे 111X2X3 == "Y"। शर्तों को AND या OR से जोड़ा जा सकता था, लेकिन AND और OR को मिलाना कठिन था। शर्तें स्वयं एक अलग तालिका में संग्रहीत थीं, और LimeSurvey के कोड का एक बड़ा हिस्सा शर्तों के प्रबंधन में लगा था। व्यापक डेटाबेस एक्सेस के कारण, बड़ी संख्या में शर्तों की प्रोसेसिंग से प्रदर्शन में ध्यान देने योग्य समस्याएँ आ सकती थीं। इसके अलावा, एक बार प्रश्नों या समूहों को शर्तें असाइन हो जाने के बाद, अक्सर आपको उनका क्रम बदलने या उन्हें डिलीट करने की अनुमति नहीं होती थी।
मूल्यांकन => समीकरण और माइक्रो-टेलरिंग
मूल्यांकन उपयोगकर्ताओं को प्रश्नों के संग्रह से स्केल स्कोर बनाने देते थे। लेकिन वे वर्तमान पृष्ठ पर गतिशील रूप से नहीं बदल सकते थे, और उनके मान डेटाबेस में संग्रहीत नहीं होते थे।
रिप्लेसमेंट => माइक्रो-टेलरिंग
उपयोगकर्ता पिछली प्रतिक्रियाओं के आधार पर कुछ संदेशों और प्रश्नों को टेलर कर सकते थे। उदाहरण के लिए, कोई प्रश्न हो सकता था, {TOKEN:FIRSTNAME}, आपने कहा था कि {SPORT.shown} आपका पसंदीदा खेल है। लेकिन सशर्त टेलरिंग करना (जैसे व्यक्ति के लिंग के आधार पर "श्री" या "श्रीमती" कहना), या जटिल JavaScript के बिना क्रियाओं के रूप बदलना संभव नहीं था। लेखक ऐसे सर्वेक्षण बना सकते थे जो प्रश्नों को टेलर करते प्रतीत होते थे, लेकिन इसके लिए हर विकल्प के लिए अलग प्रश्न और यह तय करने के लिए जटिल शर्तें चाहिए थीं कि कौन से प्रश्न दिखाए जाएँ।
सत्यापन
प्रश्नों को रेगुलर एक्सप्रेशन, या न्यूनतम/अधिकतम मानों से सत्यापित किया जा सकता था, या किसी प्रतिक्रिया को न्यूनतम या अधिकतम मान के रूप में उपयोग किया जा सकता था। लेकिन जटिल JavaScript के बिना सत्यापन अन्य वेरिएबल की गणनाओं पर आधारित नहीं हो सकता था।
समीकरण
जटिल JavaScript के बिना समीकरण समर्थित नहीं थे।
समीकरण प्रश्न का प्रकार
जटिल JavaScript के बिना समीकरणों (जैसे किसी मूल्यांकन का अंतिम स्कोर) को डेटाबेस में सहेजा नहीं जा सकता था।
Expression Manager उस कार्यक्षमता का प्रतिस्थापन/विस्तार कैसे करेगा?
Expression Manager LimeSurvey के भीतर एक नया कोर मॉड्यूल है, जो उस तरह की जटिल कार्यक्षमता को समर्थन देना बहुत आसान बनाता है जिसके लिए पहले कस्टम JavaScript की आवश्यकता होती थी। यह LimeSurvey द्वारा वर्तमान में शर्तों और मूल्यांकनों को प्रबंधित करने के तरीके की जगह भी ले रहा है।
Expression Manager (EM) का उल्लेख करते समय नई शब्दावली
EM अपनी कार्यक्षमता को इन शब्दों में "सोचता" है:
- प्रासंगिकता-आधारित ब्रांचिंग - यदि कोई प्रश्न प्रासंगिक है, तो उसे पूछें, अन्यथा न पूछें (जैसे उसे अदृश्य कर दें, और डेटाबेस में NULL के रूप में चिह्नित करें)। सभी प्रश्न के प्रकारों के लिए, और प्रत्येक समूह के लिए भी, एक नया प्रासंगिकता फ़ील्ड है (ताकि आप हर प्रश्न पर वही शर्त कॉपी किए बिना पूरे समूह पर शर्तों का समूह लागू कर सकें, और/या समूह-स्तर और प्रश्न-स्तर के सशर्त लॉजिक को मिला सकें)।
- टेलरिंग - जब आप जान लेते हैं कि कौन से प्रश्न पूछे जाने चाहिए, तो टेलरिंग (जिसे कभी-कभी पाइपिंग कहा जाता है) तय करती है कि प्रश्न कैसे पूछा जाए। इससे आप न केवल सरल प्रतिस्थापन (जैसे {TOKEN:FIRSTNAME}) बल्कि अपने विषयों के लिंग या संख्या के आधार पर क्रियाओं और संज्ञाओं के रूप बदलना भी कर सकते हैं। यह आपको इस आधार पर विषय को दिया जाने वाला संदेश बदलने की सुविधा भी देता है कि उन्होंने अन्य प्रश्नों के उत्तर दिए या नहीं (या कैसे दिए)।
- समीकरण - EM समीकरण नाम का एक नया प्रश्न का प्रकार जोड़ता है जो किसी एक्सप्रेशन का परिणाम संग्रहीत करता है। इन समीकरणों के परिणाम की गणना की जाती है और उन्हें डेटाबेस में लिखा जाता है, भले ही आप उन्हें पृष्ठ पर छिपा दें। इसलिए वे छिपी हुई स्कोरिंग गणनाओं, जटिल समीकरणों पर आधारित नेविगेशन, मूल्यांकनों और ऐसी रिपोर्टों के लिए उपयोगी हैं जिन्हें डेटाबेस में तैयार और आसानी से उपलब्ध होना चाहिए।
प्रासंगिकता और क्रमिक प्रासंगिकता (Cascading Relevance)
अब प्रत्येक प्रश्न के प्रकार में एक प्रासंगिकता विकल्प है जो नियंत्रित करता है कि प्रश्न प्रदर्शित हो या नहीं। EM प्रत्येक प्रासंगिकता समीकरण को उसी क्रम में प्रोसेस करता है जिस क्रम में वे सर्वेक्षण में दिखने चाहिए। यदि एक्सप्रेशन सही है (या अनुपस्थित है - पुराने सर्वेक्षणों के समर्थन के लिए), तो प्रश्न प्रदर्शित किया जाएगा। यदि वह प्रासंगिक नहीं है, तो प्रश्न छिपा दिया जाएगा, और डेटाबेस में उसका मान NULL कर दिया जाएगा। यदि किसी समूह में कोई प्रासंगिक प्रश्न नहीं है, तो पूरा समूह छोड़ दिया जाएगा।
इसके अलावा, यदि किसी एक्सप्रेशन के भीतर कोई भी वेरिएबल अप्रासंगिक है, तो वह एक्सप्रेशन हमेशा गलत (false) माना जाता है। इससे क्रमिक प्रासंगिकता (Cascading Relevance) संभव होती है, ताकि आपको हर प्रश्न के लिए बहुत लंबे प्रासंगिकता समीकरण न लिखने पड़ें।
मान लीजिए आपके पास Q1-Q5 तक 5 प्रश्न हैं, और आप Q2 तभी दिखाना चाहते हैं जब Q1 का उत्तर दिया गया हो, और Q3 तभी जब Q2 का उत्तर दिया गया हो, आदि। प्रासंगिकता समीकरण इस प्रकार हो सकते हैं:
| सवाल कोड | प्रासंगिकता | प्रश्न |
|---|---|---|
| Q1 | 1 | आपका नाम क्या है? |
| Q2 | Q1 | {Q1}, आपकी उम्र कितनी है? |
| Q3 | Q2 | तो, आपकी उम्र {Q2} वर्ष है। क्या आप विवाहित हैं? |
| Q4 | Q3 == "Y" | {Q1}, आपके विवाह को कितना समय हुआ है? |
| Q5 | Q4 | {Q1}, आपके कितने बच्चे हैं? |
प्रासंगिकता की गणनाएँ JavaScript में भी काम करती हैं - इसलिए आप ऊपर के सभी प्रश्न एक ही पृष्ठ पर रख सकते हैं और वे अपेक्षा के अनुसार ही काम करेंगे। वास्तव में, EM सर्वेक्षण, समूह और एक-बार-में-एक-प्रश्न वाले सर्वेक्षण प्रारूपों को प्रोसेस करने का तरीका पूरी तरह बदल देता है। अब वे सभी बिल्कुल एक ही नेविगेशन इंजन का उपयोग करते हैं, इसलिए सर्वेक्षण की शैली चाहे जो हो, वे समान रूप से काम करते हैं।
जब तक आप एक ही पृष्ठ पर हैं, आपके द्वारा दर्ज किया गया कोई भी डेटा वहीं रहेगा, बस छिपा हुआ होगा। इसलिए, यदि आप कुछ जानकारी दर्ज करते हैं, फिर कोई ऐसा विकल्प चुनते हैं जो उन्हें अप्रासंगिक बना दे, और फिर उन्हें दोबारा प्रासंगिक बनाते हैं, तो आपके उत्तर अब भी उपलब्ध रहेंगे। लेकिन जैसे ही आप किसी दूसरे पृष्ठ पर जाते हैं, डेटासेट की अखंडता बनाए रखने के लिए सभी अप्रासंगिक प्रतिक्रियाएँ खो जाएँगी।
समूह-स्तरीय प्रासंगिकता
Expression Manager ग्रुप-स्तर की प्रासंगिकता को भी सपोर्ट करता है। इससे लूपिंग लागू करना आसान हो जाता है। मान लीजिए कि आप अधिकतम 10 इकाइयों (जैसे उत्पाद या किसी घर के लोग) के बारे में जानकारी एकत्र करना चाहते हैं, जहाँ आप पहले यह तय करते हैं कि कितनी इकाइयों के लिए फ़ॉलो-अप ज़रूरी है (जैसे यह पूछकर कि घर में कितने लोग रहते हैं, या लोगों से एक लंबी सूची में से यह चुनने को कहकर कि उन्हें कौन-से उत्पाद पसंद हैं)। यह जान लेने के बाद कि कितनी इकाइयों के लिए फ़ॉलो-अप चाहिए, आप फ़ॉलो-अप प्रश्नों के 10 ग्रुप में से प्रत्येक के लिए {count >= 1}, {count >=2}, ... {count >= 10} जैसी ग्रुप-स्तर की प्रासंगिकता का उपयोग कर सकते हैं। प्रत्येक ग्रुप के भीतर आप प्रश्न-स्तर का शर्त-आधारित लॉजिक रख सकते हैं (जैसे प्रत्येक विषय के लिए लिंग या आयु के अनुसार फ़ॉलो-अप प्रश्न)। कौन-सा दिखाया जाए, यह तय करने के लिए प्रश्न-स्तर और ग्रुप-स्तर के प्रासंगिकता समीकरणों को AND से जोड़ा जाता है।
टेलरिंग / पाइपिंग
कर्ली ब्रैकेट के भीतर की हर चीज़ को अब एक एक्सप्रेशन माना जाता है (एक अपवाद के साथ, जिसका वर्णन नीचे किया गया है)। एक्सप्रेशन को सभी LimeReplacementFields, सभी वेरिएबल (कई उपनामों के ज़रिए), सभी सामान्य समीकरण ऑपरेटर (गणितीय, तार्किक और तुलनात्मक) और दर्जनों फ़ंक्शन (जो क्लाइंट-साइड पर भी डायनामिक रूप से काम करते हैं) उपलब्ध होते हैं।
इन समीकरणों का उपयोग करके आप ये काम कर सकते हैं:
- पिछली प्रतिक्रियाओं के आधार पर उत्तरदाताओं को शर्त के अनुसार अनुकूलित संदेश दिखाना
- मूल्यांकन बनाना और उन परिणामों के आधार पर मूल्यांकन के परिणाम दिखाना (या शर्त के अनुसार ब्रांचिंग करना या संदेश दिखाना), वह भी मूल्यांकन मॉड्यूल का उपयोग किए बिना
- प्रश्नों, उत्तरों और रिपोर्ट के भीतर क्रियाओं के रूप और संज्ञाओं के कारक रूप बदलना
- सर्वेक्षण के अंत में "अपने उत्तर दिखाएँ" पेज से पहले प्रतिक्रियाओं का सारांश दिखाना
समीकरण
समीकरण नाम का एक नया प्रश्न का प्रकार है। यह Boilerplate प्रश्न जैसा है, अंतर यह है कि जो कुछ प्रदर्शित होता है उसका मान यह डेटाबेस में सेव करता है। इसलिए, यदि समीकरण प्रश्न टेक्स्ट में कोई मूल्यांकन गणना है, तो वह मान डेटाबेस में एक वेरिएबल में सेव होगा, जिसे सार्वजनिक या निजी आँकड़ों में दिखाया जा सकता है।
यह डेटाबेस में मूल्यांकन स्कोर सेव करने के एक आम अनुरोध का समाधान करता है।
सिंटैक्स
कर्ली ब्रैकेट के भीतर मौजूद हर चीज़ को अब एक एक्सप्रेशन माना जाता है (एक अपवाद के साथ: शुरुआत या अंत में कोई खाली स्थान (व्हाइटस्पेस) नहीं होना चाहिए - यह इसलिए ज़रूरी है ताकि Expression Manager एम्बेडेड JavaScript को प्रोसेस करने की कोशिश न करे)।
ध्यान दें, एक्सप्रेशन कई पंक्तियों में फैले हो सकते हैं, बशर्ते शुरुआती कर्ली ब्रैकेट के बाद या अंतिम कर्ली ब्रैकेट से पहले कोई खाली स्थान न हो। यह नेस्टेड if() स्टेटमेंट के लिए विशेष रूप से उपयोगी है, जैसे:
{if(is_empty(PFTotals),
'',
if(PFTotals >= -5 && PFTotals <= -4,
'Very Soft',
if(PFTotals >= -3 && PFTotals <= -2,
'Soft',
if(PFTotals == -1,
'Somewhat Soft',
if(PFTotals == 0,
'Moderate',
if(PFTotals == 1,
'Somewhat Hard',
if(PFTotals >= 2 && PFTotals <= 3,
'Hard',
if(PFTotals >= 4 && PFTotals <= 5,
'Very Hard',
''
)
)
)
)
)
)
)
)}
- सभी मानक गणितीय ऑपरेटर (जैसे +,-,*,/,!)
- सभी मानक तुलना ऑपरेटर (जैसे <,<=,==,!=,>,>=, साथ ही ये समकक्ष: lt,le,eq,ne,gt,ge)
- कोष्ठक (ताकि आप उप-एक्सप्रेशन को समूहित कर सकें)
- शर्त वाले ऑपरेटर (जैसे &&,| | और ये समकक्ष: and,or)
- सिंगल और डबल कोट वाली स्ट्रिंग (जिनमें से प्रत्येक के भीतर दूसरे प्रकार के कोट वाली स्ट्रिंग रखी जा सकती है)
- कॉमा ऑपरेटर (ताकि आप एक्सप्रेशन की सूची रख सकें और केवल अंतिम परिणाम लौटा सकें)
- असाइनमेंट ऑपरेटर (=)
- पूर्व-परिभाषित वेरिएबल (प्रश्नों, प्रश्न गुणों और प्रतिक्रियाओं का संदर्भ देने के लिए) - जैसे सभी SGQA कोड
- पूर्व-परिभाषित फ़ंक्शन (पहले से ही 70+ हैं, और और जोड़ना आसान है)
ऑपरेटर
EM सिंटैक्स सामान्य ऑपरेटर प्राथमिकता का पालन करता है:
| स्तर | ऑपरेटर | विवरण |
|---|---|---|
| 1 | () | समूह बनाने या फ़ंक्शन कॉल करने के लिए कोष्ठक |
| 2 | ! - + | एकल ऑपरेटर: नॉट, ऋणात्मक, धनात्मक |
| 3 | * / | गुणा, भाग |
| 4 | + - | जोड़, घटाव |
| 5 | < <= > >= lt le gt ge | सापेक्ष तुलना |
| 6 | == != eq ne | समानता की तुलना |
| 7 | and | तार्किक AND |
| 8 | or | तार्किक OR |
| 9 | = | असाइनमेंट ऑपरेटर |
| 10 | , | कॉमा ऑपरेटर |
प्लस ऑपरेटर (+) के बारे में चेतावनी
JavaScript और PHP के बीच एकरूपता के लिए, प्लस ऑपरेटर (+) तब जोड़ करता है जब दोनों ऑपरेंड संख्यात्मक हों, लेकिन जब दोनों भाग गैर-संख्यात्मक स्ट्रिंग हों तो उन्हें जोड़कर एक स्ट्रिंग बना देता है। हालाँकि, हम स्ट्रिंग जोड़ने के लिए join() फ़ंक्शन और संख्याओं के जोड़ के लिए sum() फ़ंक्शन का उपयोग करने की सलाह देते हैं, क्योंकि इससे आपका उद्देश्य अधिक स्पष्ट होता है, और यदि आप स्ट्रिंग की अपेक्षा कर रहे थे पर संख्याएँ मिल गईं (या इसके विपरीत) तो अप्रत्याशित परिणामों से बचाव होता है।
संख्या और स्ट्रिंग के बेमेल तथा वर्णानुक्रम तुलना के बारे में चेतावनी
जब आप मानों की सापेक्ष या समानता तुलना करना चाहें, तो प्रकार के बेमेल पर ध्यान दें। उपयोगकर्ता द्वारा दर्ज किया गया मान या चुना गया उत्तर कोड, यदि वह स्पष्ट रूप से संख्या है, तो संख्या के रूप में उपयोग किया जा सकता है।
यदि आप किसी मान को " से घेर देते हैं तो तुलना टेक्स्ट के रूप में (वर्णानुक्रम तुलना) होगी। यदि आप संख्यात्मक तुलना करना चाहते हैं, तो संख्या को कभी भी उद्धरण चिह्नों, ", में न रखें।
उदाहरण के लिए, यदि Q0.NAOK एक संख्यात्मक प्रश्न है जिसका मान 9 है, तो Q0.NAOK > "50" सत्य होगा। इसका कारण यह है कि ऑपरेटर > इसे वर्णानुक्रम तुलना मानेगा, संख्यात्मक नहीं।
पूर्णांक मान की तुलना सुनिश्चित करने के लिए आप intval(Q0.NAOK) > 50 का उपयोग कर सकते हैं, बस याद रखें कि यदि Q0.NAOK संख्या नहीं है (खाली है या स्ट्रिंग है), तो intval(Q0.NAOK) == 0 होगा। स्ट्रिंग मान ("A" < "B") की तुलना के लिए सीधे strcmp का उपयोग करें: strcmp(Q0.NAOK,"B") या strcmp(Q0.NAOK,"A5")।
असाइनमेंट ऑपरेटर (=) के उपयोग के बारे में सावधानी
ध्यान दें, जब तक बिल्कुल आवश्यक न हो, असाइनमेंट ऑपरेटर के उपयोग से बचना चाहिए, क्योंकि ये अप्रत्याशित दुष्प्रभाव पैदा कर सकते हैं। उदाहरण के लिए, यदि आप किसी पिछली प्रतिक्रिया का मान बदलते हैं, तो उस प्रश्न और वर्तमान प्रश्न के बीच का कैस्केडिंग प्रासंगिकता और सत्यापन लॉजिक दोबारा नहीं गिना जाता, इसलिए आपके पास आंतरिक रूप से असंगत डेटा हो सकता है (जैसे ऐसे प्रश्न जिनका उत्तर बना रहता है पर जिन्हें NULL हो जाना चाहिए था, या ऐसे प्रश्न जो छोड़ दिए गए पर जिनका उत्तर दिया जाना चाहिए था)। सामान्यतः, यदि आप किसी वेरिएबल को मान असाइन करना चाहते हैं, तो आपको समीकरण प्रश्न का प्रकार बनाना चाहिए और उसका मान सेट करने के लिए एक्सप्रेशन का उपयोग करना चाहिए। फिर भी, कुछ दुर्लभ अवसरों पर लोगों को इस ऑपरेटर की सचमुच ज़रूरत पड़ती है, इसलिए हमने इसे उपलब्ध कराया है।
इस ऑपरेटर के बारे में सावधान करने के लिए, इसे सिंटैक्स समीकरणों में लाल फ़ॉन्ट में दिखाया जाता है (ताकि आप इसे "==" से न मिला लें)।
असाइनमेंट ऑपरेटर का उपयोग
आप असाइनमेंट का उपयोग मुख्य रूप से इन कारणों से करना चाह सकते हैं:
- आपको ऐसे प्रश्न के लिए डिफ़ॉल्ट मान सेट करना है जो समीकरण के ज़रिए डिफ़ॉल्ट स्वीकार नहीं करता (जैसे लिस्ट रेडियो, जहाँ यूज़र इंटरफ़ेस आपको उत्तर विकल्पों में से एक चुनने देता है, लेकिन समीकरण दर्ज करने नहीं देता)। हालाँकि सावधान रहें, क्योंकि LimeSurvey यह सत्यापित नहीं कर पाएगा कि आपका समीकरण उस प्रश्न के लिए अनुमत उत्तरों में से कोई एक उत्पन्न करता है।
- आपको किसी बाद की प्रतिक्रिया के आधार पर पिछले प्रश्न की प्रतिक्रिया को ज़बरदस्ती बदलना है
- आपको जटिल कोटा चाहिए: कोटा के लिए एक छिपे हुए एकल विकल्प का उपयोग करें और उसे असाइनमेंट से सेट करें
- आदि...
इस उद्देश्य के लिए आप Expression Manager की सभी सुविधाओं का उपयोग कर सकते हैं।
कुछ उदाहरण:
- संक्षिप्त पाठ प्रश्न के उत्तर को लोअरकेस में सेट करें :
{QCODE=strtolower(QCODE.NAOK)} - सर्वेक्षण की शुरुआत में सरणी प्रश्न के प्रकार के लिए डिफ़ॉल्ट उत्तर सेट करें :
{Q1_SQ1=((is_empty(Q1_SQ1.NAOK),"A99",Q1_SQ1.NAOK)} - सर्वेक्षण की शुरुआत में सरणी टेक्स्ट प्रश्न के प्रकार के लिए डिफ़ॉल्ट उत्तर सेट करें :
{Q1_SQY1_SQX1 = ((is_empty(Q1_SQY1_SQX1.NAOK),"Inserted answer", Q1_SQY1_SQX1.NAOK)} - शर्त के साथ उत्तर सेट करें :
{QCODE=if(YesNo="Y","A1","")}
XSS सुरक्षा
XSS सक्षम होने पर, एक्सप्रेशन मैनेजर की कुछ सुविधाओं का उपयोग नहीं किया जा सकता:
- किसी एक्सप्रेशन में HTML टैग शुरू करना और उसे दूसरे एक्सप्रेशन में समाप्त करना
- URL में जटिल एक्सप्रेशन का उपयोग करना।
उदाहरण और समाधान
{if( 1 ,"<strong>","")}information{if( 1 ,"</strong>","")}XSS सुरक्षा के साथ काम नहीं करता; इसकी जगह आप{if(1,"<strong>information</strong>","information")}का उपयोग कर सकते हैं।<a href="/script.php?value={if(QCODE == "Y","yes","no")}">next</a>, यहाँ आप समीकरण प्रश्न का उपयोग कर सकते हैं, क्योंकि पूरे प्रश्न कोड का उपयोग करना ठीक है:<a href="/script.php?value={EQUATION.NAOK}">next</a>
वेरिएबल तक पहुँच
एक्सप्रेशन मैनेजर आपको जिन भी वेरिएबल की आवश्यकता हो, उन तक केवल-पढ़ने की पहुँच देता है। बैकवर्ड कम्पैटिबिलिटी के लिए यह निम्नलिखित तक पहुँच प्रदान करता है:
- TOKEN:xxx - किसी TOKEN का मान (जैसे TOKEN:FIRSTNAME, TOKEN:ATTRIBUTE_5) (केवल गैर-अनाम सर्वेक्षण के लिए)।
- QCODE.shown - एक्सप्रेशन मैनेजर का उपयोग करके किसी उत्तर का प्रदर्शित मान (जैसे "हां")।
- टेम्पलेट द्वारा उपयोग किए जाने वाले सभी {XXX} मान।
- प्रश्न टेक्स्ट में आप {QID} का उपयोग कर सकते हैं, जो प्रश्न की आईडी से बदल दिया जाता है, और {SGQ} का, जो प्रश्न के SGQA से बदल दिया जाता है।
इसके अलावा, एक्सप्रेशन मैनेजर आपको वेरिएबल को प्रश्न कोड (डेटाबेस की प्रश्न तालिका का 'title' कॉलम) से संदर्भित करने देता है। SPSS, R या SAS में डेटा एक्सपोर्ट करते समय यही वेरिएबल लेबल के रूप में भी उपयोग होता है। उदाहरण के लिए, यदि आपके पास नाम, आयु और लिंग के बारे में प्रश्न हैं, तो आप उन वेरिएबल को 12345X13X22, 12345X13X23 और 12345X13X24 की जगह name, age और gender कह सकते हैं। इससे समीकरणों को पढ़ना और उनके तर्क को सत्यापित करना सभी के लिए आसान हो जाता है, साथ ही समूह या प्रश्न संख्याओं का हिसाब रखे बिना प्रश्नों का क्रम बदलना भी संभव हो जाता है।
महत्वपूर्ण: केवल पिछले पृष्ठों या प्रश्नों में आने वाले वेरिएबल को संदर्भित करना ही सुरक्षित है।
इसके अलावा, एक्सप्रेशन मैनेजर आपको प्रश्न के कई गुणों तक पहुँचने देता है:
| सिंटैक्स | अर्थ | उदाहरण | उदाहरण का परिणाम |
|---|---|---|---|
| Qcode | Qcode.code का उपनाम | {implode(',',name,gender)} | 'Tom','M' |
| Qcode.code | यदि प्रश्न प्रासंगिक है तो उसके लिए चुना गया प्रतिक्रिया कोड (अन्यथा खाली), या यदि यह कोडित प्रश्न नहीं है तो टेक्स्ट मान | {implode(',',name.code,gender.code)} | 'Tom','M' |
| Qcode.NAOK | Qcode के समान - NAOK की चर्चा देखें | {gender.NAOK} | 'M' |
| Qcode.value | यदि प्रश्न प्रासंगिक है तो उसके लिए मूल्यांकन मान (अन्यथा खाली), या यदि यह कोडित प्रश्न नहीं है तो टेक्स्ट मान | {gender.value} | '1' |
| Qcode.valueNAOK | Qcode.value के समान - NAOK की चर्चा देखें | {gender.valueNAOK} | '1' |
| Qcode.shown | प्रश्न का प्रदर्शित मान | {implode(',',name.shown,gender.shown)} | 'Tom','Male' |
| Qcode.question | प्रश्न का टेक्स्ट | {gender.question} | 'What is your gender?' |
| Qcode.mandatory | प्रश्न अनिवार्य है या नहीं (Y/N) | {gender.mandatory} | 'N' |
| Qcode.qid | प्रश्न की आंतरिक संख्या (क्रमिक संख्या नहीं) | {gender.qid} | 337 |
| Qcode.type | प्रश्न का प्रकार | {gender.type} | 'G' |
| Qcode.jsName | प्रश्न का सही जावास्क्रिप्ट नाम, चाहे वह इस पृष्ठ पर घोषित हो या नहीं | {gender.jsName} | 'java1827X3X337' |
| Qcode.gid | समूह की आंतरिक संख्या (क्रमिक संख्या नहीं) | {gender.gid} | 3 |
| Qcode.qseq | प्रश्न की क्रमिक संख्या, 0 से शुरू | {gender.qseq} | 5 |
| Qcode.gseq | समूह की क्रमिक संख्या, 0 से शुरू | {gender.gseq} | 1 |
| Qcode.relevanceStatus | प्रश्न वर्तमान में प्रासंगिक है या नहीं (0 या 1) | {gender.relevanceStatus} | 1 |
| Qcode.relevance | प्रश्न-स्तर का प्रासंगिकता समीकरण | {gender.relevance} | '!is_empty(name)' |
| Qcode.grelevance | समूह-स्तर का प्रासंगिकता समीकरण | {gender.grelevance} | 'num_children >= 5' |
| Qcode.sgqa | इस प्रश्न का SGQA मान | {gender.sgqa} | '1827X3X337' |
HTML संपादक की समस्या
यदि आप HTML संपादक का उपयोग करते हैं, तो कुछ वर्ण HTML एंटिटी से बदल दिए जाते हैं।
- & को & से
- < को < से
- > को > से
यदि आप HTML संपादक का उपयोग करते हैं, तो आपको इनका उपयोग करना होगा:
- & के लिए and
- < के लिए lt
- <= के लिए le
- > के लिए gt
- >= के लिए ge
Qcode वेरिएबल नामकरण
यहाँ प्रश्न के प्रकार के अनुसार Qcode बनाने (और कुछ गुणों तक पहुँचने) का विवरण दिया गया है। सामान्यतः Qcode इस प्रकार बनाए जाते हैं:
QuestionCode . '_' . SubQuestionCode . '_' . ScaleId
उप-प्रश्न कोड और स्केल ID का उपयोग करना है या नहीं, यह प्रश्न के प्रकार पर निर्भर करता है - नीचे दी गई तालिका देखें। comment और other के लिए प्रश्न कोड QuestionCode_comment और QuestionCode_other होते हैं।
| प्रकार | विवरण | कोड | उप-प्रश्न | जवाब विकल्प | स्केल | उत्तर कोड | प्रदर्शित उत्तर | प्रासंगिकता |
|---|---|---|---|---|---|---|---|---|
| 5 | 5 बिंदु वाले विकल्प रेडियो-बटन | Q1 | 1-5 | {Q1} | {Q1.shown} | {Q1==3} | ||
| B | सरणी (10 बिंदु वाले विकल्प) रेडियो-बटन | Q2 | L1-L6 | 1-10 | {Q2_L2} | {Q2_L2.shown} | {Q2_L2==7} | |
| A | सरणी (5 बिंदु वाले विकल्प) रेडियो-बटन | Q3 | 1-5 | 1-5 | {Q3_1} | {Q3_1.shown} | {Q3_1>=3} | |
| 1 | सरणी (लचीले लेबल) दोहरा स्केल | Q4 | sq1-sq5 | 0:a1-a3 | 1:b1-b3 | {Q4_sq1_0} | {Q4_sq1_1.shown} | {Q4_sq1_1=='b2'} |
| H | सरणी (लचीली) - कॉलम प्रारूप | Q5 | 1-5 | s,m,t | {Q5_1} | {Q5_1.shown} | {Q5_1=='s'} | |
| F | सरणी (लचीली) - पंक्ति प्रारूप | Q6 | F1-F5 | 1-5 | {Q6_F3} | {Q6_F3.shown} | {Q6_F3==4} | |
| E | सरणी (बढ़ाएँ / वही घटाएँ /) रेडियो-बटन | Q7 | 1-7 | I,S,D | {Q7_4} | {Q7_4.shown} | {Q7_4=='D'} | |
| : | सरणी (मल्टी फ्लेक्सी) 1 से 10 | Q8 | ls1,todo,ls2 | min,max,avg | {Q8_ls1_max} | {Q8_ls2_avg.shown} | {Q8_ls2_min==7} | |
| ; | सरणी (मल्टी फ्लेक्सी) टेक्स्ट | Q9 | hp,st,sw | 1st,2nd,3rd | {Q9_hp_3rd} | {Q9_hp_3rd.shown} | {Q9_hp_3rd=='Peter'} | |
| C | सरणी (हां/अनिश्चित/नहीं) रेडियो-बटन | Q10 | 1-5 | Y,N,U | {Q10_1} | {Q10_1.shown} | {Q10_3=='Y'} | |
| X | बॉयलरप्लेट प्रश्न | Q11 | {Q11.shown} | |||||
| D | तिथि | Q12 | {Q12} | {Q12.shown} | ||||
| * | समीकरण | Q13 | {Q13} | {Q13.shown} | {Q13>5} | |||
| ~124~ | अपलोड फ़ाइल (अपलोड की गई फ़ाइलों की संख्या दर्ज करता है) | Q14 | {Q14} | {Q14>0} | ||||
| G | लिंग ड्रॉपडाउन सूची | Q15 | M,F | {Q15} | {Q15.shown} | {Q15=='M'} | ||
| U | बड़ा मुफ़्त टेक्स्ट | Q16 | {Q16} | {Q16.shown} | {strlen(Q16)>100} | |||
| I | भाषा प्रश्न | Q17 | {Q17} | {Q17.shown} | {Q17=='en'} | |||
| ! | सूची - ड्रॉपडाउन | Q18 | 1-5 | {Q18} | {Q18.shown} | {Q18==3} | ||
| L | सूची ड्रॉपडाउन/रेडियो-बटन सूची | Q19 | A-Z | {Q19} | {Q19.shown} | {Q19=='X'} | ||
| O | टिप्पणी के साथ सूची ड्रॉपडाउन/रेडियो-बटन सूची + टेक्स्ट एरिया | Q20 | A-F | {Q20},{Q20comment} | {Q20.shown} | {Q20=='B'} | ||
| T | लंबे मुफ़्त टेक्स्ट | Q21 | {Q21} | {Q21.shown} | {strstr(Q21,'hello')>0} | |||
| M | एकाधिक विकल्प चेकबॉक्स | Q22 | A-F, other | {Q22_E}, {Q22_other} | {Q22_E.shown}, {Q22_other.shown} | {Q22_E=='Y'} | ||
| P | टिप्पणी के साथ एकाधिक विकल्प चेकबॉक्स + टेक्स्ट | Q23 | A-F | {Q23_D}, {Q23_Dcomment} | {Q23_D.shown} | {!is_empty(Q23)} | ||
| K | एकाधिक संख्यात्मक प्रश्न | Q24 | self,mom,dad | {Q24_self} | {Q24_self.shown} | {Q24_self>30} | ||
| Q | एक से ज़्यादा छोटे टेक्स्ट | Q25 | A-F | {Q25_B} | {Q25_B.shown} | {substr(Q25_B,1,1)=='Q'} | ||
| N | संख्यात्मक प्रश्न प्रकार | Q26 | {Q26} | {Q26.shown} | {Q26 > 30} | |||
| R | रैंकिंग शैली | Q27 | 1-4 | {Q27_1} | {Q27_1.shown} | {Q27_1==3} | ||
| S | छोटा मुफ़्त टेक्स्ट | Q28 | {Q28} | {Q28.shown} | {Q28=='mine'} | |||
| Y | हां/नहीं रेडियो-बटन | Q29 | {Q29} | {Q29.shown} | {Q29=='Y'} |
आरक्षित 'this', 'self' और 'that' वेरिएबल
अक्सर आप किसी प्रश्न के सभी हिस्सों का मूल्यांकन करना चाहते हैं, जैसे यह गिनना कि कितने उप-प्रश्नों के उत्तर दिए गए हैं, या स्कोर जोड़ना। कभी-कभी आप प्रश्न की केवल कुछ पंक्तियों या कॉलम को प्रोसेस करना चाहते हैं (जैसे पंक्ति या कॉलम का योग निकालकर डेटाबेस में सहेजना)। ये आरक्षित वेरिएबल इस प्रक्रिया को काफ़ी आसान बना देते हैं।
'this' वेरिएबल का उपयोग केवल "पूरे प्रश्न का सत्यापन समीकरण" और "उप-प्रश्न सत्यापन समीकरण" उन्नत प्रश्न विकल्पों के भीतर किया जाता है। यह उन प्रश्नों के प्रत्येक सेल के वेरिएबल नामों में विस्तारित हो जाता है। इसलिए, यदि आप सुनिश्चित करना चाहते हैं कि प्रत्येक प्रविष्टि तीन से बड़ी हो, तो आप "उप-प्रश्न सत्यापन समीकरण" को (this > 3) पर सेट करेंगे।
'self' और 'that' वेरिएबल अधिक शक्तिशाली हैं, और ये मैक्रो का काम करते हैं जो समीकरणों को प्रोसेस करने से पहले विस्तारित हो जाते हैं। सिंटैक्स के विकल्प ये हैं:
- self
- self.suffix
- self.sub-selector
- self.sub-selector.suffix
suffix कोई भी सामान्य qcode प्रत्यय है (जैसे NAOK, value, shown)
sub-selector इनमें से एक है:
- comments - केवल वे उप-प्रश्न जो टिप्पणियाँ हैं (जैसे टिप्पणी के साथ एकाधिक विकल्प और टिप्पणी के साथ सूची से)
- nocomments - केवल वे उप-प्रश्न जो टिप्पणियाँ नहीं हैं
- sq_X - जहाँ X किसी पंक्ति या कॉलम का पहचानकर्ता है। केवल वे उप-प्रश्न चुने जाते हैं जो पैटर्न X से मेल खाते हैं। ध्यान दें कि खोज पूरे कोड पहचानकर्ता पर की जाती है, फिर sq_X मेल खाता है और उप-प्रश्न nX, X, Xn को शामिल करता है (जैसे यदि आप sq_1 का उपयोग करते हैं, तो उप-प्रश्न a1, 1a, 1, 11 या 001 शामिल किए जाएँगे)। दोहरे स्केल प्रश्न प्रकार पर ध्यान दें, जहाँ उप-प्रश्न कोड QCODE_SQCODE_1 और QCODE_SQCODE_1 होते हैं, और रैंकिंग प्रश्न प्रकार पर, जहाँ उप-प्रश्न कोड QCODE_1,QCODE_2 .... होते हैं।
- nosq_X - जहाँ X किसी पंक्ति या कॉलम का पहचानकर्ता है। केवल वे उप-प्रश्न चुने जाते हैं जो पैटर्न X से मेल नहीं खाते। ध्यान दें कि खोज पूरे कोड पहचानकर्ता पर की जाती है, फिर nosq_X मेल खाता है और उप-प्रश्न nX, X, Xn को शामिल नहीं करता
उदाहरण:
- क्या प्रश्न के किसी भी हिस्से का उत्तर दिया गया है? {count(self.NAOK)>0}
- इस प्रश्न का मूल्यांकन स्कोर क्या है? {sum(self.value)}
आप इनका उपयोग पंक्ति और कॉलम का योग निकालने के लिए भी कर सकते हैं। मान लें कि आपके पास पंक्तियों A-E और कॉलम 1-5 वाली संख्याओं की एक सरणी है।
- कुल योग क्या है? {sum(self.NAOK)}
- पंक्ति B का योग क्या है? {sum(self.sq_B.NAOK)}
- कॉलम 3 का योग क्या है? {sum(self.sq_3.NAOK)}
'that' वेरिएबल 'self' वेरिएबल जैसा ही है, लेकिन यह आपको अन्य प्रश्नों को संदर्भित करने देता है। इसका सिंटैक्स है:
- that.qname
- that.qname.suffix
- that.qname.sub-selector
- that.qname.sub-selector.suffix
qname उप-प्रश्न एक्सटेंशन के बिना प्रश्न का नाम है। इसलिए, मान लें कि आप एक प्रश्न 'q1' बनाते हैं, तो वही उसका qname है
उदाहरण:
- क्या प्रश्न q1 के किसी भी हिस्से का उत्तर दिया गया है? {count(that.q1.NAOK)>0}
- q2 का मूल्यांकन स्कोर क्या है? {sum(that.q2.NAOK)}
- q3 का कुल योग क्या है? {sum(that.q3.NAOK)}
- q4 में पंक्ति C का योग क्या है? {sum(that.q4.sq_C.NAOK)}
- q4 में कॉलम 2 का योग क्या है? {sum(that.q4.sq_2.NAOK)}
'self' और 'that' वेरिएबल का उपयोग किसी भी प्रासंगिकता, सत्यापन या टेलरिंग में किया जा सकता है।
एक बात ध्यान रखें कि जब आप लॉजिक फ़ाइल दिखाएँ सुविधा का उपयोग करते हैं, तो यह 'self' और 'that' का विस्तारित मान दिखाएगी। इससे आप वह वास्तविक समीकरण देख सकते हैं जो बनेगा, ताकि आप (और एक्सप्रेशन मैनेजर) सत्यापित कर सकें कि वेरिएबल मौजूद हैं। यह भ्रमित करने वाला लग सकता है, क्योंकि आपको काफ़ी लंबे समीकरण दिख सकते हैं। हालाँकि, यदि आप प्रश्न को एडिट करेंगे, तो आपको 'self' और/या 'that' का उपयोग करने वाला मूल समीकरण दिखेगा।
यह भी ध्यान रखें कि इन वेरिएबल का उपयोग न करें यदि (a) आप किसी समीकरण में उपयोग किए गए प्रत्येक वेरिएबल का स्पष्ट रूप से नाम देना चाहते हैं, या (b) ऐसे वेरिएबल का उपयोग कर रहे हैं जिनमें उप-प्रश्न नहीं हैं (उदाहरण के लिए, एकल उत्तर वाले प्रश्न)। ऐसे मामलों में, किसी वेरिएबल के आगे 'that' लगाना अनावश्यक है, और इससे अप्रत्याशित परिणाम मिलने का जोखिम रहता है।
NAOK का उपयोग
NAOK --> "Not Applicable" (NA) is alright (OK), यानी "लागू नहीं" होना ठीक है
NAOK का उपयोग करने का अर्थ है कि सभी या कुछ वेरिएबल अप्रासंगिक हैं (यानी "Not Applicable" (NA) is alright (OK))।
जब आप किसी प्रश्न के वेरिएबल को किसी समीकरण में रखते हैं: यदि वह प्रश्न (या उप-प्रश्न) किसी शर्त के कारण छिपा हुआ है, तो पूरा समीकरण अक्षम हो जाता है।
उदाहरण के लिए: यदि Q1 का कोई एक उप-प्रश्न फ़िल्टर किया गया है, तो count(Q1_SQ1,Q1_SQ2,Q1_SQ3,Q1_SQ4) हमेशा खाली स्ट्रिंग लौटाता है। ऐसे प्रश्न में चुने गए उप-प्रश्नों की संख्या गिनने के लिए count(Q1_SQ1.NAOK,Q1_SQ2.NAOK,Q1_SQ3.NAOK,Q1_SQ4.NAOK) का उपयोग किया जा सकता है। यदि उप-प्रश्न छिपा हुआ है: Expression Manager खाली स्ट्रिंग लौटाता है।
NAOK के बिना: यदि कोई प्रश्न या कोई उप-प्रश्न छिपा हुआ है, तो Expression Manager हमेशा खाली स्ट्रिंग लौटाता है, जो false लौटाने के समान है।
.shown हमेशा NAOK प्रणाली का उपयोग करता है (छिपे होने पर खाली स्ट्रिंग), लेकिन यदि आपको उत्तर का कोड चाहिए: तो प्रश्न कोड के बाद .NAOK जोड़ना हमेशा अच्छा रहता है। केवल तभी इसे छोड़ें जब आपको इसकी आवश्यकता हो और आप जानते हों कि आप क्या कर रहे हैं।
एक और उदाहरण और जानकारी Overriding Cascading Conditions पर उपलब्ध है
फ़ंक्शन तक पहुँच
Expression Manager गणितीय, स्ट्रिंग और उपयोगकर्ता-परिभाषित फ़ंक्शन तक पहुँच प्रदान करता है, जैसा कि नीचे दिखाया गया है। इन फ़ंक्शन के PHP और JavaScript समकक्ष उपलब्ध हैं, ताकि वे सर्वर-साइड (PHP) और क्लाइंट-साइड (JavaScript) पर एक समान रूप से काम करें। नए फ़ंक्शन जोड़ना आसान है।
लागू किए गए फ़ंक्शन
वर्तमान में निम्नलिखित फ़ंक्शन उपलब्ध हैं:
| फ़ंक्शन | अर्थ | सिंटैक्स |
|---|---|---|
| abs | निरपेक्ष मान | number abs(number) |
| acos | आर्क कोसाइन | number acos(number) |
| addslashes | स्ट्रिंग को स्लैश के साथ उद्धृत करें | string addslashes(string) |
| asin | आर्क साइन | number asin(number) |
| atan | आर्क स्पर्शरेखा | number atan(number) |
| atan2 | दो चर के आर्क स्पर्शरेखा | number atan2(number, number) |
| ceil | अपूर्णांकों को ऊपर की ओर पूर्णांकित करें | number ceil(number) |
| checkdate | यदि ग्रेगोरियन कैलेंडर में तारीख मान्य है तो true(1) लौटाता है | bool checkdate(month,day,year) |
| convert_value | संख्यात्मक मानों की inputTable और outputTable का उपयोग करके एक संख्यात्मक मान को परिवर्तित करें | number convert_value(fValue, iStrict, sTranslateFromList, sTranslateToList) |
| cos | कोसाइन | number cos(number) |
| count | सूची में उत्तर दिए गए (रिक्त नहीं) प्रश्नों की संख्या गिनें | number count(arg1, arg12, ..., argN) |
| countif | सूची में पहले तर्क के बराबर उत्तर वाले प्रश्नों की संख्या गिनें | number countif(matches, arg1, arg2, ... argN) |
| countifop | सूची में उन उत्तर दिए गए प्रश्नों की संख्या गिनें जो मानदंड (arg op value) को पूरा करते हैं | number countifop(op, value, arg1, arg2, ... argN) |
| date | स्थानीय तारीख/समय को स्वरूपित करें | string date(format [, timestamp=time()]) |
| exp | ई के प्रतिपादक का परिकलन | number exp(number) |
| fixnum | आवश्यकता होने पर संख्याओं को अल्पविराम को दशमलव विभाजक बनाकर प्रदर्शित करें | string fixnum(number) |
| floor | अपूर्णांकों को नीचे की ओर पूर्णांकित करें | number floor(number) |
| gmdate | GMT तारीख/समय को स्वरूपित करें | string gmdate(format [, timestamp=time()]) |
| html_entity_decode | सभी HTML एंटिटीज़ को उनके संबंधित वर्णों में बदलें (हमेशा ENT_QUOTES और UTF-8 का उपयोग करता है) | string html_entity_decode(string) |
| htmlentities | सभी संबंधित वर्णों को HTML एंटिटीज़ में बदलें (हमेशा ENT_QUOTES और UTF-8 का उपयोग करता है) | string htmlentities(string) |
| expr_mgr_htmlspecialchars | विशेष वर्णों को HTML एंटिटीज़ में बदलें (हमेशा ENT_QUOTES और UTF-8 का उपयोग करता है) | string htmlspecialchars(string) |
| expr_mgr_htmlspecialchars_decode | विशेष HTML एंटिटीज़ को वापस वर्णों में बदलें (हमेशा ENT_QUOTES और UTF-8 का उपयोग करता है) | string htmlspecialchars_decode(string) |
| idate | पूर्णांक के रूप में स्थानीय समय/तारीख को स्वरूपित करें | string idate(string [, timestamp=time()]) |
| if (Updated in 3.0.2 ) | Excel-शैली का if(test,result_if_true[,result_if_false = ""]) | if(test,result_if_true[,result_if_false = ""]) |
| implode | एक स्ट्रिंग के साथ सरणी तत्वों को सम्मिलित करें | string implode(glue,arg1,arg2,...,argN) |
| intval | एक चर का पूर्णांक मान प्राप्त करें | int intval(number [, base=10]) |
| is_empty | निर्धारित करें कि कोई चर रिक्त माना जाता है या नहीं | bool is_empty(var) |
| is_float | पता लगाएं कि क्या किसी चर का प्रकार float है | bool is_float(var) |
| is_int | पता लगाएं कि क्या किसी चर का प्रकार integer है | bool is_int(var) |
| is_nan | पता लगाएं कि क्या मान कोई संख्या नहीं है | bool is_nan(var) |
| is_null | पता लगाएं कि क्या एक चर NULL है | bool is_null(var) |
| is_numeric | पता लगाएं कि क्या कोई चर संख्या या संख्यात्मक स्ट्रिंग है | bool is_numeric(var) |
| is_string | पता लगाएं कि क्या किसी चर का प्रकार string है | bool is_string(var) |
| join (New in 2.0 build 130129) | तत्वों को जोड़कर नई स्ट्रिंग बनाएं | join(arg1, arg2, ... argN) |
| list | रिक्त न होने वाले मानों की अल्पविराम-पृथक सूची लौटाएं | string list(arg1, arg2, ... argN) |
| listifop (New in 3.16.1 ) | सूची के उन प्रश्नों से, जो मानदंड (cmpProp op value) को पूरा करते हैं, निर्दिष्ट प्रश्न गुण (retProp) की 'glue'-पृथक सूची लौटाएं | string listifop(cmpProp, op, value, retProp, glue, sgqa1, sgqa2, ... sgqaN) |
| log | संख्या का दिए गए आधार पर लघुगणक, या आधार न दिया हो तो प्राकृतिक लघुगणक। | number log(number,base=e) |
| ltrim | स्ट्रिंग की शुरुआत से रिक्त स्थान (या अन्य वर्ण) हटाएं | string ltrim(string [, charlist]) |
| max | सबसे बड़ा मान खोजें | number max(arg1, arg2, ... argN) |
| min | सबसे छोटा मान खोजें | number min(arg1, arg2, ... argN) |
| mktime | किसी तारीख के लिए UNIX टाइमस्टैम्प प्राप्त करें (सभी 6 तर्क वैकल्पिक हैं) | number mktime([hour [, minute [, second [, month [, day [, year ]]]]]]) |
| modulo-function | मॉड्यूलो फ़ंक्शन अभी समर्थित नहीं है। आप इसके बजाय floor() फ़ंक्शन का उपयोग कर सकते हैं | floor(x/y)==(x/y) |
| nl2br | स्ट्रिंग में सभी नई पंक्तियों से पहले HTML लाइन ब्रेक जोड़ता है | string nl2br(string) |
| number_format | समूहीकृत हजारों के साथ एक संख्या स्वरूपित करें | string number_format(number) |
| pi | pi का मान प्राप्त करें | number pi() |
| pow | घातीय अभिव्यक्ति | number pow(base, exp) |
| quoted_printable_decode | quoted-printable स्ट्रिंग को 8 बिट स्ट्रिंग में बदलें | string quoted_printable_decode(string) |
| quoted_printable_encode | 8 बिट स्ट्रिंग को quoted-printable स्ट्रिंग में बदलें | string quoted_printable_encode(string) |
| quotemeta | मेटा वर्णों को उद्धृत करें | string quotemeta(string) |
| rand | एक यादृच्छिक पूर्णांक उत्पन्न करें, यह उदाहरण देखें | int rand() OR int rand(min, max) |
| regexMatch | किसी स्ट्रिंग की तुलना नियमित अभिव्यक्ति से करें | bool regexMatch(pattern,input) |
| round | एक वैकल्पिक सटीकता तक संख्या को पूर्णांकित करता है | number round(val [, precision]) |
| rtrim | स्ट्रिंग के अंत से रिक्त स्थान (या अन्य वर्ण) हटाएं | string rtrim(string [, charlist]) |
| sin | साइन | number sin(arg) |
| sprintf | एक स्वरूपित स्ट्रिंग लौटाएं | string sprintf(format, arg1, arg2, ... argN) |
| sqrt | वर्गमूल | number sqrt(arg) |
| stddev | संख्याओं की सूची के लिए नमूना मानक विचलन परिकलित करें | number stddev(arg1, arg2, ... argN) |
| str_pad | किसी स्ट्रिंग को दूसरी स्ट्रिंग से भरकर निश्चित लंबाई तक बढ़ाएं | string str_pad(input, pad_length [, pad_string]) |
| str_repeat | स्ट्रिंग दोहराएं | string str_repeat(input, multiplier) |
| str_replace | खोजी गई स्ट्रिंग की सभी घटनाओं को प्रतिस्थापन स्ट्रिंग से बदलें | string str_replace(search, replace, subject) |
| strcasecmp | बाइनरी-सुरक्षित, अक्षर-आकार की उपेक्षा करने वाली स्ट्रिंग तुलना | int strcasecmp(str1, str2) |
| strcmp | बाइनरी-सुरक्षित स्ट्रिंग तुलना | int strcmp(str1, str2) |
| strip_tags | स्ट्रिंग से HTML और PHP टैग हटाएं | string strip_tags(str, allowable_tags) |
| stripos | अक्षर-आकार की उपेक्षा करने वाली यूनिकोड स्ट्रिंग की पहली घटना की स्थिति खोजें (0 से शुरू, न मिलने पर false लौटाता है) | int stripos(haystack, needle [, offset=0]) |
| stripslashes | उद्धृत स्ट्रिंग से उद्धरण हटाएं | string stripslashes(string) |
| stristr | अक्षर-आकार की उपेक्षा करने वाला strstr | string stristr(haystack, needle [, before_needle=false]) |
| strlen | स्ट्रिंग की लंबाई प्राप्त करें | int strlen(string) |
| strpos | यूनिकोड स्ट्रिंग की पहली घटना की स्थिति खोजें (0 से शुरू, न मिलने पर false लौटाता है) | int strpos(haystack, needle [ offset=0]) |
| strrev | स्ट्रिंग को उलटें | string strrev(string) |
| strstr | एक स्ट्रिंग की पहली घटना का पता लगाएं | string strstr(haystack, needle[, before_needle=false]) |
| strtolower | स्ट्रिंग को छोटे अक्षरों में बदलें | string strtolower(string) |
| strtotime | लगभग किसी भी अंग्रेज़ी पाठ्य दिनांक-समय विवरण को Unix टाइमस्टैम्प में पार्स करें | int strtotime(string) |
| strtoupper | स्ट्रिंग को बड़े अक्षरों में बदलें | string strtoupper(string) |
| substr | यूनिकोड स्ट्रिंग का एक भाग लौटाएं | string substr(string, start [, length]) |
| sum | एक सरणी में मानों का योग परिकलित करें | number sum(arg1, arg2, ... argN) |
| sumifop | सूची में उन उत्तर दिए गए प्रश्नों के मानों का योग करें जो मानदंड (arg op value) को पूरा करते हैं | number sumifop(op, value, arg1, arg2, ... argN) |
| tan | स्पर्शरेखा | number tan(arg) |
| time | वर्तमान यूनिक्स टाइमस्टैम्प लौटाएं | number time() |
| trim | स्ट्रिंग की शुरुआत और अंत से रिक्त स्थान (या अन्य वर्ण) हटाएं | string trim(string [, charlist]) |
| ucwords | स्ट्रिंग के प्रत्येक शब्द का पहला अक्षर बड़े अक्षर में करें | string ucwords(string) |
| unique | यदि सभी रिक्त न होने वाले उत्तर अद्वितीय हैं तो true लौटाता है | boolean unique(arg1, ..., argN) |
योजनाबद्ध या विचाराधीन फ़ंक्शन
अन्य फ़ंक्शन जो योजनाबद्ध (या विचाराधीन) हैं लेकिन अभी लागू नहीं किए गए हैं, उनमें निम्नलिखित शामिल हैं। इनमें से कुछ किसी अन्य सर्वेक्षण टूल के साथ पश्चगामी संगतता के लिए हैं।
| सिंटैक्स | अर्थ | टिप्पणियाँ |
|---|---|---|
| e() | e का मान लौटाता है | |
| formatDate(X,PAT) | तारीख X का स्ट्रिंग मान लौटाता है, जो Java तिथि प्रारूप पैटर्न PAT के अनुसार स्वरूपित हो | |
| formatNumber(X,PAT) | संख्या X का स्ट्रिंग मान लौटाता है, जो Java संख्या प्रारूप पैटर्न PAT के अनुसार स्वरूपित हो | |
| getAnsOption(X) | कोर प्लगइन ExpressionAnswerOptions | |
| getAnsOption(X,Y) | कोर प्लगइन ExpressionAnswerOptions | |
| getRelevance(X) | प्रश्न X का प्रासंगिकता समीकरण लौटाता है | |
| getStartTime() | इंटरव्यू शुरू होने के समय का सिस्टम समय के अनुरूप दिनांक लौटाता है | |
| getType(X) | डेटाटाइप का स्ट्रिंग नाम लौटाता है - जैसे isNA() होने पर *NA* | |
| gotoFirst() | प्रासंगिक प्रश्नों के पहले समूह पर जाता है - यह सिस्टम के सामान्य प्रवाह का उल्लंघन करता है | |
| gotoNext() | प्रासंगिक प्रश्नों के अगले समूह पर जाता है - यह सिस्टम के सामान्य प्रवाह का उल्लंघन करता है | |
| gotoPrevious() | प्रासंगिक प्रश्नों के पिछले समूह पर जाता है - यह सिस्टम के सामान्य प्रवाह का उल्लंघन करता है | |
| isAsked(X) | यदि उत्तर न तो *NA*, न *INVALID* और न ही *UNASKED* है, तो true लौटाता है | |
| isInvalid(X) | यदि उत्तर का प्रकार *INVALID* है, तो true लौटाता है | |
| isNA(X) | यदि उत्तर का प्रकार *NA* है, तो true लौटाता है | |
| isNotUnderstood(X) | यदि उत्तर का प्रकार *HUH* है, तो true लौटाता है | |
| isRefused(X) | यदि उत्तर का प्रकार *REFUSED* है, तो true लौटाता है | |
| isSpecial(X) | यदि उत्तर का प्रकार *UNASKED*, *NA*, *REFUSED*, *INVALID*, *UNKNOWN* या *HUH* है, तो true लौटाता है | |
| isUnknown(X) | यदि उत्तर का प्रकार *UNKNOWN* है, तो true लौटाता है | |
| jumpTo(X) | नामित प्रश्न वाले समूह पर जाता है -- यह सिस्टम के सामान्य प्रवाह का उल्लंघन करता है | |
| jumpToFirstUnasked() | पहले न पूछे गए प्रश्न पर जाता है |
|
| lastIndexOf(X,Y) | स्ट्रिंग X में स्ट्रिंग Y का अंतिम इंडेक्स (आधार 0) लौटाता है। यदि Y, X में नहीं है तो -1 लौटाता है | |
| list(X,...) | धनात्मक मानों की अल्पविराम से अलग की गई सूची वाली स्ट्रिंग, जिसमें अंतिम दो मानों के बीच "और" लगा होता है | |
| mean(X,...) | मानों की सूची का माध्य लौटाता है | |
| numAnsOptions(X) | प्रश्न X के जवाब विकल्पों की संख्या लौटाता है | |
| orlist(X,...) | धनात्मक मानों की अल्पविराम से अलग की गई सूची वाली स्ट्रिंग, जिसमें अंतिम दो मानों के बीच "या" लगा होता है | |
| parseDate(X,PAT) | Java तिथि प्रारूप पैटर्न PAT से पार्स की गई स्ट्रिंग X का दिनांक मान लौटाता है | |
| parseNumber(X,PAT) | Java संख्या प्रारूप पैटर्न PAT से पार्स की गई स्ट्रिंग X का संख्यात्मक मान लौटाता है | |
| showAllResponsesExcept( questionList,attributeList,attributeTitleList) | ) से अलग की गई सूची; attributeList = गुणों की पाइप से अलग की गई सूची (जैसे question#, title, text, type - ताकि आप तय कर सकें कि क्या दिखाना है); attributeTitleList = तालिका शीर्षकों की पाइप से अलग की गई सूची, ताकि रिपोर्ट का अंतर्राष्ट्रीयकरण किया जा सके। | |
| showTheseResponses( questionList,attributeList,attributeTitleList) | ) से अलग की गई सूची; attributeList = गुणों की पाइप से अलग की गई सूची (जैसे question#, title, text, type - ताकि आप तय कर सकें कि क्या दिखाना है); attributeTitleList = तालिका शीर्षकों की पाइप से अलग की गई सूची, ताकि रिपोर्ट का अंतर्राष्ट्रीयकरण किया जा सके। |
एक्सप्रेशन मैनेजर जानता है कि कौन से वेरिएबल लोकल हैं
पेज के लिए JavaScript सही ढंग से बनाने हेतु एक्सप्रेशन मैनेजर को पता होना चाहिए कि पेज पर कौन से वेरिएबल सेट हैं और उनकी JavaScript ID क्या है (जैसे document.getElementById(x) के लिए)। उसे यह भी पता होना चाहिए कि अन्य पेजों पर कौन से वेरिएबल सेट हैं (ताकि वह सुनिश्चित कर सके कि आवश्यक <input type='hidden' value='x'> फ़ील्ड मौजूद हैं और भरे हुए हैं)।
क्रमिक शर्तें (Cascading Conditions)
यदि कोई भी वेरिएबल अप्रासंगिक है, तो पूरा समीकरण अप्रासंगिक (false) हो जाता है। उदाहरण के लिए, निम्न तालिका में N/A का अर्थ है कि वेरिएबलों में से कोई एक प्रासंगिक नहीं था
| ऑपरेटर | उदाहरण | a | b | परिणाम |
|---|---|---|---|---|
| + (unary) | +a | N/A | false | |
| ! | !a | N/A | false | |
| == (or eq) | a == b | N/A | 5 | false |
| == (or eq) | a == b | N/A | 0 | false |
| == (or eq) | a == b | N/A | N/A | false |
| != (or ne) | a != b | N/A | 5 | false |
| != (or ne) | a != b | N/A | N/A | false |
| != (or ne) | a != b | N/A | 0 | false |
| > (or gt) | a > b | N/A | 5 | false |
| >= (or ge) | a >= b | N/A | 5 | false |
| < (or lt) | a < b | N/A | 5 | false |
| <= (or le) | a <= b | N/A | 5 | false |
| and | a and b | N/A | 5 | false |
| and | a and b | N/A | N/A | false |
| or | a or b | N/A | N/A | false |
| or | a or b | N/A | 5 | false |
| + | a + b | N/A | 5 | false |
| * | a * b | N/A | 5 | false |
| / | a / b | 5 | N/A | false |
| () | (a) | N/A | false | |
| (exp) | (a && b) | N/A | 5 | false |
| (exp) op (exp) | (b + b) > (a && b) | N/A | 5 | false |
| फ़ंक्शन | sum(a,b,b) | N/A | 5 | false |
| फ़ंक्शन | max(a,b) | N/A | 5 | false |
| फ़ंक्शन | min(a,b) | N/A | 5 | false |
| फ़ंक्शन | implode(', ',a,b,a,b) | N/A | 5 | false |
| फ़ंक्शन | if(a,a,b) | N/A | 5 | false |
| फ़ंक्शन | is_empty(a) | N/A | false | |
| फ़ंक्शन | is_empty(a) | 0 (या खाली) | true | |
| फ़ंक्शन | !is_empty(a) | N/A | false |
क्रमिक शर्तों को ओवरराइड करना (Overriding Cascading Conditions)
मान लीजिए आप सभी प्रासंगिक उत्तरों का चालू योग दिखाना चाहते हैं। आप समीकरण {sum(q1,q2,q3,...,qN)} का उपयोग करने का प्रयास कर सकते हैं। लेकिन आंतरिक रूप से यह LEMif(LEManyNA('q1','q2','q3',...,'qN'),,sum(LEMval('q1'),LEMval('q2'),LEMval('q3'),...,LEMval('qN'))) में बदल जाता है। इसलिए यदि q1-qN में से कोई भी मान अप्रासंगिक है, तो समीकरण हमेशा false लौटाएगा। इस स्थिति में, जब तक सभी प्रश्नों के उत्तर नहीं दिए जाते, sum() 0 दिखाएगा।
इससे बचने के लिए, प्रत्येक वेरिएबल में ".NAOK" प्रत्यय जोड़ा जा सकता है (जिसका अर्थ है कि Not Applicable ठीक है)। ऐसी स्थिति में निम्न व्यवहार होता है। मान लीजिए आपके पास वेरिएबल q1.NAOK है
- q1 को LEManyNA() क्लॉज़ में नहीं जोड़ा जाता
- LEMval('q1') यह जाँचना जारी रखेगा कि प्रतिक्रिया प्रासंगिक है या नहीं, और यदि नहीं है तो '' लौटाएगा (इसलिए अलग-अलग अप्रासंगिक प्रतिक्रियाओं को अनदेखा कर दिया जाएगा, लेकिन वे पूरे एक्सप्रेशन को अमान्य नहीं करेंगी)।
इसलिए चालू योग की समस्या का समाधान समीकरण sum(q1.NAOK,q2.NAOK,q3.NAOK,...,qN.NAOK) का उपयोग करना है।
.NAOK प्रत्यय के उपयोग से लेखक ऐसे सर्वेक्षण भी डिज़ाइन कर सकते हैं जिनमें कई संभावित रास्ते हों लेकिन बाद में वे साझा रास्तों पर आकर मिल जाएँ। उदाहरण के लिए, मान लीजिए प्रतिभागी सर्वेक्षण का उत्तर प्रतिक्रियाओं की सामान्य सीमा से बाहर देते हैं। लेखक प्रतिभागियों को चेतावनी दे सकता है कि उन्हें मान्य परिणाम नहीं मिल सकते, और पूछ सकता है कि क्या वे वाकई सर्वेक्षण जारी रखना चाहते हैं। यदि वे हाँ कहते हैं, तो शेष प्रश्न दिखाए जाएँगे। "शेष प्रश्नों" की शर्त यह जाँचेगी कि प्रारंभिक प्रतिक्रियाएँ सामान्य सीमा के भीतर थीं या प्रतिभागी ने उस प्रश्न का उत्तर हाँ दिया, जो केवल तभी प्रासंगिक है जब उन्होंने सीमा से बाहर उत्तर दिया हो।
एक्सप्रेशन मैनेजर शर्तों पर आधारित माइक्रो-टेलरिंग को कैसे सपोर्ट करता है?
यह माइक्रो-टेलरिंग का एक उदाहरण है (जहाँ Question Type=='expr' का अर्थ समीकरण है):
| प्रश्न कोड | प्रासंगिकता | प्रश्न का प्रकार | प्रश्न |
|---|---|---|---|
| name | 1 | text | आपका नाम क्या है? |
| age | 1 | text | आपकी उम्र कितनी है? |
| badage | !is_empty(age) | expr | {(age<16) or (age>80)} |
| agestop | badage | message | क्षमा करें, {name}, इस परीक्षण के लिए आप बहुत {if( (age<16),'young',if( (age>80),'old','middle-aged') ) } हैं। |
| kids | !badage | yesno | क्या आपके बच्चे हैं? |
| parents | 1 | expr | {!badage && kids=='Y'} |
| numKids | parents | text | आपके कितने बच्चे हैं? |
| kid1 | parents && numKids >= 1 | text | आपके पहले बच्चे की उम्र कितनी है? |
| kid2 | parents && numKids >= 2 | text | आपके दूसरे बच्चे की उम्र कितनी है? |
| kid3 | parents && numKids >= 3 | text | आपके तीसरे बच्चे की उम्र कितनी है? |
| kid4 | parents && numKids >= 4 | text | आपके चौथे बच्चे की उम्र कितनी है? |
| kid5 | parents && numKids >= 5 | text | आपके पाँचवें बच्चे की उम्र कितनी है? |
| sumage | 1 | expr | {sum(kid1.NAOK,kid2.NAOK,kid3.NAOK,kid4.NAOK,kid5.NAOK)} |
| report | parents | yesno | {name}, आपने बताया कि आपकी उम्र {age} है और आपके {numKids} बच्चे हैं। आपके पहले {min(numKids,5)} बच्चों की उम्र का योग {sumage} है |
ये सभी प्रश्न एक ही पेज पर (जैसे एक ही समूह में) हो सकते हैं, और केवल प्रासंगिक प्रश्न ही दिखाई देंगे। इसके अलावा, जैसे-जैसे आप बच्चों की उम्र दर्ज करेंगे, अंतिम प्रश्न में sum() एक्सप्रेशन पेज पर गतिशील रूप से अपडेट होता रहेगा।
एक्सप्रेशन मैनेजर यह कार्यक्षमता प्रत्येक एक्सप्रेशन को एक नामित <span> एलिमेंट से घेरकर प्रदान करता है। हर बार जब कोई मान बदलता है, तो वह उस <span> एलिमेंट में दिखने वाले एक्सप्रेशन की दोबारा गणना करता है और डिस्प्ले को फिर से बनाता है। एक ही पेज पर ऐसे दर्जनों, या सैकड़ों, टेलर्ड एक्सप्रेशन हो सकते हैं, और पेज उन सभी को एक ही स्क्रीन रिफ्रेश में फिर से दिखा देगा।
LimeSurvey 1.91+ से एक्सप्रेशन मैनेजर कार्यक्षमता की मैपिंग
| पुरानी सुविधा | नई सुविधा | टिप्पणियाँ |
|---|---|---|
| शर्तें (Conditions) | प्रासंगिकता | आप बहुत जटिल शर्त वाले समीकरण उपयोग कर सकते हैं और वेरिएबलों की व्यापक श्रेणी तक पहुँच सकते हैं |
| मूल्यांकन (Assessments) | समीकरण | किसी भी मूल्यांकन स्कोर को समीकरण के रूप में पुनर्गठित किया जा सकता है। इससे यह सुनिश्चित होता है कि स्कोर डेटाबेस में लिखा जाए, और आप वर्तमान पेज पर स्कोर मान में होने वाले गतिशील बदलाव भी देख सकते हैं |
| रिप्लेसमेंट (Replacements) | एक्सप्रेशन मैनेजर | कोर इंजन इनपुट स्ट्रिंग लेता है और कर्ली ब्रेसेस के भीतर की हर चीज़ को एक्सप्रेशन मानता है - इसलिए वह सभी पुराने रिप्लेसमेंट प्रकारों को संभालता है। एम्बेडेड JavaScript में गड़बड़ी से बचने के लिए, एक्सप्रेशन मैनेजर कर्ली ब्रेसेस के बीच की सामग्री को तभी प्रोसेस करता है जब (a) कर्ली ब्रेसेस के भीतर शुरुआत या अंत में कोई खाली स्थान न हो - जैसे {expr} एक एक्सप्रेशन है, लेकिन { expr}, {expr } और { expr } एक्सप्रेशन नहीं हैं। इसके अलावा, एक्सप्रेशन मैनेजर अपनी स्ट्रिंग्स के भीतर की सामग्री को प्रोसेस नहीं करता (जैसे {list('hi','there {braces}')} से "hi there {braces}" बनता है)। वह एस्केप किए गए कर्ली ब्रेसेस को भी अनदेखा करता है (जैसे \{this is not an expression\}) |
| सत्यापन (Validation) | एक्सप्रेशन मैनेजर | योजना है कि वर्तमान min/max प्रश्न गुणों को एक्सप्रेशन मैनेजर से प्रोसेस कराया जाए। इस तरह min/max मान स्वयं एक्सप्रेशन हो सकते हैं |
सिंटैक्स हाइलाइटिंग
एक्सप्रेशन दर्ज करने और उन्हें सत्यापित करने में मदद के लिए, EM निम्न सुविधाओं वाली सिंटैक्स हाइलाइटिंग प्रदान करता है:
सिंटैक्स हाइलाइटिंग के प्रकार और अर्थ
| रंग | नमूना | अर्थ | टूलटिप | टिप्पणियाँ |
|---|---|---|---|---|
| tan background | Sample | पूरा समीकरण | none | घुमावदार कोष्ठकों के भीतर की कोई भी चीज़ जिसे समीकरण के रूप में पहचाना जाता है (यानी जिसके आगे या पीछे खाली स्थान नहीं है), उसे आसपास के टेक्स्ट से अलग दिखाने के लिए टैन पृष्ठभूमि के साथ रंग-कोडित किया जाता है। |
| bold red text | Sample | त्रुटि | त्रुटि के बारे में कुछ स्पष्टीकरण | यह कोई अज्ञात वेरिएबल या फ़ंक्शन में त्रुटि हो सकती है, .... सर्वेक्षण पूरी तरह टूट सकता है, यह सार्वजनिक उपयोगकर्ता को नहीं दिखता। |
| blue text | Sample | फ़ंक्शन का नाम | अर्थ और मान्य सिंटेक्स | फ़ंक्शन के नाम, या वे चीज़ें जो फ़ंक्शन होनी चाहिए क्योंकि उनके बाद एक खुला कोष्ठक है, बोल्ड नीले टेक्स्ट में दिखाई जाती हैं। टूलटिप में फ़ंक्शन का अर्थ और मान्य सिंटेक्स दिखता है। |
| grey text | Sample | स्ट्रिंग | none | सिंगल और डबल कोट वाली स्ट्रिंग ग्रे टेक्स्ट में दिखाई जाती हैं। |
| cyan text | Sample | उसी पृष्ठ पर सेट किया गया वेरिएबल, | [नाम या SGQA कोड]: प्रश्न; मान; answerList जो प्रत्येक मान के कोड दिखाती है | वर्तमान प्रश्न वाले पृष्ठ पर सेट किया गया कोई भी वेरिएबल सियान टेक्स्ट में दिखाया जाता है, जो दर्शाता है कि उसे जावास्क्रिप्ट में अपडेट किया जा सकता है। टूलटिप में उसका नाम, वास्तविक प्रश्न और उसका मौजूदा मान (या सेट न होने पर खाली) दिखता है। यदि प्रश्न का प्रकार गणित किए गए मानों के सेट से उत्तर अपेक्षित करता है, तो कोड से प्रदर्शित मानों की मैपिंग दिखाई जाती है। |
| green text | Sample | पिछले पृष्ठ पर सेट किया गया वेरिएबल | [नाम या SGQA कोड]: प्रश्न; मान; answerList जो प्रत्येक मान के कोड दिखाती है | पिछले पृष्ठ पर सेट किया गया कोई भी वेरिएबल बोल्ड हरे टेक्स्ट में दिखाया जाता है। टूलटिप में उसका नाम, वास्तविक प्रश्न और उसका मौजूदा मान (या सेट न होने पर खाली) दिखता है। यदि प्रश्न का प्रकार गणित किए गए मानों के सेट से उत्तर अपेक्षित करता है, तो कोड से प्रदर्शित मानों की मैपिंग दिखाई जाती है। |
| bold pink text | Sample | बाद के पृष्ठ पर सेट किया गया वेरिएबल सामान्यतः: सर्वेक्षण की शुरुआत में खाली होता है, लेकिन इंडेक्स या पिछले पर जाने से भर सकता है | [नाम या SGQA कोड]: प्रश्न; मान; answerList जो प्रत्येक मान के कोड दिखाती है | अगले पृष्ठ पर सेट किया गया कोई भी वेरिएबल बोल्ड गुलाबी टेक्स्ट में दिखाया जाता है। टूलटिप में उसका नाम, वास्तविक प्रश्न और उसका मौजूदा मान (या सेट न होने पर खाली) दिखता है। यदि प्रश्न का प्रकार गणित किए गए मानों के सेट से उत्तर अपेक्षित करता है, तो कोड से प्रदर्शित मानों की मैपिंग दिखाई जाती है। |
| bold tan text | Sample | लाइम रिप्लेसमेंट मान | मान | लाइम रिप्लेसमेंट स्ट्रिंग (जैसे {TOKEN:xxx}, {PRIVACY_MESSAGE}) बोल्ड टैन टेक्स्ट में दिखाई जाती हैं। |
| red text | Sample | असाइनमेंट ऑपरेटर (=) | चेतावनी संदेश | यदि आप असाइनमेंट ऑपरेटर (=) का उपयोग करते हैं, तो वह ऑपरेटर लाल टेक्स्ट में दिखाया जाएगा। इसका उद्देश्य मानों के गलती से दोबारा असाइन होने से बचाना है, जब आप वास्तव में a == b की जाँच करना चाहते थे न कि a = b से मान सेट करना। |
| normal black text | Sample | विराम चिह्न | none | एक्सप्रेशन के भीतर के अन्य सभी विराम चिह्न सामान्य काले टेक्स्ट में दिखाए जाते हैं। |
| red-boxed text | a bold red line surrounds the error | सिंटेक्स त्रुटि | त्रुटि का विवरण | पहचानी गई कोई भी सिंटेक्स त्रुटि लाल बॉक्स से घिरी दिखाई जाती है। टूलटिप में त्रुटि दिखती है। उदाहरणों में बेमेल कोष्ठक, अपरिभाषित फ़ंक्शन का उपयोग, फ़ंक्शन को गलत संख्या में आर्ग्युमेंट देना, खराब ढंग से बने एक्सप्रेशन (जैसे वेरिएबल के बीच ऑपरेटर का न होना), केवल-पढ़ने योग्य वेरिएबल को नया मान असाइन करने का प्रयास, वेरिएबल न होने वाली चीज़ों को मान असाइन करने का प्रयास, या असमर्थित सिंटेक्स का उपयोग शामिल हैं। ध्यान दें कि सिंटेक्स त्रुटि पहचान प्रणाली एक एक्सप्रेशन में कई त्रुटियाँ होने पर भी केवल एक त्रुटि बता सकती है; हालाँकि, यदि कोई त्रुटि पाई जाती है, तो कम से कम एक त्रुटि अवश्य दिखाई जाएगी। |
अतिरिक्त पठन
Expression Manager के नमूना सर्वेक्षण
उपयोग के मामले और HowTos
चरण-दर-चरण उदाहरण
Expression Manager के सांख्यिकी फ़ंक्शन
डेवलपर्स के लिए संदर्भ










