Skip to content

Создание модуля в PerfexCRM

  • Перейдите в папку установки Perfex CRM и откройте каталог modules
  • Создайте новый каталог и назовите его в честь вашего модуля (например, sample_module)
  • Создайте новый PHP-файл с тем же именем, что и у каталога модуля, в данном случае sample_module.php, этот файл будет выступать в качестве «файла инициализации» для этого модуля.

Внимание

Очень важно убедиться, что название папки с модулем и название файла .php совпадают, иначе ваш модуль не будет отображаться в списке модулей

Комментарий будет выступать в качестве заголовка файла для модуля

php
<?php

/**
 * Ensures that the module init file can't be accessed directly, only within the application.
 */
defined('BASEPATH') or exit('No direct script access allowed');

/*
Module Name: Sample Perfex CRM Module
Description: Sample module description.
Version: 2.3.0
Requires at least: 2.3.*
*/

Доступные параметры мета-описания модуля

Ниже приведён список доступных заголовков, которые можно добавить в файл инициализации модуля.

  • Module Name — обязательно
  • Module URI — URL модуля
  • Version — версия модуля
  • Description — вописание модуля, вы можете объяснить, что делает модуль.
  • Author — имя автора модуля
  • Author URI — URL автора модуля
  • Requires at least — какая версия Perfex CRM требуется для работы модуля

Основные хуки

При создании нового модуля вам нужно будет реализовать несколько базовых хуков, таких как register_activation_hook(), register_deactivation_hook() и register_uninstall_hook()

Добавление хуков

Вы можете добавить хуки в файлы .php вашего модуля с помощью:

php
hooks()->add_action($tag, $function_to_add, $priority = 10, $accepted_args = 1);
hooks()->add_filter($tag, $function_to_add, $priority = 10, $accepted_args = 1);
hooks()->do_action($tag, $arg = '');
hooks()->apply_filters($tag, $value, $additionalParams);

Вы можете добавить собственные фильтры и действия, чтобы использовать их в реализации своего модуля. Добавление действий и фильтров поможет другим модулям взаимодействовать с вашим модулем и расширять его функциональные возможности.

Пользовательские функции с префиксом

Вам следует всегда добавлять префикс к любым пользовательским функциям и классам, чтобы избежать конфликтов с функциями или классами Perfex CRM по умолчанию или с любыми другими модулями.

Использование экземпляра Codeigniter в файлах модулей

Вероятно, вы захотите использовать экземпляр фреймворка Codeigniter в файле инициализации вашего модуля или в любых других файлах модулей, которые не расширяют базовые классы фреймворка.

$this работает только в ваших контроллерах, моделях или представлениях.

Этого можно добиться в любом файле с помощью следующего кода.

Сначала присвойте объект CodeIgniter переменной.

php
$CI = &get_instance();

После того как вы присвоите объект переменной, вы будете использовать эту переменную вместо $this

php
$CI  =&get_instance();

$CI->load->helper('module_name/helper_name');
$CI->load->library('module_name/library_name');

Префикс базы данных

Начиная с версии 2.3.0 в Perfex CRM появилась возможность задавать собственный префикс для таблиц базы данных.

Префикс таблицы по умолчанию в Perfex CRM — tbl

При запросе к базе данных всегда следует использовать нашу пользовательскую функцию db_prefix(), чтобы получить префикс базы данных. Это гарантирует, что в случае изменения префикса базы данных пользователем ваш модуль будет работать с новым префиксом пользователя.

Вот пример из файла Goals Tracking модуля install.php.

php
<?php

defined('BASEPATH') or exit('No direct script access allowed');

