Создание модуля в PerfexCRM
- Перейдите в папку установки Perfex CRM и откройте каталог modules
- Создайте новый каталог и назовите его в честь вашего модуля (например, sample_module)
- Создайте новый PHP-файл с тем же именем, что и у каталога модуля, в данном случае sample_module.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 вашего модуля с помощью:
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 переменной.
$CI = &get_instance();После того как вы присвоите объект переменной, вы будете использовать эту переменную вместо $this
$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
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, ни с другими модулями.
add_option($name, $value, $autoload)$name Обязательно (строка). Название добавляемой опции. Убедитесь, что оно уникально и начинается с префикса, например, с названия вашего модуля.
$value Значение параметра (строка)
$autoload (целое число) 1 или 0 Следует ли автоматически загружать этот параметр вместе со всеми остальными параметрами. Если вы слишком часто используете этот параметр в представлении, лучше всего загрузить его автоматически, чтобы избежать множественных запросов для получения параметра. По умолчанию 1
Помните, что функция add_option не создаст опцию, если её название уже существует в таблице опций.
get_option($option_name);Получите параметр из базы данных. $option_name (строка) — имя вашего параметра.
update_option($option_name, $new_value);Функция update_option обновляет значение параметра. Начиная с версии 2.3.3, при вызове update_option , если параметр не существует, Perfex CRM создаст его.
Примеры файлов:
Пример файла инициализации модуля
<?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
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');
}