عند الوصول إلى المجموعات من صفحة /g، هل هناك طريقة لجعل عنوان URL للمجموعة الذي تشير إليه هو /g/group-slug/messages بدلاً من /g/group-slug/members؟
لدينا عدة مجموعات تُستخدم لرسائل المجموعة. سيكون من المفيد إعطاء الأشخاص نقرة أقل للوصول إلى رسائل مجموعتهم. هذا أكثر أهمية بالنسبة لنا من عرض أعضاء المجموعة.
أعلم أنه يمكنني القيام بذلك عن طريق رابط مباشر، ولكني أريده أن يكون من صفحة /g?type=my التي تتميز بالديناميكية والتركيز على المستخدم.
عند الفحص الدقيق، كانت لديهم رسائل في الماضي، تم تحويلها إلى مواضيع أو حذفها. يكشف مستكشف البيانات أن هذه المجموعات لديها True في has_messages في جدول المجموعات.
لقد حاولت تغييرها لهذه المجموعات عبر Rails ولكني لا أستطيع تحقيق ذلك:
لقد نجح ذلك في كل شيء باستثناء اثنين - شكراً لك. أعتقد أن هذين الأخيرين المزعجين سأضطر إلى حذفهما وإعادة إنشائهما!
عند القيام بذلك، اكتشفت السبب - وهو #خطأ بسيط.
عند تحويل رسائل المجموعة الخاصة إلى مواضيع، يتم الاحتفاظ بمعلومات المدعو. في حين أن هذا لطيف إذا تم تحويل الموضوع مرة أخرى، إلا أنه يعني أنه يتم احتسابهم بشكل خاطئ عند تشغيل Group.refresh_has_messages!.
هل من الممكن أيضًا اعتراض الروابط التي تحصل عليها عند النقر على مجموعة تم ذكرها (@mentioned) ثم النقر للانتقال إلى المجموعة؟ أعتقد أن هذه هي الطريقتان الوحيدتان للوصول إلى المجموعات دون اللجوء إلى عناوين URL.
ما أبحث عنه الآن (جشع، أليس كذلك؟) هو في الواقع جعل جميع الروابط إلى المجموعات تتصرف بنفس الطريقة التي تجعل بها الكود الخاص بك تلك الموجودة في صفحة /g.
بالتأكيد، يمكنك تجربة شيء كهذا في علامة التبويب header لموضوعك/مكونك. تركت بعض التعليقات في المقتطف إذا كنت ترغب في المتابعة. يمكنك حذفها بمجرد أن تكون جاهزًا لاستخدامها.
تنطبق نفس القواعد. إذا كان المستخدم عضوًا في المجموعة وكانت المجموعة تحتوي على رسائل، فسيتم توجيه Discourse إلى صندوق الوارد للمجموعة. بخلاف ذلك، سينتقل المستخدم إلى دليل الأعضاء.
<script type="text/discourse-plugin" version="0.8">
// الجزء الأول: تعديل المسار للروابط في بطاقات المجموعات. هذا يضمن أن
// عنوان الرابط يعكس المكان الذي يؤدي إليه ويتعامل مع فتح الرابط في علامة تبويب جديدة.
const discourseComputed = require("discourse-common/utils/decorators").default;
api.modifyClass("component:group-card-contents", {
// خاصية groupPath تُستخدم لإنشاء href لروابط المجموعة
// في بطاقة المجموعة. دعنا نعدلها
@discourseComputed("group")
groupPath(group) {
// الحصول على القيمة الافتراضية من النواة
let groupURL = this._super(...arguments);
// إذا كان المستخدم يطابق متطلباتنا، قم بتعديل عنوان URL بحيث يؤدي إلى صندوق الوارد
if (group.is_group_user && group.has_messages) {
groupURL = `${groupURL}/messages/`;
}
// إرجاع القيمة الافتراضية أو المعدلة
return groupURL;
}
});
// الجزء الثاني: تعديل التوجيه داخل التطبيق. هذا يضمن أن التنقل العادي داخل التطبيق
// يتم التعامل معه بشكل صحيح ويوجه المستخدم إلى صندوق الوارد للمجموعة إذا استوفى
// المتطلبات
const DiscourseURL = require("discourse/lib/url").default;
const { groupPath } = require("discourse/lib/url");
const { action } = require("@ember/object");
api.modifyClass("controller:user-card", {
// showGroup هنا هو إجراء ينتمي إلى وحدة تحكم user-card.
// هذا هو ما يتم استدعاؤه عند النقر على اسم المجموعة / الصورة الرمزية داخل بطاقات المجموعات
@action
showGroup(group) {
// استدعاء super للتأكد من تحميل الكود من النواة أولاً
this._super(...arguments);
// group path هي وظيفة مساعدة لعنوان URL مدمجة في Discourse
let groupURL = groupPath(group.name);
// إذا كان المستخدم يطابق المتطلبات، قم بتعديل عنوان URL
if (group.is_group_user && group.has_messages) {
groupURL = `${groupURL}/messages/`;
}
// استدعاء routeTo() إما بعنوان URL الافتراضي للمجموعة أو المعدل
DiscourseURL.routeTo(groupURL);
}
});
</script>
أنت مذهل! إنه يعمل بشكل رائع مع أي حالة تستخدم البطاقات.
هناك الآن نوع واحد من الروابط لا يزال غير موجه: وهو المجموعة عند وجودها في رسالة خاصة جماعية. هذا مفيد جدًا للتنقل إلى المجموعة (وبالتالي إلى صندوق الوارد) من رسالة جماعية.
تستخدم هذه الروابط مُسلسِلًا مختلفًا قليلاً - لأنه لا يلزم وجود كل بيانات المجموعة هناك.
ومع ذلك، يمكنك تخزين قائمة مصفاة لمجموعات المستخدم الحالي عند عرض الصفحة الأولية واستخدامها كمرجع للتحقق من العضوية. هذه المعلومات متاحة بالفعل في الحمولة الأولية، لذلك لا يوجد حمل إضافي من حيث الطلبات الإضافية أو أي شيء من هذا القبيل. شيء مثل هذا
احتفظ بهذا المقتطف في علامات النص البرمجي الخاصة به وأضفه إلى الرأس مع المقتطفات الأخرى. تحتفظ به منفصلاً لأنه يقوم بإلغاء سريع إذا لم يكن المستخدم مسجلاً للدخول.
لدي شيء أخير أحتاج مساعدة فيه لإكماله تمامًا. أعرف أن هذا طلب جريء.
أحاول الآن تعديل Pavilion لدعم هذا السلوك أيضًا، باستخدام المنطق البسيط من مقتطفاتك الرائعة الثلاث. ومع ذلك، لا يمكنني جعله يعمل بسبب عدم كفاءتي في جافاسكريبت. هذا ما أحاول تعديله:
بالنسبة لبعض المجموعات التي بها “أشباح رسائل”، لا يعمل هذا. يمكن تحديد هذه المجموعات بواسطة هذا الاستعلام (بشرط أن يكون إرسال الرسائل مقيدًا في إعدادات تفاعل المجموعة):
SELECT id, name, has_messages, messageable_level
From groups
Where messageable_level < 10
AND messageable_level <> 3
AND has_messages = true
ORDER by id
يمكنك اختراق جدول groups لإجبار هذا على إعادة التعيين أيضًا (في وحدة تحكم Rails بالطبع، قم بعمل نسخة احتياطية أولاً!).