إنشاء لافتة "الفئات المميزة" للصفحة الرئيسية

أرغب في إنشاء قسم بانر يقع أسفل رأس الصفحة الرئيسية ويضم بعض مربعات التصنيفات المُزخرفة. على سبيل المثال:

أدرك أنه يمكنني استخدام منفذ “below-site-header” والتعليمات الواردة في كيفية إضافة محتوى مخصص يظهر فقط في صفحتك الرئيسية لإخراج شفرة HTML الخاصة بي.

في مثالي، أود أن يكون لدي حقل إعداد مخصص من نوع القائمة المنسدلة (enum) لاختيار التصنيفات التي سيتم عرضها هنا. هل من الممكن وجود حقل إعداد مخصص يسمح لك بالبحث عن التصنيفات؟

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

بشكل عام، هل يبدو هذا ممكنًا، وهل توجد أي مخاطر محتملة أو حيل يجب أن أكون على دراية بها؟

فكّر في استخدام إضافة TLP كبداية. توجد بالفعل ميزة “الصور المميزة” تشير إلى المواضيع. قد تتمكن من إعادة استخدام بعض الكود.

هل يمكنه استخدام هذا؟

نظرًا لأن الفئات أقل ديناميكية، فقد يكون اتباع نهج أكثر ثباتًا منطقيًا :+1:

أعتقد أنك تحتاج إلى تحديد ما إذا كنت تريد أن يكون الأمر قائمًا على البيانات أم لا.

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

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

أعتقد أن الاختبارين الرئيسيين هما:

  1. هل توجد طريقة قياسية لعرض عنصر تكوين ‘تحديد تصنيف’؟
  2. هل توجد طريقة قياسية لإضافة حقول بيانات وصفية إلى نافذة إعدادات التصنيف؟

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

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

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

لقد راجعت منشورًا سابقًا كتبته كريز وقمت بتكييفه مباشرةً ليكون شيئًا يمكنك استخدامه كقاعدة. تم تغطية الكثير مما ورد هنا من قبله في موضوعه الأصلي.
https://meta.discourse.org/t/how-to-add-a-featured-topic-list-to-your-discourse-homepage/132949

سيتم إضافة جميع الأكواد إلى قسم <head> (head_tag.html) في سُمكك (Theme).

سيقوم هذا القسم الأول بالتحقق مما إذا كانت الصفحة التي تتصفحها هي “الصفحة الرئيسية”.

سنقوم بعد ذلك بالحصول على تصنيفات الموقع باستخدام طريقة Category.list() على فئة التصنيف.

ثم سنقارن هذه التصنيفات بالتصنيفات التي تريد إبرازها. ستكون هذه التصنيفات موجودة في مصفوفة definedFeaturedCategories المحددة في الكود أدناه. سيتم تعيين تلك التي تسمح بها للمكون المراد تمريره إلى قالب للتصيير.

<script type="text/discourse-plugin" version="0.8">
  const Category = require("discourse/models/category").default;
  // سنستخدم نموذج Category لاسترجاع تصنيفات الموقع

  api.registerConnectorClass('above-main-container', 'featured-categories', {
    // above-main-container هو منفذ الإضافة (plugin outlet)،
    // featured-topics هو اسم المكون المخصص الخاص بك

    setupComponent(args, component) {

      api.onPageChange((url, title) => {
        console.log(url,title)
        if ((url === "/") || (url === "/latest") ) {
        // عند تغيير الصفحة، تحقق مما إذا كان الرابط يطابق
        // إذا لم تكن صفحتك الرئيسية هي /latest، غيّر هذا إلى /categories
        
          $('html').addClass('custom-featured-categories');
          // أضف فئة إلى وسم HTML لتسهيل استهدافها عبر CSS

          let definedFeaturedCategories = ["uncategorized","blog","two"]
          // مصفوفة التصنيفات التي تريد إبرازها
          // تأكد من وضع عناوين التصنيفات بحروف صغيرة

          let featuredCategories = [];

          categories = Category.list();

          for (let cat of categories) {
            if (definedFeaturedCategories.includes(cat.name.toLowerCase())) {
              // تقوم فقط بإدراج التصنيفات التي تريد إبرازها في المصفوفة المراد تصييرها
              featuredCategories.push(cat)
            }
          }

          component.set('featuredCategories', featuredCategories)

        } else {

        // إذا لم تطابق الصفحة الروابط المذكورة أعلاه، افعل هذا:
          $('html').removeClass('custom-featured-categories');
          // أزل الفئة المخصصة الخاصة بنا
          component.set('categories',[])
          // اضبط التصنيفات على مصفوفة فارغة لتعطيل التصيير
        }
      });
    }
  });
</script>

يقوم هذا القسم التالي بحقن القالب الخاص بالمكون الذي تم إنشاؤه أعلاه في منفذ الإضافة above-main-container. سيقوم باستدعاء categories-wrapper المخصص الذي تم إنشاؤه في الخطوة الثالثة وتحديد categories لتكون featuredCategories التي تم إنشاؤها أعلاه.

