Skip to the content.

فصل ۳: فرآیند نصب ماژول (Installation)

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

۳.۱. نصب جداول دیتابیس (TablesInstaller)

برای ایجاد جداول مورد نیاز ماژول در دیتابیس، کافیست فایل‌های SQL خود را در پوشه sql/ در ریشه ماژول قرار دهید.

مثال (install.sql):

CREATE TABLE IF NOT EXISTS `_DB_PREFIX_wabulkupdate_file` (
    `id_wabulkupdate_file` INT(11) UNSIGNED NOT NULL AUTO_INCREMENT,
    `file_name` VARCHAR(255) NOT NULL,
    `status` TINYINT(1) NOT NULL DEFAULT 0,
    `date_add` DATETIME NOT NULL,
    `date_upd` DATETIME NOT NULL,
    PRIMARY KEY (`id_wabulkupdate_file`)
) ENGINE=_MYSQL_ENGINE_ DEFAULT CHARSET=utf8;

نکته: اگر می‌خواهید فایل‌های SQL را در مسیر دیگری قرار دهید، می‌توانید مسیر کامل آن‌ها را در پراپرتی‌های $pathFileSqlInstall و $pathFileSqlUninstall در کلاس اصلی ماژول خود مشخص کنید.

۳.۲. افزودن تب‌های مدیریت (TabsInstaller)

برای ساخت منوهای ماژول در پنل مدیریت، کافیست ساختار آن‌ها را در پراپرتی $moduleTabs در کلاس اصلی ماژول خود تعریف کنید.

ساختار این آرایه به صورت ['AdminClassName' => [options]] است.

مثال (از ماژول wabulkupdate):

در این مثال، ابتدا یک تب اصلی به نام AdminBulkUpdate تعریف شده و سپس بقیه تب‌ها به عنوان فرزند آن قرار گرفته‌اند.

// wabulkupdate.php

public function initModule()
{
    // ...
    $this->moduleGrandParentTab = 'AdminBulkUpdate'; // نام کلاس تب اصلی
    
    $this->moduleTabs = [
        // تب اصلی
        'AdminBulkUpdate' => [
            'title' => $this->l('Bulk Update'),
            'parent_class_name' => '', // والد ندارد، پس در ریشه قرار می‌گیرد
            'icon' => 'icon-cloud-upload',
        ],
        // تب‌های فرزند
        'AdminBulkUpdatePanel' => [
            'title' => $this->l('Panel'),
            'parent_class_name' => $this->moduleGrandParentTab, // فرزند AdminBulkUpdate است
            'icon' => 'icon-dashboard',
        ],
        'AdminBulkUpdateFiles' => [
            'title' => $this->l('Files'),
            'parent_class_name' => $this->moduleGrandParentTab,
            'icon' => 'icon-file-text',
        ],
        'AdminBulkUpdateLogs' => [
            'title' => $this->l('Logs'),
            'parent_class_name' => $this->moduleGrandParentTab,
            'icon' => 'icon-list-ul',
        ]
    ];
}

۳.۳. ثبت خودکار هوک‌ها (HooksInstaller)

یکی از بزرگترین مزایای PrestaSDK، عدم نیاز به ثبت دستی هوک‌هاست. کلاس HooksInstaller با استفاده از Reflection API در PHP، کلاس اصلی ماژول شما را بررسی کرده و تمام متدهای پابلیک که با پیشوند hook شروع می‌شوند را پیدا می‌کند و هوک متناظر با آن‌ها را به صورت خودکار ثبت می‌کند.

برای مثال، اگر بخواهید به هوک actionProductUpdate متصل شوید، کافیست متد زیر را در کلاس اصلی ماژول خود ایجاد کنید:

// mymodule.php

class MyModule extends PrestaSDKModule
{
    // ...
    
    public function hookActionProductUpdate($params)
    {
        // Your logic here...
        $product = $params['product'];
        // Do something with the updated product.
    }

    public function hookDisplayHeader($params)
    {
        // Your logic for header...
    }
}

هنگام نصب، هوک‌های actionProductUpdate و displayHeader به صورت خودکار برای ماژول شما ثبت خواهند شد.

۳.۴. مدیریت تنظیمات اولیه (Config)

برای تعریف مقادیر پیش‌فرض برای تنظیمات ماژول، از پراپرتی $moduleConfigs استفاده کنید. این پراپرتی یک آرایه از key => value است که در آن key نام متغیر در جدول ps_configuration و value مقدار پیش‌فرض آن است.

مثال:

// mymodule.php

public function initModule()
{
    // ...
    $this->perfixConfigs = 'MYMODULE'; // (اختیاری) یک پیشوند برای جلوگیری از تداخل نام
    
    $this->moduleConfigs = [
        'MYMODULE_ENABLE_FEATURE' => 1,
        'MYMODULE_API_KEY' => 'default_api_key',
        'MYMODULE_ITEMS_PER_PAGE' => 10,
    ];
}

در زمان نصب، کلاس Config تمام این مقادیر را به صورت خودکار در دیتابیس ذخیره می‌کند. برای خواندن این مقادیر در هر جای ماژول، می‌توانید از متد کمکی زیر استفاده کنید:

$apiKey = $this->config->getConfig('API_KEY'); 
// خروجی: 'default_api_key'
// نیازی به نوشتن پیشوند نیست