مُعدِّلات السمة: مقدمة موجزة

مع تزايد طموح الثيمات، كنا نبحث عن طرق للسماح لها بالتلاعب بالسلوك الأساسي الخاص بالخادم. في حين أنه لن يُمنح أبدًا نفس مستوى التحكم الذي تتمتع به الإضافات (plugins)، يمكننا توفير بعض نقاط الربط المحددة مسبقًا ليتمكن الثيمات من التلاعب بها.

نقدم لكم: مُعدِّلات الثيمات :partying_face:

يتم تحديدها باستخدام المفتاح modifiers في ملف about.json الخاص بالثيم الخاص بك.

للحصول على قائمة مُحدَّثة بنسبة 100% من المُعدِّلات، تحقق من مخطط قاعدة البيانات في أسفل theme_modifier_set.rb، ولكن إليك ملخص سريع لما لدينا حتى الآن:

  • serialize_topic_excerpts قيمة منطقية (boolean) (الافتراضي false) - تضمين المقتطفات دائمًا عند تسلسل قوائم المواضيع

  • csp_extensions مصفوفة سلاسل نصية (string array) - إضافة توجيهات إلى CSP. يعمل بنفس طريقة طريقة إعداد الثيم القديمة “extend_content_security_policy”. ولكن تذكر، يتم السماح بوسوم \u003cscript src=\"\"\u003e البسيطة تلقائيًا.

  • svg_icons مصفوفة سلاسل نصية (string array) - قائمة بالأيقونات التي يجب تضمينها في مجموعة الأيقونات الفرعية

  • topic thumbnails مصفوفة أبعاد (array of dimensions) - طلب دقة إضافية في مجموعة صور مصغرات المواضيع. لاحظ أنها تُنشأ بشكل غير متزامن، لذا يجب عليك الرجوع إلى الصورة الأصلية إذا لم يتم توفير الحجم الذي طلبته. مزيد من المعلومات في رسالة الالتزام (commit message)

  • serialize_post_user_badges مصفوفة سلاسل نصية (string array) - قائمة بأسماء الشارات (تطابق الإدخالات في جدول الشارات) لتسلسلها جنبًا إلى جنب مع بيانات المنشور. عند التكوين، يقوم النظام بتضمين شارات المستخدم المحددة مع كل منشور للعرض من جانب العميل.

أحد الثيمات التي تستخدم هذه النقاط الجديدة بكثافة هو Topic List Thumbnails - ألقِ نظرة على الكود لترى كيف يعمل.

المُعدِّلات المعتمدة على الإعدادات

يمكن أيضًا تكوين مُعدِّلات الثيم لسحب قيمتها من إعداد ثيم، مما يسمح لمشغلي الموقع بتجاوز سلوك المُعدِّل دون تعديل كود الثيم. لجعل مُعدِّل يعتمد على إعداد، استخدم هذا النحو في ملف about.json الخاص بك:

{
  "modifiers": {
    "modifier_name": {
      "type": "setting",
      "value": "setting_name"
    }
  }
}

على سبيل المثال، إذا كان لديك إعداد ثيم يسمى show_excerpts وتريد أن يتحكم في المُعدِّل serialize_topic_excerpts:

في settings.yml:

show_excerpts:
  default: false

في about.json:

{
  "modifiers": {
    "serialize_topic_excerpts": {
      "type": "setting",
      "value": "show_excerpts"
    }
  }
}

عندما يتم تغيير إعداد show_excerpts، سيتم تحديث قيمة المُعدِّل تلقائيًا لتتطابق. يوفر هذا مرونة لمشغلي الموقع لتخصيص سلوك الثيم من خلال واجهة المشرف (admin UI).


يتم التحكم في إصدار هذه الوثيقة - اقترح التغييرات على github.

35 إعجابًا

ديفيد، ربما يكون من الكسل قليلاً أن أطلب منك هذا، ولكن هل هناك أي طريقة للوصول إلى هذا في إضافة:

يمكن للسمات طلب أحجام مصغرة إضافية باستخدام معدّل في ملف about.json الخاص بها:

سأحاول ترحيل إضافة TLP إلى هذا المخطط الجديد، وسيكون من الجيد الحصول على نفس الوصول إلى الميزات من خلال إضافة، على الأقل في الوقت الحالي.

