در این پست نحوه نوشتن ماژول/پسوند با رویدادها را خواهید فهمید.
از آنجا که Opencart 3.0.3.5 تغییرات فایل ocmod الگوها را تغییر نمی دهدو بنابراین اگر تغییراتی در افزونه خود داشته باشید که بایدفایلهای opencart را تغییر دهید ، اعمال نمی شوند. بنابراین تنها راه اضافه کردن منو یاجاوا اسکریپت یا css اضافی از طریق رویدادها است.
مزایا و محدودیت هایی در مورد رویدادها وجود دارد. مهمترین تغییر مهم این است که شما فایل را تغییر نمی دهید ، اما می توانید داده های منتقل شدهبه نمای را تغییر دهید . یادگیری رویدادها دشوارتر است ، اما پس از آن به برخی ازرشته های یک فایل که ممکن است با نسخه جدید تغییر کند ، تکیه نمی کنید و بنابراین افزونه یا ماژول شما دیگر کار نمی کند.


این رویداد دارای 3 بخش مهم است:
1. شناسه رویداد
2. trgger

3. و در نهایت کدی که هنگام روشن شدن رویداد اجرا می شود
بیایید با یک ماژول نمونه شروع کنیم که در قسمت admin seciton منویی را در منوی

سمت چپ اضافه می کند و همچنین یک فایل جاوا اسکریپت را در هدر سایت اضافه می کند.همانطور که می دانید هر افزونه/ماژول باید دارای یک دایرکتوری "بارگذاری" باشد که باید حاوی کد باشد.بنابراین ما به 2 فایل نیاز داریم - کنترل کننده و فایل ترجمه (در غیر این صورت ماژول جدی ما دارای عنوان "heading_title" است که در زندگی واقعی چندان مفید نیست).


upload/admin/controller/extension/module/example_event_extension.php
upload/admin/language/en-gb/extension/module/example_event_extension.php

در فایل زبان باید حداقل 1 سطر وجود داشته باشد که عنوانماژول باشد. بنابراین محتویات فایل شبیه خواهد بود


$_['heading_title'] = 'Example Event Extension';

در حال حاضر مهمترین بخش - کنترل کننده.

class ControllerExtensionModuleExampleEventExtension extends Controller {
public function install()
{
$this->load->model('setting/event');
$this->model_setting_event->addEvent(
'example_event_extension_menu',
'admin/view/common/column_left/before',
'extension/module/example_event_extension/addMenu'
);
$this->model_setting_event->addEvent(
'example_event_extension_script',
'admin/view/common/header/before',
'extension/module/example_event_extension/addScript'
);
}
public function uninstall()
{
$this->load->model('setting/event');
$this->model_setting_event->deleteEventByCode(
'example_event_extension_menu'
);
$this->model_setting_event->deleteEventByCode(
'example_event_extension_script'
);
}
public function addMenu($eventRoute, &$data)
{
$data['menus'][] = [
'id' => 'some-menu-example',
'icon' => 'fa fa-shopping-cart fa-fw',
'name' => 'Example extension',
'href' => '#test',
''
];
}
public function addScript($eventRoute, &$data)
{
$data['scripts'][] = 'view/javascript/example.js';
}
}

بنابراین ، در کنترلری که دارای نام کلاس ControllerExtensionModuleExampleEventExtension
و گسترش دهنده کنترلر است ، 2 عملکرد اصلی وجود دارد:
install () و حذف ()آنها مسئول ثبت نام و ثبت نام رویداد در سایت خواهند بود.در install همانطور که می بینید ما تنظیمات/رویداد مدل را بارگذاری می کنیم و سپس از تابع استفاده می کنیم



$this->model_setting_event->addEvent($event_id, $trigger, $code);



$ event_id - این شناسه رویدادی است که می توانید دربرنامه Extensions> Events مشاهده کنید که در آن می توانید فعال یا غیرفعال کنید یا رویداد را ازسایت حذف کنید . کنوانسیون نامگذاری باید با حروف کوچک و کوچک باشد ، اما من شک دارم که این موضوع اهمیتی داشته باشد. در فایل نمونه من شناسه من "example_event_extension_menu" است

$ trigger - این زمانی است که رویداد "آتش" می گیرد. مهم است بدانید کهماشه دارای 2 مکان است که می توان آن را "قبل" و "بعد" اجرا کرد.
$ code - این به فایل و عملکردی که کد را اجرا می کند اشاره می کند (برای این کار
کمی بعد)
این محرک ها را می توان در کنترل کننده ، مدل ، نمای ، زبان و غیره اعمال کرد. برای مشاهده همه گزینه های ممکن ، توصیه می کنم به فایل زیر نگاهی بیندازید:

system/storage/modification/system/engine/loader.php / شما.
بنابراین در مثال ما عوامل ما عبارتند از:




admin/view/common/column_left/before
admin/view/common/header/before


اولی مسئول اضافه کردن منوی جدید و دومی جاوا اسکریپت است.
همانطور که می بینید ماشه راه فایل را دنبال می کند که باید "دستکاری" شود.

در مورد ما اولین مورد "admin/view/common/column_left" است و ماشه قبل از ارائه اجرا می شود. اگر در انتها /after را اضافه کنیم ،
html رندر شده نمای را دریافت می کنیم .
به همان روشی که می توانید در admin/controller/common/header فعال کنید ، پس از آن

می توانید کنترل کننده و داده های آن را تغییر دهید.در مورد ما در رویداد قبل ، ما متغیر $ data را داریم که از
کنترلر به نمای منتقل می شود.و در نهایت ما به کدی نیاز داریم که هنگام روشن شدن رویداد اجرا شود. (بخش کد $)

در مثال ساده شده ما ، کد به همان فایل کنترل کننده اشاره می کند:




extension/module/example_event_extension/addMenu
extension/module/example_event_extension/addScript


اکنون این قسمت پیچیده است ، حداقل مدتی طول کشید تا منطق را درک کنم ، اما
همانطور که می بینید کد اجرا شده دارای پیشوند"admin/controller" نیست ومسیر باید به جای نام کلاس از مسیر نام فایل پیروی کند. ، اما این طور است
در مثال ما چون کد $ ما در یک فایل است ، قسمت

"extension/module/example_event_extension" به معنی مسیر فایل بدون مدیر و کنترل کننده است و در نهایت شما در انتها تابع را دارید که باید اجرا شود.حال اگر به این نقطه رسیدید ، می توانید متغیر $ $ را که به عنوان آرگومان دوم تابع ارسال می شود ، رها کنید و همه گره هایی را که
از کنترلر به نمای منتقل می کنید مشاهده کنید و بنابراین در تابع addMenu ما یک نهایی اضافه می کنیم گره
و در addScript اسکریپت را به گره اسکریپت ها اضافه می کنیم.
و بس شما می توانید متغیر $ data را تغییر دهید و بنابراین محتوای جدید ما را اضافه کنید.البته یک تابع حذف () وجود دارد که فقط سطرهای رویداد را ازجدول رویدادها حذف می کند و بنابراین حذف می شوند.

اگر ساختار مشابهی دارید ، پس از نصب ، باید یک ماژول جدید در زیرآن داشته باشیدبخش Extensions/Extensions/Modules که می توانید نصب/حذف کنید. علاوه بر این ، میتوانید یک صفحه جزئیات را در بخش ویرایش ماژول اضافه کنید که در آن می توانید
پیکربندی های اضافی را برای ماژول خود اضافه کنید.
نمونه کامل را می توانید در اینجا بیابیداگر در نظرات زیر نظری دارید ، به من اطلاع دهید.