پلاگین ها

این بخش به پلاگین‌های جوملا می‌پردازد، اینکه پلاگین‌ها چه هستند و چگونه کار می‌کنند و چند نمونه پلاگین با انواع مختلف را معرفی می‌کند.

نحوه کار پلاگین‌ها 

نمودار زیر نشان می‌دهد پلاگین‌های جوملا چگونه کار می‌کنند.

فلش سمت چپ جریان کنترل در کد جوملا را نشان می‌دهد. در بازه‌های زمانی مشخص، یک نقطه مهم در روند اجرا فرا می‌رسد که مناسب است پلاگین‌ها در آن مرحله وارد عمل شوند. برای مثال:

- پس از اینکه جوملا عملیات اولیه‌سازی را انجام داده است

- هر زمانی که یک مقاله بازیابی شده باشد

- هر زمانی که یک فرم از یک تعریف فرم XML ساخته شده باشد

- قبل از اینکه آیتمی در پایگاه داده ذخیره شود

ایده این است که داده‌های مربوطه به کد پلاگین ارسال شود و پلاگین بتواند آیتم‌های داده را دستکاری کند تا تجربه کاربری نهایی تغییر کند. مثلا، متن یک مقاله ممکن است تغییر کند، یا یک فرم ممکن است گسترش یافته و داده‌های اضافی را جمع‌آوری کند.

گاهی پلاگین داده‌ای را برمی‌گرداند که ممکن است توسط کدی که رویداد را اجرا کرده، برای کنترل اجرای کد بعدی استفاده شود، یا ممکن است به خروجی HTML اضافه گردد.

فرایند درگیر کردن پلاگین‌ها شامل دو مرحله است:

1. ایمپورت کردن همه پلاگین‌های یک نوع مشخص 

2. فراخوانی (Trigger) یک رویداد

ایمپورت کردن یک نوع پلاگین توسط کد زیر انجام می‌شود:

PluginHelper::importPlugin($pluginType, …);

پلاگین‌ها بر اساس نوع دسته‌بندی می‌شوند و این نوع‌ها با زیرشاخه‌های موجود در پوشه `plugins` در سیستم جوملا هماهنگ هستند.

برای مثال، پس از اینکه جوملا مقداردهی اولیه شد، پلاگین‌های سیستم (یعنی پلاگین‌های داخل پوشه `plugins/system`) ایمپورت می‌شوند.

ایمپورت یک نوع پلاگین شامل موارد زیر است:

- پیدا کردن همه پلاگین‌های مرتبط با یک نوع خاص از پایگاه داده — نوع با یک زیرپوشه‌ی مرتبط در پوشه `/plugins` در سیستم فایل همخوانی دارد. در نمودار این پلاگین‌ها به صورت `plugin1`, `plugin2` و `plugin3` نشان داده شده‌اند.

- نمونه‌سازی (instantiate) هر یک از این پلاگین‌ها

- تعیین اینکه هر پلاگین مایل است به کدام رویدادها مشترک شود

- نوشتن اشتراک‌ها در یک مخزن داده که در نمودار به صورت جعبه‌ای با عنوان "Listeners" نمایش داده شده است.

تقسیم پلاگین‌ها بر اساس نوع به این شکل باعث بهبود کارایی جوملا می‌شود؛ چرا که نیازی نیست پلاگین‌هایی که به رویداد بعدی علاقه‌مند نیستند، پردازش شوند.

مرحله دوم فراخوانی رویداد (Trigger) از طریق یک فراخوانی به «ارسال‌کننده رویداد» (event dispatcher) است. جوملا در میان لیست شنونده‌ها (Listeners) جستجو می‌کند تا بداند کدام پلاگین‌ها مشترک آن نوع رویداد شده‌اند. سپس متد مرتبط پلاگین مشترک را فراخوانی کرده و داده‌های رویداد را به آن ارسال می‌کند، که اغلب به پلاگین امکان دستکاری آن داده‌ها را می‌دهد.

هر پلاگین که در آن رویداد مشترک شده به ترتیب (بر اساس اولویت) فراخوانی می‌شود و هر نتیجه‌ای که از پلاگین‌ها بازگردانده شود در آرایه‌ای جمع‌آوری می‌شود که با آن رویداد مرتبط است.

مثلا پس از مقداردهی اولیه جوملا پلاگین‌های سیستم ایمپورت شده و رویداد `onAfterInitialise` فراخوانی می‌شود. پلاگین «من را به یاد داشته باش» (واقع در `plugins/system/remember`) این رویداد را دریافت می‌کند و می‌تواند کاربری که قبلا گزینه «من را به یاد داشته باش» در فرم ورود را انتخاب کرده، وارد سیستم کند.

زمانی که یک پلاگین ایمپورت شده و اشتراک‌های آن در مخزن داده‌ی Listeners ثبت شد، برای همه رویدادهای مشترک ادامه دریافت اعلان‌ها را دارد. مثلا این سناریو را در نظر بگیرید:

- پلاگین‌های سیستم ایمپورت می‌شوند و رویداد `onAfterInitialise` فراخوانی می‌شود 

- مدتی بعد پلاگین‌های محتوا ایمپورت شده و رویداد `onContentPrepare` فراخوانی می‌شود.

پلاگین‌های سیستم که مرحله اول ایمپورت شده‌اند می‌توانند به رویداد `onContentPrepare` مشترک باشند، هرچند این رویداد مربوط به پلاگین‌های محتوا است، و اگر مشترک باشند آن رویداد را دریافت می‌کنند بدون نیاز به بارگذاری دوباره آنها.

همچنین باید آگاه باشید که برخلاف کامپوننت‌ها و ماژول‌ها، در جوملا تفاوتی بین پلاگین‌های سایت و مدیر وجود ندارد. پلاگین‌هایی که نصب می‌کنید در همه بخش‌ها (سایت، مدیریت و برنامه‌های API) اجرا می‌شوند، بنابراین بهتر است در پلاگین‌های خود زمینه‌ی کاربرد (application context) را بررسی کنید.

برای کسانی که بخواهند تصویر دقیق‌تری از نحوه کار پلاگین‌ها داشته باشند، نمودار توالی (sequence diagram) در ادامه مقاله موجود است.