إعجابَين (2)

لا يوجد حالياً، لكن سأبحث في الأمر :eyes:

6 إعجابات

ديفيد، ما هي الطريقة الصحيحة لإعادة إنشاء الصور المصغرة بكميات كبيرة؟

لقد جربت للتو استخدام هذه الميزة على أحد مواقع الويب الخاصة بي، ويبدو أنها عالجت حوالي 10% من المواضيع… ثم توقفت (أو رفضت معالجة الباقي). والسبب الذي يجعلني أعتقد أنها توقفت هو أن المواضيع التي تم إنتاج صور مصغرة لها كانت أحدث 10%.

إعادة طهي المنشورات لا تبدو حلاً فعالاً. في الواقع، قمت بتشغيل عملية إعادة طهي جماعية وأتساءل عما إذا كان ذلك قد أثار المشكلة…

لاحظت أنه يمكن ملء حقل image_url، لكن لا توجد صور مصغرة.

أي نصيحة، نقدرها!

إعجاب واحد (1)

هذا العمود لا يقوم بأي شيء، وسيتم إزالته قريبًا جدًا. image_upload_id هو ما تحتاجه.

لا يجب أن يكون هناك حاجة لذلك. لقد صممت النظام عمدًا بحيث يمكن للأشخاص تثبيت مواضيع جديدة دون الحاجة إلى التلاعب بوحدة التحكم. يتم إنشاء الصور المصغرة بشكل غير متزامن عند الحاجة. على سبيل المثال:

  • تضيف موضوعًا جديدًا يطلب دقات جديدة
  • يطلب مستخدم موضوعًا، فنحن نقدم الصور المصغرة الموجودة. إذا لم تكن بعض الأحجام موجودة، فإننا نخطط لعملية Sidekiq.
  • في المرة التالية التي يطلب فيها شخص ما الموضوع، ستكون الصور المصغرة الصحيحة موجودة

إذا كان حجم الصورة المصغرة المطلوبة أكبر من الحجم الأصلي، فلن نضطر إلى إنشاء الصورة المصغرة.

لذا فإن الشيء الحاسم الذي يجب مراعاته لكي يعمل هذا هو:

هناك مثال على منطق العودة هذا في مكون موضوع الصور المصغرة الذي قمت بإنشائه - لا تتردد في سرقة المنطق منه.

5 إعجابات

هل يتم تسلسل الإرجاع كـ thumbnailsl[0]؟ نعم، أنا أتعامل مع ذلك بالفعل. (تنفيذ رائع، بالمناسبة، سهل التعامل معه للغاية)

هل من الممكن أن بعض الصور لا ‘تتوافق مع المعايير’ أو لا تستوفي الشروط؟

السلوك المتوفر في إضافة TLP سيستخرج صورًا مصغرة من نوع one-box. وهذا لا يحدث في كل الحالات هنا، كما أعتقد.

على سبيل المثال، إذا توفرت لديك بعض الوقت، يرجى إلقاء نظرة على هذه الأمثلة:

لا أعتقد أن هذه الصور المصغرة تستوفي المعايير. حيث يتم تسلسل الصور المصغرة على أنها null.

نعم، هذا مقصود - فقد تلقينا العديد من الطلبات لإزالة الصور المصغرة الصغيرة للـ onebox. على سبيل المثال، كان بعض المستخدمين ينتهي بهم الأمر باستخدام صورة ملفهم الشخصي على GitHub كصورة مصغرة للموضوع، وهو أمر نادرًا ما يكون مقصودًا.

لاحظ أنه في حالة الـ oneboxes التي تكون فيها الصورة هي المحتوى الفعلي (مثل صور إنستغرام/تويتر/إلخ)، سيتم اختيارها.

أما بالنسبة لفيديو يوتيوب، فقد قمت بإصلاحه أمس.

5 إعجابات

أهلاً، شكرًا لك على التأكيد.

هذا غريب، كان البناء أحدث، لكن يبدو أن بعض العناصر ما زالت تُغفل.

نعم، هذا أحد الأسباب التي دفعتني إلى تنفيذ أداة لاختيار الصورة المصغرة في الحالات التي لا تكون فيها الاختيارات الآلية مثالية. قد أريد تعديل هذا السلوك لاحقًا، لكنني سأحاول القيام بذلك عبر الإضافة.

