الدورة التدريبية السابقة: Developing Discourse Plugins - Part 4 - Setup git
في بعض الأحيان، لا تكون إعدادات الموقع كافية كواجهة إدارية لعمل إضافتك بالطريقة التي تريدها. على سبيل المثال، إذا قمت بتثبيت إضافة discourse-akismet، فقد لاحظت أنها تضيف عنصر تنقل إلى قسم الإضافات في لوحة تحكم Discourse الخاص بك:
في هذه الدورة التدريبية، سنوضح لك كيفية إضافة واجهة إدارية لإضافتك. سأطلق على إضافتي اسم purple-tentacle، تكريمًا لـ أحد ألعاب الحاسوب المفضلة لدي. بجدية، أنا أحب ذلك اللعبة حقًا!
إعداد مسار الإدارة (Admin Route)
لنبدأ بإضافة ملف plugin.rb كما فعلنا في الأجزاء السابقة من الدورة التدريبية.
plugin.rb
# name: purple-tentacle
# about: A sample plugin showing how to add a plugin route
# version: 0.1
# authors: Robin Ward
# url: https://github.com/discourse/purple-tentacle
add_admin_route 'purple_tentacle.title', 'purple-tentacle'
Discourse::Application.routes.append do
get '/admin/plugins/purple-tentacle' => 'admin/plugins#index', constraints: StaffConstraint.new
end
تخبر سطر add_admin_route نظام Discourse أن هذه الإضافة ستحتاج إلى رابط في صفحة /admin/plugins. سيكون عنوانه purple_tentacle.title من ملف ترجمات i18n الخاص بنا، وسيرتبط بمسار purple-tentacle.
تقوم الأسطر التالية بإعداد تعيين المسارات على جانب الخادم (server side) لإضافتنا. إحدى الافتراضات التي يقوم بها Discourse هي أن كل مسار تقريبًا في الواجهة الأمامية له مسار على جانب الخادم يوفر البيانات. في مثال الإضافة هذا، لا نحتاج فعليًا إلى أي بيانات من الخلفية (back end)، لكننا نحتاج إلى إخبار Discourse بتقديم شيء ما في حال قام المستخدم بزيارة /admin/plugins/purple-tentacle مباشرة. هذا السطر يخبره فقط: ‘مرحبًا، إذا قام المستخدم بزيارة هذا الرابط مباشرة على جانب الخادم، قم بتقديم محتوى الإضافات الافتراضي!’
(إذا كان هذا مربكًا، فلا تقلق كثيرًا، سنعود إليه في دورة تدريبية مستقبلية عندما نتعامل مع الإجراءات على جانب الخادم.)
الآن، سنضيف قالبًا (template) سيُعرض عندما يزور المستخدم المسار /admin/plugins/purple-tentacle. سيكون مجرد زر يعرض صورة متحركة (GIF) لحبرقة بنفسجية عندما ينقر المستخدم على الزر:
assets/javascripts/discourse/templates/admin/plugins-purple-tentacle.gjs
import DButton from "discourse/components/d-button";
<template>
{{#if @controller.tentacleVisible}}
<div class="tentacle">
<img src="https://eviltrout.com/images/tentacle.gif" />
</div>
{{/if}}
<div class="buttons">
<DButton
@label="purple_tentacle.show"
@action={{@controller.showTentacle}}
@icon="eye"
@id="show-tentacle"
/>
</div>
</template>
إذا كنت قد تعلمت أساسيات handlebars، فيجب أن يكون فهم القالب بسيطًا إلى حد ما. <DButton /> هو مكوّن (component) في Discourse نستخدمه لعرض زر مع تسمية وأيقونة.
لربط قالبنا الجديد، نحتاج إلى إنشاء خريطة مسارات (route map):
assets/javascripts/discourse/purple-tentacle-route-map.js
export default {
resource: "admin.adminPlugins",
path: "/plugins",
map() {
this.route("purple-tentacle");
},
};
خريطة المسارات هي شيء أضفناه إلى discourse للسماح للإضافات بإضافة مسارات إلى تطبيق ember. الصياغة داخل map() تشبه جدًا موجّه Ember. في هذه الحالة، خريطة المسارات لدينا بسيطة جدًا، فهي تعلن عن مسار واحد فقط يُدعى purple-tentacle تحت /admin/plugins.
أخيرًا، لنضيف نصوص الترجمة الخاصة بنا:
config/locales/client.en.yml
en:
js:
purple_tentacle:
title: "Purple Tentacle"
show: "Show Purple Tentacle"
إذا أعدت تشغيل خادم التطوير (development server)، فيجب أن تتمكن من زيارة /admin/plugins وسترى رابطنا! إذا نقرت عليه، فسترى الزر لعرض حبرقتنا البنفسجية:
للأسف، عند النقر على الزر، لا يحدث شيء ![]()
إذا نظرت إلى وحدة تحكم المطور (developer console)، يجب أن ترى خطأً يقدم تلميحًا عن السبب:
Uncaught Error: Nothing handled the action 'showTentacle'`
آه نعم، السبب هو أننا نعتمد في قالبنا على بضع أشياء:
- أن
showTentacleسيتم استدعاؤها على المتحكم (controller) عندما ينقر المستخدم على الزر. - يجب أن يحدد
showTentacleالخاصيةtentacleVisibleإلىtrueحتى تظهر الصورة.
إذا لم تكن قد قمت بقراءة أدلة Ember حول المتحكمات (Controllers) بعد، فهذه فرصة جيدة للقيام بذلك، لأننا سننفذ متحكمًا (controller) لقالب purple-tentacle الخاص بنا للتعامل مع هذه المنطق.
أنشئ الملف التالي:
assets/javascripts/discourse/controllers/admin-plugins-purple-tentacle.js
import Controller from "@ember/controller";
import { action } from "@ember/object";
import { tracked } from "@glimmer/tracking";
export default class AdminPluginsPurpleTentacleController extends Controller {
@tracked tentacleVisible = false;
@action
showTentacle() {
this.tentacleVisible = true;
}
}
والآن عند تحديث صفحتنا، يعرض النقر على الزر شخصيتنا المتحركة!
سأترك الأمر كتمرين إضافي للقارئ لإضافة زر يخفي الحبرقة عند النقر عليه ![]()
إذا كنت تواجه مشكلة في جعل نسختك من هذه الإضافة تعمل، فقد قمت برفعها إلى github.
المزيد في السلسلة
الجزء 1: أساسيات الإضافات
الجزء 2: فتحات الإضافات (Plugin Outlets)
الجزء 3: إعدادات الموقع
الجزء 4: إعداد git
الجزء 5: هذا الموضوع
الجزء 6: اختبارات القبول
الجزء 7: نشر إضافتك
هذا المستند مُدار بإصدارات - اقترح تعديلات على github.






