التدوينة السابقة: Developing Discourse Plugins - Part 4 - Setup git
في بعض الأحيان، لا تكون إعدادات الموقع كافية كواجهة إدارية لتعمل إضافة البرنامج كما تريد. على سبيل المثال، إذا قمت بتثبيت إضافة discourse-akismet، فقد تلاحظ أنها تضيف عنصر تنقل إلى قسم الإضافات في لوحة إدارة discourse:
في هذه التدوينة، سنوضح لك كيفية إضافة واجهة إدارية لإضافتك. سأسمّي إضافتي «purple-tentacle» (المجسّ الأرجواني) تكريمًا لـ واحدة من ألعاب الكمبيوتر المفضلة لدي. بجدية، أحبّ تلك اللعبة حقًا!
إعداد مسار الإدارة
لنبدأ بإضافة ملف 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.
الأسطر التي تلي ذلك تقوم بإعداد تعيين المسارات على جانب الخادم لإضافتنا. تفترض discourse تقريبًا أن كل مسار على الواجهة الأمامية له مسار على جانب الخادم يوفر البيانات. في مثال هذه الإضافة، لا نحتاج فعليًا إلى أي بيانات من الخلفية، لكننا نحتاج إلى إخبار discourse بتقديم شيء ما في حال قام المستخدم بزيارة /admin/plugins/purple-tentacle مباشرة. يخبر هذا السطر discourse فقط: «مرحبًا، إذا زار المستخدم هذا العنوان مباشرة على جانب الخادم، فاعرض محتوى الإضافات الافتراضي!»
(إذا كان هذا مربكًا فلا تقلق كثيرًا، سنعود إليه في تدوينة مستقبلية عندما نتعامل مع إجراءات جانب الخادم.)
بعد ذلك، سنضيف قالبًا سيتم عرضه عندما يزور المستخدم المسار /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 /> مكونًا في discourse نستخدمه لعرض زر مع عنوان وأيقونة.
لربط قالبنا الجديد، نحتاج إلى إنشاء خريطة مسار:
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"
إذا قمت بإعادة تشغيل خادم التطوير، فيجب أن تتمكن من زيارة /admin/plugins وسترى رابطنا! إذا نقرت عليه، فسترى الزر لعرض المجس الأرجواني:
للأسف، عند النقر على الزر، لا يحدث شيء ![]()
إذا نظرت إلى وحدة تحكم المطور، فسترى خطأً يوفر دليلًا على سبب ذلك:
Uncaught Error: Nothing handled the action 'showTentacle'`
نعم، السبب هو أننا في قالبنا نعتمد على شيئين:
- عند نقر المستخدم على الزر، سيتم استدعاء
showTentacleفي وحدة التحكم. - يجب أن يقوم
showTentacleبتعيين الخاصيةtentacleVisibleإلىtrueحتى تظهر الصورة.
إذا لم تكن قد قرأت دليل Ember حول وحدات التحكم، فإن الوقت مناسب للقيام بذلك، لأننا سنقوم بتنفيذ وحدة تحكم لقالب 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: مخارج الإضافات
الجزء 3: إعدادات الموقع
الجزء 4: إعداد git
الجزء 5: هذا الموضوع
الجزء 6: اختبارات القبول
الجزء 7: نشر إضافتك
يتم التحكم في إصدار هذا المستند - اقترح التغييرات على GitHub.






