Documentation menu

عنصر تأكيد الحضور

سؤال مجاني «هل ستحضر؟» مع دعم للسعة وقائمة الانتظار — النظير المجاني لحدّ مخزون التذاكر المدفوعة في عنصر المنتج، للفعاليات التي تحتاج فقط إلى عدد الحاضرين لا إلى تحصيل مبلغ.

آلية العمل

يتصرّف تأكيد الحضور بلا ضيوف تمامًا مثل تصويت الاستطلاع ذي الاختيار الواحد: يُعرض «نعم» و«لا» في صورة زوج أزرار الاختيار نفسه القائم على الرابط أولًا الذي ينتجه buildChipGroup لخيار الاستطلاع. ويحدث التأكيد في العرض المباشر المستضاف (أو مباشرة عبر إرسال نموذج داخل الرسالة حيثما يدعمه تطبيق البريد) قبل تسجيل أي شيء، فلا تستطيع أداة فحص في شركة تجلب الرابط مسبقًا تضخيم العدد.

يؤدي تفعيل السماح باصطحاب ضيوف إلى تغيير رد «نعم» فقط: لا يستطيع رابط GET عادي تقديم خيار كما يستطيع حقل نموذج حقيقي، لذا يصبح عدد الضيوف عنصر تحكّم حركيًا <form><select> مقصورًا على العرض المباشر. وهذا يماثل حاجة إجابات النص والرابط في عنصر الواجب إلى العرض المباشر لكل ما لا يستطيع رابط ثابت حمله. ويُعرض «نعم (اختر عدد الضيوف)» رابطًا عاديًا إلى العرض المباشر نفسه في بديل المستوى 2/المستوى 3، بدلًا من أن يقود مباشرة إلى /act. أما «نعم» بلا ضيوف (اختيار 0 ضيوف، أو تعطيل الضيوف كليًا) فيظل يصل إلى /act رابطًا عاديًا بنقرة واحدة في الحالتين — فخطوة عدد الضيوف وحدها هي التي تحتاج إلى العرض المباشر.

تجري محاسبة السعة داخل معاملة Firestore واحدة تؤدي أيضًا التحقق من التكرار لكل مستلم. وعلى عكس عملية الدفع في عنصر المنتج، التي تكتفي بإعادة التحقق من استعلام .count() وتسترد المبلغ عند سباق نادر يُباع فيه أكثر من المتاح، لا يملك تأكيد الحضور أي صمام أمان على غرار الاسترداد في مواجهة رد يتجاوز السعة. لذا يحدث القرار والكتابة معًا بشكل ذرّي، لا في خطوتين منفصلتين قد يفصل بينهما سباق. اضبط السعة على أكثر من 0، وبمجرد أن تتجاوزها تأكيدات الحضور المؤكَّدة مع ضيوفها، يُسجَّل الرد في قائمة الانتظار بدلًا من تأكيده، ويرى المستلم رسالة قائمة الانتظار التي كتبتها بنفسك بدلًا من شكر عام.

يُسجَّل رد «لا» دائمًا اعتذارًا، ولا يُقارن أبدًا بالسعة. والسعة 0 تعني غير محدودة، وهو اصطلاح «0 = غير مضبوط» نفسه الذي يستخدمه حقل المخزون في عنصر المنتج. أما الرد المجهول (دون رمز مستلم — مثل رد من ملف HTML مُصدَّر ولُصق في مزوّد خدمة بريد (ESP) خارجي) فيتخطّى التحقق من التكرار كليًا، إذ لا يوجد مستلم يُبنى عليه المفتاح. ومع ذلك يمرّ عبر معاملة السعة نفسها، فلا يستطيع سيل من الردود المجهولة تجاوز حدّ قائمة الانتظار؛ وكل ما لا يتوفّر في هذا المسار هو كشف التكرار لكل شخص.