شكرًا لك على وقتك، ديفيد!

إعجابَين (2)

حسناً، لقد تمكنت من حل المشكلة. بعد جلسة تصحيح (byebug) لم تكن مثمرة إلى حد ما، لم أستطع معرفة سبب عدم ظهور صور مصغرة لمنشورات يوتيوب القديمة.

ثم خطر لي الأمر. والسبب هو هذا:

لذلك أقترح أنه قد يكون من الضروري إعادة المعالجة (re-bake) بعد تعيين هذا الرقم إلى قيمة أكبر بكثير (365؟).

أعتقد أنني محق في القول إنه إذا لم يتم تحميل شيء ما محلياً، فلن يتم إنشاء صورة مصغرة له؟ …

4 إعجابات

:+1: صحيح، هذا يعمل فقط للتحميلات المحلية… قد نحتاج إلى إعادة التفكير في إعداد “الحد الأقصى للأيام القديمة” :thinking:

8 إعجابات

لدي خطة، وسأحاول تنفيذها هذا الأسبوع. سؤال واحد: هل تحتاج إلى أن تكون القيم ديناميكية؟

أي: هل سيتم تحديد الدقات عند التشغيل؟ أم أثناء التشغيل (على سبيل المثال، عبر إعدادات الموقع)؟

الأول أسهل… لكن الثاني قد يكون ممكنًا أيضًا :thinking:

إعجابَين (2)

شكرًا لك على الاطلاع.

أحتاج فقط إلى حل ثابت، تمامًا مثل مكون السمة.

سيكون من الجميل وجود إعداد للموقع.

سأضيف من باب الإفصاح الكامل: أود الترحيل بعيدًا عن الإضافة، لذا فإن التطابق مع حل مكون السمة سيكون كافيًا تمامًا.

إعجابَين (2)

@merefield ها هو:

أتمنى أن يشرح رسالة الالتزام كيفية عمله، ولكن أخبرني إذا كان لديك أي أسئلة

7 إعجابات

ممتاز. تمت إضافته إلى TLP ويبدو أنه يعمل! شكرًا لمساعدتك!

4 إعجابات

تم تقسيم 4 منشورات إلى موضوع جديد: الحصول على صور مصغرة من نقاط نهاية JSON

هل يمكننا جعله يعمل أيضًا مع الصور من خوادم بعيدة؟ على سبيل المثال، صور من بلوجر أو بيكاسا أو أمازون إس 3؟

بما أن ديسكورت يدعم الاستضافة على أمازون إس 3 للمواقع الكبيرة التي تحتوي على صور ضخمة، فإن ضرورة استضافة كل شيء مباشرة على الخادم المحلي يجعل منهجية التصميم هذه تبدو عيبًا.

مع هذا التحديث، ليس من السهل إصلاح الأمر في موقعي لأننا نستخدم خادمًا آخر لاستضافة الصور. الآن أصبح الانتقال إلى خادم تابع مع وجود منشورات كثيرة أمرًا صعبًا للغاية، بينما يكون حجم الصور كبيرًا جدًا لاستضافته على الخادم المحلي.

تم تصميم هذا للعمل فقط مع “التحميلات” في Discourse. يمكن أن تكون هذه التحميلات على S3 أو خدمة أخرى، إذا كنت تستخدم

نوصي باستخدام إعداد الموقع download_remote_images لتحميل الصور تلقائيًا التي يتم ربطها مباشرة من مواقع أخرى.

4 إعجابات

مرحبًا ديفيد، هل هناك أي إجراء خاص يجب اتخاذه لضمان إمكانية استخدام أيقونات Pro في TC؟

إعجاب واحد (1)

لا يوجد شيء خاص، لا. يجب أن يعمل بنفس الطريقة تمامًا مثل استخدام أيقونات Pro في أماكن أخرى في Discourse. أظن أنك تستخدم هذا الإضافة لتمكين أيقونات Pro؟

إذا لم يعمل، فأخبرني وسأقوم بالتحقق :eyes:

إعجابَين (2)

نعم، نحن كذلك. سنحاول مرة أخرى. شكرًا على ردك في وقت متأخر من مساءك!

إعجابَين (2)