أمثلة على ExpressionScript
From LimeSurvey Manual
البنية
سيصف الجزء الأول من المقالة الأغراض التي يمكن استخدام التعبيرات من أجلها وأين يمكنك العثور على تعبير أو إضافته. أما الجزء الثاني فيقدم أمثلة حول كيفية استخدام التعبيرات.
فئات التعبيرات
يستخدم LimeSurvey التعبيرات للأغراض التالية:
الملاءمة
الغرض: إخفاء مجموعات الأسئلة/الأسئلة
تتحكم الملاءمة في إظهار مجموعة الأسئلة أو السؤال أو إخفائه. إذا كانت نتيجة التعبير "true" (أي 1)، فسيتم عرض العنصر. وإلا (إذا كانت نتيجة التعبير "false" (أي 0))، فسيتم إخفاء العنصر.
التحقق من الصحة
الغرض: التحقق من صحة المدخلات/الإجراءات على الأسئلة/الأسئلة الفرعية/الإجابات
يتحكم التحقق من الصحة في ما إذا كان إدخال المشارك في سؤال ما أو إجراؤه صحيحًا أم لا. إذا كانت نتيجة التعبير "true" (أي 1)، فسيتم تطبيق الفئة "good" على العنصر ورسالة التحقق. وإلا، إذا كانت نتيجة التعبير "false" (أي 0)، فسيتم تطبيق الفئة "error" على العنصر ورسالة التحقق. يمكنك تعريف نمط لهذه الفئات في الملف template.css.
إخراج النص
الأغراض: (القيام بشيء ما) وكتابة نص
يمكن استخدام التعبير لكتابة نص. على سبيل المثال، يمكنك اختبار شيء ما أو حسابه وتحديد المخرجات اعتمادًا على نتيجة الاختبار أو الحساب. كما يمكن استخدامه لإدراج نص السؤال أو الإجابات أو أنواع الأسئلة ... الخاصة بسؤال استُخدم قبل استخدام التعبير. يمكن استخدام إخراج النص في أي مكان يُعرض فيه نص، ويمكنه إرجاع جميع أنواع النتائج.
| حالة الاستخدام | الوصف |
|---|---|
| التخصيص الدقيق | تعديل نص ما، مثل كتابة "السيد" أو "السيدة" بناءً على سؤال عن الجنس طُرح من قبل |
| الحساب | حساب قيمة وكتابتها، مثل "دخل أسرتك هو xxx" |
| المرجع | إدراج نص من عنصر ما، مثل "اسمك هو xxx. كم عمرك؟" |
تخزين الإجابات
الأغراض: (القيام بشيء ما،) (كتابة نص) وتخزين شيء ما في قاعدة البيانات
يمكن استخدام نوع سؤال المعادلة لتخزين شيء ما في قاعدة البيانات. يمكنك القيام بشيء ما باستخدام تعبير، وعرض سؤال المعادلة (الذي يشبه إظهار المعلومات المكتوبة (النصوص)) وتخزين نتيجة التعبير في قاعدة البيانات. يخزّن الإجابة في جدول الاستجابات. بعد ذلك، يمكن استخدام النتيجة ضمن ميزة الإحصاءات أو استيرادها بأحد التنسيقات التي توفرها وظيفة التصدير في LimeSurvey.
أمثلة على التعبيرات
إدراج إجابة من سؤال سابق
استخدام سؤال معادلة مخفي لملء إجابة تلقائيًا
المشكلة: تخيّل أن لديك سؤالين Q1 وQ2. يسأل Q1 المشاركين عن أعمارهم. يقسّم Q2 المشاركين إلى ثلاث مجموعات: العمر أقل من 20 سنة، العمر 20 سنة، العمر أكبر من 20 سنة. لذلك، يجب أن يستخدم Q2 القيم "1" و"2" و"3" التي تتوافق مع الشروط أعلاه. كما يجب ألا ننسى جعل Q2 غير مرئي (لن يُعرض السؤال في الاستبيان، لكن القيم ستُخزَّن عبر "العملية الخلفية" في جدول الاستجابات).
لملء قاعدة البيانات باستخدام نوع سؤال المعادلة:
- أولاً، أنشئ سؤالاً برمز Q1 من نوع المدخل العددي.
- ثم أنشئ سؤالاً آخر برمز Q2 من نوع سؤال المعادلة.
- في علامة التبويب "إعدادات العرض" الخاصة بـ Q2:
- اضبط الحقل "دائما اخف هذا السؤال" على "يعمل"
- اكتب في حقل "معادلة" التعبير التالي:
{if(Q1.NAOK < 20, "1", if(Q1.NAOK > 20, "3", "2"))}
إنشاء صفحة ملخص باستخدام العناصر النائبة
يوضح هذا الدرس كيفية إنشاء نظرة عامة في نهاية الاستبيان تسرد جميع الأسئلة والإجابات عبر العناصر النائبة في ExpressionScript. كما يوضح كيفية قصر هذه النظرة العامة على الأسئلة التي تمت الإجابة عنها فقط.
يمكنك تنزيل المثال الخاص بنا من هنا: مثال استبيان العناصر النائبة.
أنواع الأسئلة المستخدمة هنا:
1. أسئلة تسمح باختيار جواب واحد / أسئلة نصية أو رقمية مفردة
- القائمة (المنسدلة)
- قائمة ( راديو) [L]
- نعم/لا [Y]
- نص حر طويل [T]
- نص حر قصير [S]
- المدخل العددي [N]
- معادلة [*]
2. سؤال يحتوي على أسئلة فرعية
- نص قصير مركب/ مزدوج [Q]
- خيار متعدد [M]
- صفيف [F]
- صف( نعم/ لا/ غير متأكد) [C]
- صف( اختيار 10 نقاط) [B]
3. أسئلة ذات مقياسين
- صفيف المقياس المزدوج [1]
4. أسئلة ذات مقياسين X وY
- صفيف (أرقام) [:]
5. حجب اللأسئلة
- إظهار المعلومات المكتوبة (النصوص) [X]
في هذا المثال البسيط، ستكون نظرتنا العامة عبارة عن قائمة بسيطة تتضمن:
- نص السؤال: إجابة المستخدم
أسئلة تسمح باختيار جواب واحد / أسئلة نصية أو رقمية مفردة
بالنسبة لجميع أنواع الأسئلة هذه، سيخزن LimeSurvey ردًا واحدًا:
- القائمة (المنسدلة)
- قائمة ( راديو)
- قائمة بها تعليقات
- اختيار 5 نقاط
- نعم/لا
- نص حر قصير
- نص حر طويل
- نص حر كبير
- المدخل العددي
- معادلة
- التاريخ
- الجنس
بافتراض أن رمز السؤال هو q1، يمكننا الإشارة إلى نص السؤال والإجابة باستخدام:
- {q1.question}: {q1.shown}
مثال:
- كم عمرك؟: 25
إذا أردت التحقق مما إذا تمت الإجابة عن هذا السؤال، يمكنك وضع عبارة IF حول المخرجات:
{if(!is_empty(q1),join("- ",q1.question,": ",q1.shown),"")}
تُترجم هذه العبارة إلى: إذا كان السؤال الذي رمزه q1 غير فارغ، فأخرج "- " مع نص السؤال مع ": " مع نص الإجابة (تقوم الدالة join() بضم العناصر في سلسلة نصية جديدة)؛ وإلا: لا تُخرج شيئًا ("" تعني سلسلة نصية فارغة).
سؤال يحتوي على أسئلة فرعية
يستخدم LimeSurvey الأسئلة الفرعية لجميع أنواع الأسئلة التالية:
- نص قصير مركب/ مزدوج
- خيار متعدد
- خيار متعدد مه تعليقات
- صفيف
- صف( اختيار 5 نقاط)
- صف( اختيار 10 نقاط)
- صف( نعم/ لا/ غير متأكد)
- مجموعة (الزيادة / نفس / النقص)
- صفيف مرتب حسب الاعمدة
بافتراض أن رمز السؤال هو q2 وأن الأسئلة الفرعية مرقمة SQ001 وSQ002 (ترقيم تلقائي يتم بواسطة LimeSurvey)، يمكننا الإشارة إلى نص السؤال والإجابة باستخدام:
- {q2_SQ001.question}: {q2_SQ001.shown}
- {q2_SQ002.question}: {q2_SQ002.shown}
في أسئلة الخيار المتعدد، من المنطقي ألا يتم عرض نص السؤال الفرعي المحدد، بل عرض الحرف Y لكل خيار تم تحديده:
- {q2_SQ001.question}: {q2_SQ001}
- {q2_SQ002.question}: {q2_SQ002}
...
لاحظ أنه لا يمكن حاليًا إخراج نص السؤال للأسئلة التي تحتوي على أسئلة فرعية، راجع طلب الميزة هذا.
مثال 1 (بافتراض أن نوع السؤال هو خيار متعدد)
- هل تعرف ماركات السيارات هذه؟
-- Mercedes: Y
-- Audi: N
-- Volvo: Y
إذا كنت ترغب في إخراج العناصر المحددة فقط، فيمكنك وضع عبارة IF حول المخرجات والتحقق من قيمة مربع الاختيار:
{ if( q2_SQ001=="Y", join( "- ", q2_SQ001.question, ": ", q2_SQ001.shown ), "" ) }
استخدم الدالة listifop إذا كنت ترغب في إخراج قائمة بالعناصر المحددة فقط، مثل: Mercedes, Volvo
{ listifop( 'value', '==', 'Y', 'question', ', ', that.q2.sgqa ) }
حيث يتوسع that.q2 ليشمل جميع الأسئلة الفرعية للسؤال q2. راجع self وthis وthat لمزيد من التفاصيل.
مثال 2 (بافتراض أن نوع السؤال هو صف( اختيار 10 نقاط))
- يرجى تقييم جودة ماركات السيارات أدناه على مقياس من 1=سيئ جدًا إلى 10=جيد جدًا؟
-- Mercedes: 7
-- Audi: 9
-- Volvo: 9
إذا كنت ترغب في إخراج العناصر التي تم تقييمها فقط، فيمكنك وضع عبارة IF حول المخرجات والتحقق مما إذا كان السؤال الفرعي الحالي قد تمت الإجابة عنه باستخدام:
{ if( ! is_empty( q3_SQ001 ), join( "- ", q3_SQ001.question, ": ", q3_SQ001.shown ), "" ) }
استخدم الدالة listifop إذا كنت ترغب مثلًا في إخراج قائمة بالعناصر المحددة التي تزيد قيمتها على ثمانية فقط، مثل: Audi / Volvo
{ listifop( 'value', '>', 8, 'question', ' / ', that.q3.sgqa ) }
سؤال بمقياسين
لنفترض أن الأكواد التالية مستخدمة:
- كود السؤال: q4
- أكواد الأسئلة الفرعية: SQ001, SQ002, ...
- أكواد الإجابات للمقياس 1: A1, A2, ...
- أكواد الإجابات للمقياس 2: B1, B2, ...
مثال للإشارة إلى إجابة السؤال الفرعي الثالث والمقياس الثاني: q4_SQ003_1 - السؤال 4، السؤال الفرعي 3، المقياس الثاني.
لنُخرج النتائج للمقياسين وللسؤالين الفرعيين الأولين:
- {q4_SQ001_0.question}: {q4_SQ001_0.shown} / {q4_SQ001_1.shown}
- {q4_SQ002_0.question}: {q4_SQ002_0.shown} / {q4_SQ002_1.shown}
لإخراج نص السؤال الفرعي، تحتاج إلى إضافة معرّف المقياس إلى العنصر النائب (رغم أن النصوص متطابقة في المقياسين). لذا بدلًا من {q4_SQ001.question} علينا استخدام {q4_SQ001_0.question} أو {q4_SQ001_1.question}.
إذا كنت ترغب في تصدير/عرض نتائج الأسئلة الفرعية التي تحتوي على إجابة واحدة على الأقل فقط، فاستخدم هذه الصيغة لكل سؤال فرعي:
{if(count(q4_SQ001_0,q4_SQ001_1)>0,join("- ",q4_SQ001_0.question,": ",q4_SQ001_0.shown," / ",q4_SQ001_1.shown),"")}
سؤال بمقياسي X وY
ينطبق هذا على جميع أسئلة المصفوفة التي تسمح بإجابة لكل خلية (وليس لكل صف فقط كما هو موضح سابقًا):
- صفيف نصوص
- صفيف أرقام
الرموز المفترض استخدامها:
- رمز السؤال: q5
- رموز الأسئلة الفرعية: SQ001 وSQ002 و...
- رموز الإجابة: A1 وA2 و...
للإشارة إلى نتيجة سؤال فرعي معين من عمود معين، عليك استخدام QuestionCode . '_' . SubQuestionCode . '_' . AnswerCode. مثال للإشارة إلى إجابة السؤال الفرعي الثالث والعمود الثاني: q5_SQ003_A2.
لنُخرج النتائج للأعمدة 1-3 من أول سؤالين فرعيين:
- {q5_SQ001_A1.question}: {q5_SQ001_A1.shown} | {q5_SQ001_A2.shown} | {q5_SQ001_A3.shown}
- {q5_SQ002_A1.question}: {q5_SQ002_A1.shown} | {q5_SQ002_A2.shown} | {q5_SQ002_A3.shown}
بما أن كل خلية (تقاطع المحور X والمحور Y) في أنواع الأسئلة هذه تعادل خيار إجابة واحدًا، يجب إجراء اختبار لوجود البيانات لكل خلية. مثال:
{if(!is_empty(q5_SQ001_A1),join("- ",q5_SQ001_A1.question,": ",q5_SQ001_A1.shown),"")}
إخفاء سؤال إذا كانت إجابة السؤال السابق فارغة
| الغرض | إخفاء سؤال إذا كانت إجابة السؤال السابق فارغة |
| النوع | صلة السؤال |
| مثال | السؤال الأول: رمز السؤال "name"، نص السؤال "ما اسمك؟" السؤال الثاني: نص السؤال "{name}، كم عمرك؟" المطلوب: إخفاء السؤال الثاني إذا كان الحقل النصي في السؤال الأول فارغًا |
| التعبير | !is_empty(name) |
| وصف | تحدد الدالة is_empty() ما إذا كان المتغير يُعتبر فارغًا. تقوم علامة "!" بعكس النتيجة. لذا إذا لم يكن المتغير فارغًا فسيكون التعبير صحيحًا ويتم عرض السؤال |
| الخطوات | أنشئ/حرر السؤال الثاني أدخل "!is_empty(name)" في "معادلة الصلة:" |
| ملف نموذجي | Hide_question_if_empty_question_group.zip |
![]()
| |
إخفاء مجموعة أسئلة إذا كانت إجابة السؤال السابق نعم أو لا
| الغرض | إخفاء مجموعة أسئلة إذا كانت إجابة السؤال السابق نعم أو لا |
| النوع | صلة مجموعة الأسئلة |
| مثال | الصفحة الأولى، مجموعة الأسئلة الأولى، السؤال الأول: رمز السؤال "PET"، نص السؤال "هل لديك حيوان أليف؟" -نعم -لا الصفحة الثانية، مجموعة الأسئلة الثانية: العنوان "عن حيواناتك الأليفة" المطلوب: إظهار/إخفاء مجموعة الأسئلة الثانية إذا كانت إجابة السؤال الأول نعم/لا |
| التعبير | PET == "Y" |
| وصف | PET هو رمز السؤال الذي تريد التحقق من إجابته. إذا لم تستخدم لاحقة، سيستخدم EM القيمة "Qcode.code". وبذلك تقارن رمز الإجابة للسؤال PET بالقيمة "Y". إذا أجاب المشارك بـ "نعم" فسيكون التعبير صحيحًا وسيتم عرض مجموعة الأسئلة "عن حيواناتك الأليفة". |
| الخطوات | أنشئ/حرر مجموعة الأسئلة الثانية أدخل "PET == "Y"" في "معادلة الصلة:" |
| ملف نموذجي | Hide_question group_if_answer_from_previous_question_is_Yes_or_No.zip |
![]()
| |
عرض قيمة حقل في سؤال إدخال متعدد الإجابات
| الغرض | عرض قيمة حقل في سؤال إدخال متعدد الإجابات |
| النوع | مرجع |
| مثال | السؤال الأول: رمز السؤال "AskChildAge"، نص السؤال "كم عمر أطفالك؟". رموز الأسئلة الفرعية -Child1 -Child2 -Child3 - ChildXXX السؤال الثاني: رمز السؤال "ReportChildAge" نص السؤال "عن طفلك الأول: - CHILD1 عمره AGE1." |
| التعبير | {AskChildAge_Child1.question}, {AskChildAge_Child1.value} |
| وصف | تريد استخدام قيمة سؤال فرعي في سؤال لاحق. يمكنك الوصول إلى قيمة السؤال الفرعي باستخدام تعبير من هذا النوع: QcodeQuestion_QcodeSubquestion.value |
| الخطوات | أنشئ/حرر السؤال الثاني أدخل هذا النص في الوصف: "عن طفلك الأول: - {AskChildAge_Child1.question} عمره {AskChildAge_Child1.value}." |
| ملف نموذجي | Display_value_of_a_multiple_answer_input_question_field.zip |
| |
التحقق من عدد المربعات المحددة في كل صف لسؤال "صفيف (أرقام) بمربعات اختيار"
| الغرض | التحقق من عدد المربعات المحددة في كل صف |
| النوع | التحقق من الصحة |
| مثال | سؤال من نوع "صفيف أرقام (تصميم صندوق الاختيار)" |
| التعبير | sum(...) |
| وصف | (sum(Test_A_1, Test_A_2, Test_A_3, Test_A_4, Test_A_5) <= X) يحدد ما إذا كان عدد مربعات الاختيار المحددة في الصف A هو X على الأقل. إذا أردت التحقق من الصفوف الثلاثة (A وB وC)، يمكنك ربط التعبير باستخدام "&&": (sum(Test_A_1, Test_A_2, Test_A_3, Test_A_4, Test_A_5) <= X) && (sum(Test_B_1, Test_B_2, Test_B_3, Test_B_4, Test_B_5) <= X) && (sum(Test_C_1, Test_C_2, Test_C_3, Test_C_4, Test_C_5) <= X) |
| الخطوات | أنشئ/حرر سؤالًا من نوع "صفيف أرقام (تصميم صندوق الاختيار)". أدخل التعبير أعلاه في "معادلة التحقق من صحة السؤال" ضمن إعدادات السؤال المتقدمة (قد تحتاج إلى تعديل أسماء المتغيرات!). |
| ملف نموذجي | Validate number of boxes ticker per row for an Array (Numbers) Checkbox.lss |
![]()
| |
حساب الفرق بين تاريخين
| الغرض | حساب الفرق بين تاريخين |
| النوع | الصلة / نوع سؤال المعادلة / التحقق من الصحة |
| مثال | السؤال الأول (التاريخ/الوقت، الرمز: DOB): ما هو تاريخ ميلادك؟ السؤال الثاني (التاريخ/الوقت، الرمز: datetoday): ما هو تاريخ اليوم؟ السؤال الثالث (نص ثابت): عمرك XXXX يومًا. المطلوب: حساب وعرض عدد الأيام بين التاريخ المُدخل في السؤال 1 والسؤال 2. |
| التعبير | {(strtotime(datetoday)-strtotime(DOB))/60/60/24} |
| وصف | تحسب strtotime عدد الثواني بين 1 يناير 1970 والتاريخ المحدد. يحسب التعبير أعلاه عدد الثواني بين التاريخين المحددين. أما الجزء "/60/60/24" فيحوّل عدد الثواني إلى عدد الأيام. بدلًا من السؤال عن "datetoday"، يمكنك أيضًا استخدام strtotime('now') أو ببساطة time()، التي تُرجع مباشرة عدد الثواني من يناير 1970 حتى الآن (أي وقت إجراء الاستبيان). وبذلك يمكنك معرفة عمر شخص بالسنوات بسرعة باستخدام المعادلة {(time() - strtotime(DOB)) / 60 / 60 / 24 / 365.25} في أي من هذه الحالات، من الضروري إدخال التاريخ بتنسيق صحيح، وإلا فلن تعمل الدالة strtotime() بشكل سليم. |
| الخطوات | أنشئ سؤالين من نوع التاريخ (لتاريخ الميلاد ولتاريخ اليوم) وسؤالًا من نوع نص ثابت. في نص السؤال من نوع النص الثابت أدخل: "في {datetoday} كان عمرك {(strtotime(today)-strtotime(dob))/60/60/24} يومًا." يرجى ملاحظة: يمكن للدالة strtotime التعامل مع العديد من تنسيقات التاريخ ولكن ليس جميعها. إذا واجهت مشاكل، فاضبط تنسيق التاريخ في استبيانك على mm/dd/yyyy أو yyyy-mm-dd أو dd.mm.yyyy" |
| ملف نموذجي | Date_difference.zip |
| |
استخدام ExpressionScript للتقييمات
فيما يلي مثال آخر على كيفية استخدام ExpressionScript مع أسئلة من نوع الصفيف والتقييمات:</ br>
لنفترض أن لديك سؤالين من نوع الصفيف وتريد حفظ نتائج بيانات الحساب في قاعدة بياناتك. الأمر بسيط في الواقع، ستحتاج إلى إنشاء الصفائف واختبارها وإرسال رد تجريبي للتأكد من أنها تعمل وتعطيك النتائج في صفحة الإكمال.
تفاصيل التنفيذ:
- أضف سؤالًا من نوع المعادلة
- أضف السطر التالي على افتراض أن Q1 هو رمز سؤال الصفيف الأول بينما Q2 هو الثاني:
{sum(Q1_SQ001.value,Q2_SQ001.value)}
لاحظ أن SQ001 هو الرمز الافتراضي لأي سؤال فرعي. إذا غيّرت رمز السؤال الفرعي، فعدّل المعادلة أعلاه وفقًا لذلك.
استخدام em_validation_q في الصفيف
يمكنك استخدام معادلة التحقق من صحة السؤال للتحكم في صفيف بأي شرط.
تفاصيل التنفيذ:
- للصفيف الأول : صفيف اختيار فردي
- رمز السؤال هو ARRAY
- رموز الأسئلة الفرعية هي SQ01 وSQ02 وSQ03 وSQ04
- حدّث معادلة التحقق من صحة السؤال بالكامل وضع
!is_empty(ARRAY_SQ01) and !is_empty(ARRAY_SQ03)
- للصفيف الثاني : صفيف نصوص
- رمز السؤال هو ARRAYTEXT
- رموز الأسئلة الفرعية على المحور Y هي SY01 وSY02 وSY03 وSY04
- حدّث معادلة التحقق من صحة السؤال بالكامل وضع
count(self.sq_SY01 >= 1) and count(self.sq_SY03 >= 3)