إذا كان للمشروع تاريخ إغلاق أو حدّ أقصى للردود مضبوط (راجع دورة حياة الاستبيان)، يستبدل تأكيد الحضور المغلق بالزرّين نسختين رماديتين غير نشطتين مع ملاحظة «هذا الاستبيان مغلق» في العرض المباشر.

الحقول القابلة للضبط:

  • السؤال — الافتراضي «هل ستحضر؟»
  • السعة (0 = غير محدودة).
  • السماح باصطحاب ضيوف — يضيف أداة اختيار عدد الضيوف إلى «نعم».
  • الحد الأقصى للضيوف لكل تأكيد حضور (إذا سُمح بالضيوف) — يحدّ نطاق أداة الاختيار (1–20).
  • رسالة قائمة الانتظار — تُعرض بدلًا من الشكر المعتاد بمجرد بلوغ السعة.
  • لون الخلفية، والحشو، والحد، واستدارة الزوايا للبطاقة.
  • لون السؤال/حجمه، وتخصيصات لون زرّي «نعم»/«لا» وخلفيتهما.

يُجمَّع كل تأكيد حضور في أعداد المؤكَّدين/المعتذرين/المدرجين في قائمة الانتظار وإجمالي الضيوف، ويُكتب مباشرة في خانة التجميع rsvpBlocks الخاصة بالمشروع بدلًا من المرور عبر مسار زيادة الردود العام الذي يستخدمه كل عنصر آخر. وهذا استثناء متعمّد، لأن قرار التأكيد أو الإدراج في قائمة الانتظار يجب أن يحدث داخل المعاملة نفسها التي يحدث فيها العدّ.

أمثلة

Subject

Will you join us?

يبدأ غرض المشروع «فعالية» مشروعًا جديدًا بعنصر تأكيد حضور موضوع مسبقًا إلى جانب رابط الاجتماع والمكان والإضافة إلى التقويم. اضبط سعة لمكان محدود المقاعد، وسيتولى العنصر قائمة الانتظار دون أي إعداد إضافي — راجع الفعاليات والندوات عبر الإنترنت. ويستخدم نادٍ العنصر نفسه لاختبارات انتقاء اللاعبين أو لعدد محدود من المقاعد في رحلة مباراة خارج الأرض، فتُبقي السعة عدد الحاضرين دقيقًا دون حاجة أحد إلى تتبّعه يدويًا — راجع الفرق والأندية الرياضية. أما لقاء مجتمعي مجاني بلا حدّ للمقاعد إطلاقًا فيترك السعة عند 0 ببساطة، مستخدمًا تأكيد الحضور لعدٍّ موثوق للحاضرين فقط دون أي فرض للسعة.

كيف يبدو البديل الثابت

<div id="em-rsvp-1" style="margin:12px 0;background-color:transparent">
  <p style="margin:0 0 10px;font-weight:600;font-size:16px;color:#111827">Will you attend?</p>
  <div>
    <span class="kn-fallback">
      <a href="https://mailinapp.com/v/eyJhbGci.../act?blockId=rsvp-1&blockType=rsvp&action=rsvp&response=yes"
         style="display:inline-block;margin:0 6px 6px 0;padding:8px 14px;border:1px solid #d1d5db;
                border-radius:6px;background-color:#ffffff;color:#111827;font-size:14px;text-decoration:none">
        Yes
      </a>
      <a href="https://mailinapp.com/v/eyJhbGci.../act?blockId=rsvp-1&blockType=rsvp&action=rsvp&response=no"
         style="display:inline-block;margin:0 6px 6px 0;padding:8px 14px;border:1px solid #d1d5db;
                border-radius:6px;background-color:#ffffff;color:#111827;font-size:14px;text-decoration:none">
        No
      </a>
    </span>
  </div>
</div>

هذا هو بديل المستوى 2 بلا ضيوف: روابط عادية إلى /v/[token]/act، مطابقة في شكلها لأزرار خيارات الاستطلاع، وتظهر حيثما لا يُعرض النموذج داخل الرسالة.

انظر أيضًا