لقد وجدت حلاً لتحديث هذه الحالة المحددة تلقائيًا. لا توجد إمكانية لتحديث واجهة برمجة التطبيقات (API) لخيارات الحقول المخصصة، لقد وجدت حلاً من جانب الخادم هنا من خلال مهمة مجدولة (cron job). لم أستخدم ملف json، بل استخدمت إدخالات قاعدة البيانات للأتمتة.
حالة الاستخدام
تتمثل حالة الاستخدام لهذه الأتمتة في السماح للمستخدمين الجدد بتحديد الخيارات الموجودة عند التسجيل، مما يمكن أن يساعد النظام على التطور مع تزايد معرفة المستخدمين بتفضيلاتهم. إذا لم يتمكن المستخدم الجديد من العثور على خيار مناسب، فيمكنه إدخال نصه الخاص في حقل النص المخصص، والذي يمكن بعد ذلك إضافته إلى قائمة منسدلة للمستخدم التالي.
يجب استخدام هذا بحذر، حيث أن التغييرات في قواعد بيانات Discourse يمكن أن تتسبب في تعطل النظام، ويوصى به للمطورين ذوي الخبرة فقط!
المتطلبات:
الخطوة 1:
قم بإنشاء حقلين مخصصين في /admin/customize/user_fields، أحدهما بقائمة منسدلة والآخر بنص فقط (في مثالي: قائمة منسدلة مع user_field_5 ونص مع user_field_8).
ملاحظة: يمكن استرداد المعرف من /admin/customize/user_fields.json.
الخطوة 2:
من الأفضل استخدام Discourse Data Explorer للتحقق من مدخلاتك: Discourse Data Explorer
قم بإنشاء استعلام جديد ضمن /admin/plugins/explorer:
مثال: خيارات حقول المستخدم
SELECT * FROM user_field_options WHERE user_field_id='5'
قم بتغيير user_field_id=‘5’ إلى user_field_id الخاص بك للقائمة المنسدلة ‘x’ ثم سيتم عرض القيم التي يتم عرضها لخيارات القائمة المنسدلة الخاصة بك.
قم بإنشاء استعلام ثانٍ:
مثال: حقول المستخدم المخصصة
SELECT * FROM user_custom_fields WHERE name = 'user_field_8'
قم بتغيير ‘user_field_8’ إلى حقل النص المخصص الخاص بك ‘user_field_x’ ثم سيتم عرض القيم التي أدخلها المستخدمون للنص.
الخطوة 3: هذه هي الأساسيات لبرنامج cron job الخاص بك لتحديث قاعدة بيانات user_field_options، حيث يتم سرد جميع الخيارات للحقول المخصصة، والتي لها القيمة المرتبطة 5 بالنسبة لي بسبب user_field_5. أريد إضافة خيارات هناك.
أولاً، نقوم بإنشاء نص برمجي bash في دليل Discourse
cd /var/discourse
nano update_dropdown.sh
أضف المحتوى التالي إذا تم تشغيل Discourse كـ Docker:
#!/bin/bash
cd /var/discourse
docker exec -i app su postgres -c "psql discourse -c \"UPDATE user_custom_fields SET value = (SELECT value FROM user_field_options WHERE user_field_id = 5 AND user_field_options.value = user_custom_fields.value) WHERE name = 'user_field_8' AND value IS NOT NULL AND value NOT IN (SELECT value FROM user_field_options);\""
تأكد من حفظ النص البرمجي وجعله قابلاً للتنفيذ
chmod +x update_dropdown.sh
ثم يمكنك بدء النص البرمجي واختباره
cd /var/discourse
./update_dropdown.sh
الخطوة 4: لأتمتة هذا، نحتاج إلى إضافة النص البرمجي bash كمهمة cron:
crontab -e
يفتح هذا محرر مهام cron، حيث تضيف الرمز في السطر التالي:
* * * * * /var/discourse/update_dropdown.sh
بعد ذلك، سيتم تنفيذ الأمر كل دقيقة. يمكن تعديل هذا بالطبع، ويجب تعديل المسار اعتمادًا على المكان الذي قمت فيه بتخزين update_dropdown.sh على الخادم.