if (!$CI->db->table_exists(db_prefix() . 'goals')) {
    $CI->db->query('CREATE TABLE `' . db_prefix() . "goals` (
  `id` int(11) NOT NULL,
  `subject` varchar(191) NOT NULL,
  `description` text NOT NULL,
  `start_date` date NOT NULL,
  `end_date` date NOT NULL,
  `goal_type` int(11) NOT NULL,
  `contract_type` int(11) NOT NULL DEFAULT '0',
  `achievement` int(11) NOT NULL,
  `notify_when_fail` tinyint(1) NOT NULL DEFAULT '1',
  `notify_when_achieve` tinyint(1) NOT NULL DEFAULT '1',
  `notified` int(11) NOT NULL DEFAULT '0',
  `staff_id` int(11) NOT NULL DEFAULT '0'
) ENGINE=InnoDB DEFAULT CHARSET=" . $CI->db->char_set . ';');

Создание параметров модуля

Perfex CRM имеет таблица в базе данных параметры для хранения различных настроек для внутреннего использования и настроек, которые применяются в функциях. Мы разработали специальные PHP-функции, которые выполняют запросы для получения параметров из базы данных.

Имена параметров — это строки, и они должны быть уникальными, чтобы не конфликтовать ни с Perfex CRM, ни с другими модулями.

php
add_option($name, $value, $autoload)

$name Обязательно (строка). Название добавляемой опции. Убедитесь, что оно уникально и начинается с префикса, например, с названия вашего модуля.

$value Значение параметра (строка)

$autoload (целое число) 1 или 0 Следует ли автоматически загружать этот параметр вместе со всеми остальными параметрами. Если вы слишком часто используете этот параметр в представлении, лучше всего загрузить его автоматически, чтобы избежать множественных запросов для получения параметра. По умолчанию 1

Помните, что функция add_option не создаст опцию, если её название уже существует в таблице опций.

php
get_option($option_name);

Получите параметр из базы данных. $option_name (строка) — имя вашего параметра.

php
update_option($option_name, $new_value);

Функция update_option обновляет значение параметра. Начиная с версии 2.3.3, при вызове update_option , если параметр не существует, Perfex CRM создаст его.

Примеры файлов:

Пример файла инициализации модуля
php
<?php

defined('BASEPATH') or exit('No direct script access allowed');

/*
Module Name: Menu Setup
Description: Default module to apply changes to the menus
Version: 2.3.0
Requires at least: 2.3.*
*/

define('MENU_SETUP_MODULE_NAME', 'menu_setup');

$CI = &get_instance();

hooks()->add_filter('sidebar_menu_items', 'app_admin_sidebar_custom_options', 999);
hooks()->add_filter('sidebar_menu_items', 'app_admin_sidebar_custom_positions', 998);

hooks()->add_filter('setup_menu_items', 'app_admin_setup_menu_custom_options', 999);
hooks()->add_filter('setup_menu_items', 'app_admin_setup_menu_custom_positions', 998);
hooks()->add_filter('module_menu_setup_action_links', 'module_menu_setup_action_links');
hooks()->add_action('admin_init', 'menu_setup_init_menu_items');

/**
* Add additional settings for this module in the module list area
* @param  array $actions current actions
* @return array
*/
function module_menu_setup_action_links($actions)
{
    $actions[] = '<a href="' . admin_url('menu_setup/main_menu') . '">' . _l('main_menu') . '</a>';
    $actions[] = '<a href="' . admin_url('menu_setup/setup_menu') . '">' . _l('setup_menu') . '</a>';

    return $actions;
}
/**
* Load the module helper
*/
$CI->load->helper(MENU_SETUP_MODULE_NAME . '/menu_setup');

/**
* Register activation module hook
*/
register_activation_hook(MENU_SETUP_MODULE_NAME, 'menu_setup_activation_hook');

function menu_setup_activation_hook()
{
    require_once(__DIR__ . '/install.php');
}

/**
* Register language files, must be registered if the module is using languages
*/
register_language_files(MENU_SETUP_MODULE_NAME, [MENU_SETUP_MODULE_NAME]);

/**
 * Init menu setup module menu items in setup in admin_init hook
 * @return null
 */
function menu_setup_init_menu_items()
{
    /**
    * If the logged in user is administrator, add custom menu in Setup
    */
    if (is_admin()) {
        $CI = &get_instance();
        $CI->app_menu->add_setup_menu_item('menu-options', [
            'collapse' => true,
            'name'     => _l('menu_builder'),
            'position' => 60,
        ]);

        $CI->app_menu->add_setup_children_item('menu-options', [
            'slug'     => 'main-menu-options',
            'name'     => _l('main_menu'),
            'href'     => admin_url('menu_setup/main_menu'),
            'position' => 5,
        ]);

        $CI->app_menu->add_setup_children_item('menu-options', [
            'slug'     => 'setup-menu-options',
            'name'     => _l('setup_menu'),
            'href'     => admin_url('menu_setup/setup_menu'),
            'position' => 10,
        ]);
    }
}
Пример файла установки install.php
php
<?php

defined('BASEPATH') or exit('No direct script access allowed');

/*
 * The file is responsible for handing the mailbox installation
 */

add_option('mailbox_enabled', 1);
add_option('mailbox_imap_server', '');
add_option('mailbox_encryption', '');
add_option('mailbox_folder_scan', 'Inbox');
add_option('mailbox_check_every', 3);
add_option('mailbox_only_loop_on_unseen_emails', 1);

if (!$CI->db->table_exists(db_prefix() . 'goals')) {
    $CI->db->query('CREATE TABLE `' . db_prefix() . "goals` (
  `id` int(11) NOT NULL,
  `subject` varchar(191) NOT NULL,
  `description` text NOT NULL,
  `start_date` date NOT NULL,
  `end_date` date NOT NULL,
  `goal_type` int(11) NOT NULL,
  `contract_type` int(11) NOT NULL DEFAULT '0',
  `achievement` int(11) NOT NULL,
  `notify_when_fail` tinyint(1) NOT NULL DEFAULT '1',
  `notify_when_achieve` tinyint(1) NOT NULL DEFAULT '1',
  `notified` int(11) NOT NULL DEFAULT '0',
  `staff_id` int(11) NOT NULL DEFAULT '0'
) ENGINE=InnoDB DEFAULT CHARSET=" . $CI->db->char_set . ';');

    $CI->db->query('ALTER TABLE `' . db_prefix() . 'goals`
  ADD PRIMARY KEY (`id`),
  ADD KEY `staff_id` (`staff_id`);');

    $CI->db->query('ALTER TABLE `' . db_prefix() . 'goals`
  MODIFY `id` int(11) NOT NULL AUTO_INCREMENT, AUTO_INCREMENT=1');
}

Опубликовано под лицензией MIT.