<script type="text/x-handlebars" data-template-name="/connectors/above-main-container/featured-categories">
      <div class="custom-featured-categories-wrapper">
        {{categories-wrapper categories=featuredCategories}}
          <!-- استخدم قالب categories-wrapper الذي تم إنشاؤه أدناه -->
          <!-- حدد التصنيفات لتكون featuredCategories التي تم إنشاؤها في السكربت أعلاه -->
      </div>
</script>

يُنشئ القسم الثالث قالب categories-wrapper المخصص بلغة Handlebars لتصيير التصنيفات المميزة. تم تكييفه مباشرةً من قالب categories-only.hbs الخاص بـ Discourse المستخدم في صفحة التصنيفات في Discourse.

<script type="text/x-handlebars" data-template-name="components/categories-wrapper">
  <!-- هذا ينشئ قالب مكون يُسمى 'categories wrapper' -->
  <!-- تم تكييف جميع أكواد هذا القالب من قالب صفحة التصنيفات الخاص بـ Discourse نفسه
   https://github.com/discourse/discourse/blob/acd1693dac1bff6ff50250d942134bc48a27ff14/app/assets/javascripts/discourse/templates/components/categories-only.hbs -->

  <div class="top-categories-wrapper">
    {{#each categories as |c|}}
        <div class="top-category-column-one">
          {{category-title-link category=c}}
          {{#if c.escription}}
            <div class="category-description">
              {{dir-span c.description}}
            </div>
          {{/if}}
          {{#if c.isGrandParent}}
            <table class="category-list subcategories-with-subcategories">
              <tbody>
                {{#each c.subcategories as |subcategory|}}
                  <tr
                    data-category-id={{subcategory.id}}
                    data-notification-level={{subcategory.notificationLevelString
                    }}
                    class="{{if
                        subcategory.description_excerpt
                        "has-description"
                        "no-description"
                      }}
  
                      {{if subcategory.uploaded_logo.url "has-logo" "no-logo"}}"
                  >
                    <td
                      class="category"
                      style={{border-color subcategory.color}}
                    >
                      {{category-title-link tagName="h4" category=subcategory}}
                      {{#if subcategory.description_excerpt}}
                        <div
                          class="category-description subcategory-description"
                        >
                          {{{dir-span subcategory.description_excerpt}}}
                        </div>
                      {{/if}}
                      {{#if subcategory.subcategories}}
                        <div class="subcategories">
                          {{#each subcategory.subcategories as |subsubcategory|
                          }}
                            {{#unless subsubcategory.isMuted}}
                              <span class="subcategory">
                                {{category-title-before category=subsubcategory
                                }}
                                {{category-link subsubcategory hideParent="true"
                                }}
                              </span>
                            {{/unless}}
                          {{/each}}
                        </div>
                      {{else if subcategory.description_excerpt}}
                        <div
                          class="category-description subcategory-description"
                        >
                          {{{dir-span subcategory.description_excerpt}}}
                        </div>
                      {{/if}}
                    </td>
                  </tr>
                {{/each}}
              </tbody>
            </table>
          {{else if c.subcategories}}
            <div class="subcategories">
              {{#each c.subcategories as |subcategory|}}
                {{#unless subcategory.isMuted}}
                  <span class="subcategory">
                    {{category-title-before category=subcategory}}
                    {{category-link subcategory hideParent="true"}}
                    {{category-unread category=subcategory}}
                  </span>
                {{/unless}}
              {{/each}}
            </div>
          {{/if}}
        </div>
        <div class="top-category-column-two">
          <span class="topics-header">
            Topics
          </span>
          <span class="topics-count">
            {{c.topic_count}}
          </span>
          {{category-unread category=c tagName="div" class="unread-new"}}
        </div>
    {{/each}}
  </div>
</script>

هذا يجب أن يساعدك في البدء بالقيام بما طلبته في منشورك الأصلي (OP).

بالنسبة لتنسيق لون كل مربع تصنيف وفقًا لألوانه المخصصة المحددة، في القسم الثالث، يمكنك ترميز الأنماط يدويًا باستخدام # + c.color للوصول إلى كود لون التصنيف.

بصرف النظر عن ذلك، يمكن إجراء التنسيق في ملف common.scss.

واو! شكرًا لك على هذه الإجابة المفصلة والمفيدة للغاية، @jordan.vidrine! سأجربها وأخبرك بنتيجتي :slight_smile:

هذا عمل بشكل ممتاز، @jordan.vidrine:

الشيء الغريب الوحيد هو أن المواضيع لا يتم تحميلها إلا بعد زيارة /categories، وإلا فسيبدو كما لو أنه لا توجد مواضيع على الإطلاق:

هل لديك أي فكرة عما يحدث هناك؟

هه. آسف، لست متأكدًا. لا أستطيع إعادة إنتاج هذه المشكلة.