الدوال
دوال السلاسل النصية
عند العمل مع السلاسل النصية داخل التعبيرات، من المهم استخدام علامات الاقتباس المفردة (’’) لإحاطة السلاسل الحرفية. ومع ذلك، يُستثنى من ذلك الحالات التي تريد فيها تضمين علامات اقتباس مفردة داخل سلسلة حرفية. في مثل هذه الحالات، يمكنك استخدام علامات الاقتباس المزدوجة ("") لإحاطة السلسلة بأكملها.
على سبيل المثال:
- صحيح: if(${yesno} = 1, “a string with ‘single quotes’ in it”, “no single quotes here”)
- خطأ: if(${yesno} = 1, ‘a string with ‘single quotes’ in it’, ’no single quotes here’)
فيما يتعلق بعلامات الاقتباس الذكية، من الضروري الانتباه إلى وجودها، إذ يمكن أن تسبب مشاكل في التعبيرات. كثيراً ما تحوّل محررات النصوص الغنية علامات الاقتباس المستقيمة ("" أو ‘’) تلقائياً إلى علامات اقتباس ذكية أو منحنية ("" أو ‘’)، مما قد يؤدي إلى أخطاء في الصياغة أو سلوك غير متوقع. لتجنب ذلك، تأكد من استخدام علامات الاقتباس المستقيمة (’’) باستمرار في تعبيراتك.
يدعم rtSurvey دوالاً متنوعة، تشمل:
string(field): تحوّل حقلاً إلى سلسلة نصية.- مثال:
string(34.8)ستُحوَّل إلى'34.8'.
- مثال:
string-length(field): تُعيد طول حقل سلسلة نصية.- مثال:
string-length(.) > 3 and string-length(.) < 10يمكن استخدامه للتأكد من أن الحقل الحالي يتراوح بين 3 و10 أحرف.
- مثال:
substr(fieldorstring, startindex, endindex): تُعيد سلسلة فرعية تبدأ منstartindexوتنتهي قبلendindex. تبدأ الفهارس من 0 للحرف الأول في السلسلة.- مثال:
substr(${phone}, 0, 3)ستُعيد أول ثلاثة أرقام من رقم الهاتف.
- مثال:
concat(a, b, c, ...): تدمج الحقول (و/أو السلاسل النصية) معاً.- مثال:
concat(${firstname}, ' ', ${lastname})ستُعيد الاسم الكامل بدمج القيم في حقلَيfirstnameوlastname.
- مثال:
linebreak(): تُعيد حرف فاصل سطر.- مثال:
concat(${field1}, linebreak(), ${field2}, linebreak(), ${field3})ستُعيد قائمة من ثلاث قيم حقول مع فواصل أسطر بينها.
- مثال:
lower(): تحوّل سلسلة نصية إلى أحرف صغيرة بالكامل.- مثال:
lower('Street Name')ستُعيد “street name”.
- مثال:
upper(): تحوّل سلسلة نصية إلى أحرف كبيرة بالكامل.- مثال:
upper('Street Name')ستُعيد “STREET NAME”.
- مثال:
دوال select_one وselect_multiple
count-selected(field): تُعيد عدد العناصر المحددة في حقل select_multiple.- مثال:
count-selected(.) = 3يمكن استخدامه كتعبير قيد للتأكد من اختيار ثلاثة خيارات بالضبط.
- مثال:
selected(field, value): تُعيد true أو false بحسب ما إذا كانت القيمة المحددة قد اختيرت في حقل select_one أو select_multiple.- مثال:
selected(${color}, 'Blue')يمكن استخدامه كتعبير ملاءمة لإظهار مجموعة أو حقل فقط إذا اختار المستجيب “Blue” كلونه المفضل. - ملاحظة: يجب أن تُحدد المعلمة الثانية دائماً قيمة الخيار، وليس تسمية الخيار.
- مثال:
selected-at(field, number): تُعيد العنصر المحدد في الموضع المحدد في حقل select_multiple. عند تمرير 0، تُعيد أول عنصر محدد؛ عند تمرير 1، تُعيد العنصر الثاني المحدد، وهكذا.- مثال:
selected-at(${fruits}, 0) = 'Apple'يمكن استخدامه كتعبير ملاءمة لإظهار مجموعة أو حقل فقط إذا كان أول خيار محدد هو “Apple”.
- مثال:
choice-label(field, value): تُعيد التسمية لخيار حقل select_one أو select_multiple، كما هو محدد في ورقة عمل choices.- مثال 1:
choice-label(${country}, ${country})ستُعيد تسمية الخيار للخيار المحدد حالياً في الحقل المسمىcountry. - مثال 2:
choice-label(${languages}, selected-at(${languages}, 0))ستُعيد التسمية للخيار الأول المحدد في الحقل المسمىlanguages.
- مثال 1:
دوال الحقول المتكررة
في rtSurvey، إذا أردت طرح نفس السؤال (الأسئلة) عدة مرات، يمكنك وضع حقل داخل مجموعة تكرار. ينتج عن ذلك مثيلات متعددة لنفس الحقل. يمكن للدوال التالية مساعدتك في التعامل مع هذه الحقول المتكررة والبيانات المتكررة التي تنتجها.
join(string, repeatedfield): لحقل داخل مجموعة تكرار، تُنشئ قائمة مفصولة بسلسلة نصية من القيم. تُحدد المعلمة الأولى المحدد المستخدم لفصل القيم.- مثال:
join(', ', ${member_name})ستُنشئ قائمة واحدة مفصولة بفواصل من جميع الأسماء المُدخلة.
- مثال:
join-if(string, repeatedfield, expression): تعمل تماماً مثلjoin()، إلا أنها تتحقق من كل مثيل في مجموعة التكرار باستخدام التعبير الموفر. إذا قيّم التعبير بـ false، سيُحذف العنصر من الإخراج.- مثال:
join-if(', ', ${member_name}, ${age} >= 18)ستُنشئ قائمة مفصولة بفواصل من أسماء الأعضاء البالغين فقط (أولئك الذين تبلغ أعمارهم 18 وما فوق).
- مثال:
count(repeatgroup): تُعيد العدد الحالي لمرات تكرار مجموعة التكرار.- مثال:
count(${groupname})ستُعيد عدد مثيلات المجموعة.
- مثال:
count-if(repeatgroup, expression): تعمل تماماً مثلcount()، إلا أنها تتحقق من كل مثيل في مجموعة التكرار باستخدام التعبير الموفر. إذا قيّم التعبير بـ false، سيُحذف العنصر من الإخراج.- مثال:
count-if(${members}, ${age} >= 18)ستُعيد عدد الأعضاء البالغين بناءً على حقل العمر داخل مجموعة التكرار “members”.
- مثال:
sum(repeatedfield): لحقل داخل مجموعة تكرار، تحسب مجموع جميع القيم.- مثال:
sum(${loan_amount})ستُعيد إجمالي قيمة جميع القروض.
- مثال:
sum-if(repeatedfield, expression): تعمل تماماً مثلsum()، إلا أنها تتحقق من كل مثيل في مجموعة التكرار باستخدام التعبير الموفر. إذا قيّم التعبير بـ false، سيُحذف العنصر من الإخراج.- مثال:
sum-if(${loan_amount}, ${loan_amount} > 500)ستُعيد إجمالي قيمة جميع القروض التي تزيد عن 500.
- مثال:
min(repeatedfield): لحقل داخل مجموعة تكرار، تحسب الحد الأدنى لجميع القيم.- مثال:
min(${member_age})ستُعيد عمر أصغر عضو في المجموعة.
- مثال:
min-if(repeatedfield, expression): تعمل تماماً مثلmin()، إلا أنها تتحقق من كل مثيل في مجموعة التكرار باستخدام التعبير الموفر.- مثال:
min-if(${member_age}, ${member_age} >= 18)ستُعيد عمر أصغر بالغ في المجموعة.
- مثال:
max(repeatedfield): لحقل داخل مجموعة تكرار، تحسب الحد الأقصى لجميع القيم.- مثال:
max(${member_age})ستُعيد عمر أكبر عضو في المجموعة.
- مثال:
max-if(repeatedfield, expression): تعمل تماماً مثلmax()، إلا أنها تتحقق من كل مثيل في مجموعة التكرار باستخدام التعبير الموفر.- مثال:
max-if(${member_age}, ${member_age} >= 18)ستُعيد عمر أكبر بالغ في المجموعة.
- مثال:
index(): تُستدعى داخل مجموعة تكرار، تُعيد رقم الفهرس للمجموعة أو المثيل الحالي.- مثال:
index()عند استخدامها داخل مجموعة تكرار ستُعيد 1 للمثيل الأول، 2 للثاني، وهكذا.
- مثال:
indexed-repeat(repeatedfield, repeatgroup, index): تستشير حقلاً أو مجموعة داخل مجموعة تكرار من خارج تلك المجموعة. تُحدد المعلمة الأولى الحقل أو المجموعة المتكررة المطلوبة، والثانية تُحدد مجموعة التكرار التي يوجد بها الحقل أو المجموعة، والثالثة تُحدد رقم المثيل داخل مجموعة التكرار.- مثال 1:
indexed-repeat(${name}, ${names}, 1)ستُعيد الاسم الأول المتاح عندما يكون حقل الاسم داخل مجموعة تكرار سابقة تُسمى “names”. - مثال 2:
indexed-repeat(${name}, ${names}, index())ستسحب الاسم المقابل لرقم المثيل لمجموعة التكرار الحالية.
- مثال 1:
rank-index(index, repeatedfield): تحسب هذه الدالة الترتيب الترتيبي للمثيل المحدد من الحقل المتكرر للاستخدام خارج مجموعة التكرار. يُسند الترتيب 1 للمثيل ذي القيمة الأعلى، والترتيب 2 للمثيل التالي، وهكذا.- مثال:
rank-index(1, ${random_draw})يحسب ترتيب المثيل الأول بناءً على قيمة حقلrandom_drawمقارنةً بقيم المثيلات الأخرى.
- مثال:
rank-index-if(index, repeatedfield, expression): تعمل هذه الدالة مماثلةً لـrank-index()، لكنها تتحقق من كل مثيل في مجموعة تكرار الحقل المتكرر باستخدام التعبير الموفر.- مثال:
rank-index-if(1, ${age}, ${age} >= 18)يحسب ترتيب العمر ضمن مجموعة البالغين.
- مثال:
دوال الأرقام
| العامل | العملية | المثال | الإجابة المثال |
|---|---|---|---|
+ | الجمع | 1 + 1 | 2 |
- | الطرح | 3 - 2 | 1 |
* | الضرب | 3 * 2 | 6 |
div | القسمة | 10 div 2 | 5 |
mod | باقي القسمة | 9 mod 2 | 1 |
يدعم rtSurvey دوال الأرقام، تشمل:
number(field): تحوّل قيمة الحقل إلى رقم.- مثال:
number('34.8')= 34.8
- مثال:
int(field): تحوّل قيمة الحقل إلى عدد صحيح.- مثال:
int('39.2')= 39
- مثال:
min(field1, ..., fieldx): تُعيد القيمة الدنيا بين الحقول الممررة.- مثال:
min(${father_age}, ${mother_age})ستُعيد عمر الأب أو الأم، أيهما أصغر.
- مثال:
max(field1, ..., fieldx): تُعيد القيمة القصوى بين الحقول الممررة.- مثال:
max(${father_age}, ${mother_age})ستُعيد عمر الأب أو الأم، أيهما أكبر.
- مثال:
format-number(field): تُنسّق قيمة حقل عدد صحيح أو عشري وفقاً لإعدادات لغة المستخدم.- مثال:
format-number(${income})قد تُنسّق “120000” كـ “120,000”.
- مثال:
round(field, digits): تُقرّب قيمة الحقل الرقمية إلى عدد محدد من الأرقام بعد الفاصلة العشرية.- مثال:
round(${interest_rate}, 2)
- مثال:
abs(number): تُعيد القيمة المطلقة لرقم.pow(base, exponent): تُعيد قيمة المعلمة الأولى مرفوعة إلى قوة المعلمة الثانية.log10(fieldorvalue): تُعيد اللوغاريتم الأساسي عشرة للحقل أو القيمة الممررة.sin(fieldorvalue): تُعيد الجيب للحقل أو القيمة الممررة، معبراً عنه بالراديان.cos(fieldorvalue): تُعيد جيب التمام للحقل أو القيمة الممررة، معبراً عنه بالراديان.tan(fieldorvalue): تُعيد الظل للحقل أو القيمة الممررة، معبراً عنه بالراديان.asin(fieldorvalue): تُعيد قوس الجيب للحقل أو القيمة الممررة، معبراً عنه بالراديان.acos(fieldorvalue): تُعيد قوس جيب التمام للحقل أو القيمة الممررة، معبراً عنه بالراديان.atan(fieldorvalue): تُعيد قوس الظل للحقل أو القيمة الممررة، معبراً عنه بالراديان.atan2(x, y): تُعيد الزاوية بالراديان المحصورة عند الأصل للنقطة ذات الإحداثيات (x, y) والمحور السيني الموجب. تكون النتيجة في النطاق من -pi() إلى pi().sqrt(fieldorvalue): تُعيد الجذر التربيعي غير السالب للحقل أو القيمة الممررة.exp(x): تُعيد قيمة e^x.pi(): تُعيد قيمة pi.
دوال التاريخ والوقت
تُخزَّن قيم التاريخ في rtSurvey كسلاسل نصية بتنسيق YYYY-MM-DD. تُخزَّن قيم التاريخ والوقت كسلاسل ISO 8601 (YYYY-MM-DDTHH:MM:SS). استخدم decimal-date-time() للتحويل إلى رقم للعمليات الحسابية (مثل حساب المدد).
today(): تُعيد تاريخ اليوم كسلسلة نصية بتنسيقYYYY-MM-DD. تُقيَّم مرة واحدة عند فتح النموذج.- مثال:
today()→'2024-03-15'
- مثال:
now(): تُعيد التاريخ والوقت الحاليين كسلسلة ISO 8601. تُقيَّم في كل مرة يُحسب فيها التعبير.- مثال:
now()→'2024-03-15T14:32:00.000+03:00'
- مثال:
date(value): تحوّل قيمة (سلسلة نصية أو رقم) إلى سلسلة تاريخ.- مثال:
date('2024-03-15')→'2024-03-15'
- مثال:
date-time(value): تحوّل قيمة إلى سلسلة تاريخ ووقت.- مثال:
date-time(${event_timestamp})
- مثال:
decimal-date-time(value): تحوّل سلسلة تاريخ أو تاريخ ووقت إلى رقم عشري يمثل الميلي ثانية منذ حقبة Unix مقسومة على 86400000 (أي أيام كسرية منذ 1970-01-01). استخدم هذا لإجراء العمليات الحسابية على التواريخ.- مثال: المدة بالأيام بين تاريخين:
decimal-date-time(${end_date}) - decimal-date-time(${start_date}) - مثال: المدة بالدقائق بين وقتين:
(decimal-date-time(${end_time}) - decimal-date-time(${start_time})) * 1440
- مثال: المدة بالأيام بين تاريخين:
format-date(date, format): تُنسّق قيمة تاريخ باستخدام سلسلة نمط.- رموز التنسيق:
%Y(السنة 4 أرقام),%y(السنة رقمان),%m(الشهر 01–12),%d(اليوم 01–31),%a(اختصار يوم الأسبوع),%b(اختصار اسم الشهر) - مثال:
format-date(today(), '%d/%m/%Y')→'15/03/2024'
- رموز التنسيق:
format-date-time(datetime, format): تُنسّق قيمة تاريخ ووقت باستخدام سلسلة نمط. تقبل جميع رموزformat-dateبالإضافة إلى:%H(الساعة 00–23),%h(الساعة 01–12),%M(الدقائق 00–59),%S(الثواني 00–59),%3(الميلي ثانية),%P(ص/م)- مثال:
format-date-time(now(), '%d/%m/%Y %H:%M')→'15/03/2024 14:32'
دوال Boolean
boolean(value): تحوّل أي قيمة إلى boolean. تُعيدtrueللسلاسل غير الفارغة والأرقام غير الصفرية وtrue؛ تُعيدfalseللسلاسل الفارغة و0وfalse.boolean-from-string(string): تُعيدtrueإذا كانت السلسلة'1'أو'true'(غير حساسة لحالة الأحرف)؛ تُعيدfalseبخلاف ذلك.true(): تُعيد القيمة booleantrue.false(): تُعيد القيمة booleanfalse.not(expression): تُعيد النفي المنطقي للتعبير. تُعيدtrueإذا كان التعبير false، والعكس صحيح.- مثال:
not(${consent} = 'yes')— عرض تحذير عندما لم تُعطَ الموافقة.
- مثال:
دوال سلاسل نصية إضافية
starts-with(string, prefix): تُعيدtrueإذا كانتstringتبدأ بـprefix.- مثال:
starts-with(${phone}, '+254')تتحقق من أن رقم الهاتف يبدأ برمز كينيا الدولي.
- مثال:
contains(string, substring): تُعيدtrueإذا كانتstringتحتوي علىsubstring.- مثال:
contains(${email}, '@')تتحقق من أن عنوان البريد الإلكتروني يحتوي على إشارة@.
- مثال:
substring-before(string, needle): تُعيد الجزء منstringالذي يظهر قبل أول ظهور لـneedle.substring-after(string, needle): تُعيد الجزء منstringالذي يظهر بعد أول ظهور لـneedle.normalize-space(string): تُزيل المسافات البيضاء في البداية والنهاية وتُقلّص جميع تسلسلات المسافات البيضاء الداخلية إلى مسافة واحدة.translate(string, search_chars, replace_chars): تستبدل كل حرف فيstringيظهر فيsearch_charsبالحرف المقابل فيreplace_chars.
دوال رياضيات إضافية
floor(number): تُعيد أكبر عدد صحيح أقل من أو يساويnumber.- مثال:
floor(4.9)= 4
- مثال:
ceiling(number): تُعيد أصغر عدد صحيح أكبر من أو يساويnumber.- مثال:
ceiling(4.1)= 5
- مثال:
random(): تُعيد رقماً عشرياً عشوائياً بين 0.0 (شامل) و1.0 (غير شامل).- مثال:
int(random() * 6) + 1→ رقم عشوائي من 1 إلى 6
- مثال:
coalesce(a, b): تُعيدaإذا كانتaغير فارغة؛ وإلا تُعيدb. مفيدة كخيار احتياطي عندما قد يكون الحقل فارغاً.once(value): تُقيّمvalueوتخزنها، لكن فقط إذا كان الحقل الحالي فارغاً. إذا كان الحقل يحتوي بالفعل على قيمة، تُعيدonce()القيمة الموجودة دون تغيير.- مثال:
once(uuid())يُنشئ UUID مرة واحدة ويُبقيه ثابتاً عبر إعادة التعديل.
- مثال:
دوال الجغرافيا
area(geoshape_value): تحسب المساحة بالمتر المربع المحاطة بقيمة geoshape (مضلع).- مثال:
area(${field_boundary})— حساب مساحة حقل مُساحَح. - مثال:
round(area(${field_boundary}) div 10000, 2)— التحويل إلى هكتار.
- مثال:
distance(coordinates): تحسب إجمالي طول المسار بالمتر لـ geotrace (خط)، أو المسافة بين نقطتَي geopoint.- مثال:
round(distance(${road_trace}) div 1000, 3)— طول الطريق بالكيلومتر.
- مثال:
دوال التحقق
regex(value, pattern): تُعيدtrueإذا كانتvalueتطابق نمط التعبير النمطيpattern. استخدم في عمودconstraintللتحقق المبني على النمط.- مثال:
regex(., '^[0-9]{10}$')— التحقق من رقم مكوّن من 10 أرقام. - مثال:
regex(., '^[A-Z]{2}[0-9]{6}$')— التحقق من تنسيق رقم جواز سفر.
- مثال:
checklist(min, max, v1, v2, ...): تُقيّم قائمة من تعبيرات boolean وتُعيدtrueإذا كان عدد القيمtrueبينminوmax(شامل).- مثال:
checklist(2, 3, ${q1} = 'yes', ${q2} = 'yes', ${q3} = 'yes')— تنجح إذا كانت 2 أو 3 من الشروط الثلاثة صحيحة.
- مثال:
weighted-checklist(min, max, v1, w1, v2, w2, ...): مثلchecklist()، لكن لكل قيمة وزن. يجب أن يكون مجموع أوزان القيمtrueبينminوmax.
دوال مساعدة
uuid(): يُنشئ UUID عشوائياً (تنسيق RFC 4122 v4) كسلسلة نصية.- يُستخدم عادةً مع
once()لإنشاء معرّف فريد ثابت:once(uuid())
- يُستخدم عادةً مع
version(): تُعيد قيمة سمةversionللنموذج كما هو محدد في ورقة عمل settings.position(): عند الاستدعاء داخل مجموعة تكرار، تُعيد الفهرس يبدأ من 1 لمثيل التكرار الحالي.thousandsep(length, separator, value): تُنسّق رقماً بفاصل آلاف.- مثال:
thousandsep(0, ',', 1234567)→'1,234,567'
- مثال:
substr-jsonpath(value, jsonpath): تستخرج سلسلة فرعية من سلسلة JSON باستخدام تعبير JSONPath.- مثال:
substr-jsonpath(${api_response}, '$.data.name')— استخراج حقلnameمن سلسلة JSON المخزنة فيapi_response.
- مثال: