JoomHelpDesk includes its own internal plugin system that is entirely separate from Joomla's native plugin architecture. These internal plugins extend the helpdesk's functionality across many areas: background jobs, UI customization, ticket event handling, email processing, reporting, printing, and more.
Internal plugins live under the frontend component directory:
components/com_joomhelpdesk/plugins/
Each plugin type has its own subdirectory. Plugin files are PHP classes (or XML definitions, depending on the type) that follow naming conventions specific to their type. The system discovers plugins by scanning these directories, and administrators can enable, disable, and configure each plugin from the Joomla backend.
The plugin system is powered by two core helper files:
components/com_joomhelpdesk/helper/plugin.php-- Defines theJoomhelpdesk_Pluginbase class that all plugins extend. Provides properties fortitle,description,name,type,enabled, settings loading vialoadSettings(), and template rendering viadisplay($tpl).components/com_joomhelpdesk/helper/guiplugins.php-- DefinesJoomhelpdesk_GUIPlugins, the loader and dispatcher for GUI plugins. It scans thegui/directory, instantiates enabled plugins, and routes method calls to them viaJoomhelpdesk_GUIPlugins::output($function, $params).
2. Managing Plugins
All internal plugins are managed from the Joomla administrator backend:
Administrator > Components > JoomHelpDesk > Plugins
This page displays a table listing every discovered plugin with the following columns:
| Column | Description |
|---|---|
| Type | The plugin category (e.g., "Ticket Action Plugin", "GUI Plugin", "CRON Plugin") |
| Title | The plugin's display name, linked to its configuration page if settings are available |
| Description | A brief explanation of what the plugin does |
| Status | Enable/disable toggle and an "Options" button (if the plugin has a settings file) |
Below the title, the system displays the plugin's internal identifier in the format type / name (e.g., tickets / emailsend or gui / extra_tabs).
3. Plugin Types
3.1 Cron Plugins
Directory: components/com_joomhelpdesk/plugins/cron/
Cron plugins run background tasks on a scheduled interval. Each cron plugin extends JoomhelpdeskCron and defines:
$title-- Display name$description-- What the plugin does$interval-- How often to run (in minutes)Execute($data)-- The method called on each run. The$dataparameter is a persistent object (stored as JSON in the database, max 64KB) that can be used to track state between runs.
Cron plugins can log messages using $this->Log("message") and persist data with $this->updateData($data).
Included plugins:
| File | Description |
|---|---|
sample.php |
Sample/template cron plugin for reference |
Additional cron functionality (auto-close, email checking) is handled by helpers in components/com_joomhelpdesk/helper/cron/ and components/com_joomhelpdesk/cron/, which are separate from the plugin system.
3.2 GUI Plugins
Directory: components/com_joomhelpdesk/plugins/gui/
GUI plugins inject custom HTML content into specific locations throughout the helpdesk interface. Each GUI plugin extends Joomhelpdesk_Plugin_GUI (which extends Joomhelpdesk_Plugin) and implements hook methods that return HTML strings.
The class name must follow the pattern Joomhelpdesk_GUIPlugin_{Filename} where {Filename} matches the PHP filename (without extension). The Joomhelpdesk_GUIPlugins helper class automatically loads all enabled GUI plugins and dispatches calls to them.
Available hook methods for admin (handler) interface:
| Method | Injection Point |
|---|---|
adminTabs() |
End of the admin navigation tab bar |
adminOverviewTop() |
Top of the admin overview page |
adminOverviewBottom() |
Bottom of the admin overview page |
adminTicketReplyBar($ticket) |
After the "Reply" buttons on admin ticket pages |
adminTicketListTools() |
Bottom of the ticket list tools menu |
adminSupportTabs_Start() |
Before the "Open" or "Search" tab in admin support |
adminSupportTabs_Mid() |
Before the "Other" tab in admin support |
adminSupportTabs_End() |
After the "Other" tab in admin support |
adminSupportTabs_Other_Start() |
Start of the "Other" dropdown menu |
adminSupportTabs_Other_End() |
End of the "Other" dropdown menu |
adminTicketViewTools($ticket) |
Ticket view toolbar |
adminTicketViewToolsMenu($ticket) |
Bottom of the ticket view tools dropdown menu |
Available hook methods for user (customer) interface:
| Method | Injection Point |
|---|---|
userTicketReplyBar($ticket) |
After the "Reply" buttons on user ticket pages |
userSupportTabs_Start() |
Start of the user support tab bar |
userSupportTabs_AfterNew() |
After the "New Ticket" tab |
userSupportTabs_BeforeView() |
Before the "View Ticket" tab |
userSupportTabs_End() |
End of the user support tab bar |
Included plugins:
| File | Description |
|---|---|
sample.php |
Reference plugin showing all available hook methods with example code |
extra_tabs.php |
Adds product and department filter tabs to the admin support tab bar |
openrelatedticket.php |
Adds a button/menu item to open a new ticket related to the current one |
default_prefs.php |
Manage and reset default handler preferences |
email_ticket/ |
Email ticket functionality with configurable template |
GUI plugins can have settings defined in a {name}.settings.xml file alongside the PHP file (see section 5).
3.3 Custom Field Plugins
Directory: components/com_joomhelpdesk/plugins/custfield/
Custom field plugins define new field types that can be used in ticket custom fields. Each plugin extends JoomhelpdeskCustFieldPlugin and the class name must match the PHP filename (e.g., class CalendarPlugin in calendar.php).
Required methods:
| Method | Description |
|---|---|
DisplaySettings($params) |
Renders settings UI in the custom field editor (admin backend) |
SaveSettings() |
Saves settings from the custom field editor, returns a string |
Input($current, $params, $context, $id) |
Renders the field on the ticket create/edit form |
Save($id, $params, $value) |
Processes and returns the submitted field value |
Display($value, $params, $context, $id) |
Renders the field value for display (read-only) |
CanEdit() |
Returns true if the field can be edited inline by handlers |
Optional methods:
| Method | Description |
|---|---|
Search($params, $search, $peruser) |
Custom search implementation for the field |
Parameters are typically stored using serialize()/unserialize() or json_encode()/json_decode(). Field input elements should use the naming convention custom_{$id} where $id is the custom field's database ID.
Some custom field plugins include a subdirectory with a form.php file that provides a more complex form rendering template (e.g., calendar/form.php, checkboxes/form.php).
Included plugins:
| File | Description |
|---|---|
sample.php |
Reference plugin with documented examples |
base.php |
Base example with Search() method included |
calendar.php |
Date picker field |
checkboxes.php |
Multiple checkbox field |
codedefault.php |
Field with default value from code |
dualcombo.php |
Dual cascading dropdown field |
hostname.php |
Auto-captures the user's hostname |
images.php |
Image upload field (extends uploadbase.php) |
int.php |
Integer/number field |
link.php |
URL/hyperlink field |
logip.php |
Auto-captures the user's IP address |
map.php |
Google Maps location picker |
output.php |
Display-only output field |
price.php |
Price/currency field |
profile.php |
User profile data (supports Joomla, JomSocial, EasyProfile, EasySocial, Community Builder, Contact) |
radioplus.php |
Enhanced radio button field |
rating.php |
Star rating field |
source.php |
Ticket source display field |
sql.php |
Field populated from a SQL query |
sqlcombo.php |
Dropdown populated from a SQL query |
uploadbase.php |
Base class for file upload fields (images, videos, files) |
videos.php |
Video upload field (extends uploadbase.php) |
Upload-related fields share CSS and JS assets in the uploads/ subdirectory and file storage in the files/, images/, and videos/ subdirectories.
3.4 Report Plugins
Directory: components/com_joomhelpdesk/plugins/reports/
Report plugins are defined as XML files that describe SQL queries, filters, display fields, and optional graphs. These are used by the helpdesk's built-in reporting engine to generate data tables and charts.
XML structure:
| Element | Description |
|---|---|
<title> |
Report name (can be a language string key) |
<description> |
Report description |
<sql> |
The SQL query with placeholder tokens for filters |
<filter> |
Filter definitions (date ranges, lookups, dropdowns) |
<group> |
Grouping options (e.g., date grouping by day/week/month) |
<field> |
Display columns with optional sorting, summing, and linking |
<totals> |
Set to 1 to show totals row |
<graph> |
Graph configuration with x-axis and y-axis field mappings |
Filter types:
daterange-- Date range picker with presets (last month, this week, custom, etc.)lookup-- Dropdown populated from a database tablenormal-- Standard filter with custom SQL-backed optionsdategroup-- Date grouping selector (day, week, month)
SQL placeholders:
Filters inject values into the SQL using {filter_name} placeholders. Conditional sections use {if,filter_name}...{endif} blocks.
Included reports:
| File | Description |
|---|---|
active_users.xml |
Active users report |
daily_activity.xml |
Daily activity summary |
daily_tickets.xml |
Tickets opened and closed per day |
handler_messages.xml |
Handler message counts |
idle_tickets.xml |
Tickets with no recent activity |
list_tickets.xml |
Full ticket listing |
list_tickets_custom.xml |
Customizable ticket listing |
open_tickets.xml |
Open tickets grouped by handler |
Custom reports can be placed in the custom/ subdirectory.
3.5 Ticket Plugins
Directory: components/com_joomhelpdesk/plugins/tickets/
Ticket plugins respond to events that occur during the lifecycle of a support ticket. Each plugin extends SupportActionsPlugin with the class name following the pattern SupportActions{Filename}.
Ticket change events:
| Method | Triggered When |
|---|---|
Ticket_updatePriority($ticket, $params) |
Ticket priority changes |
Ticket_updateStatus($ticket, $params) |
Ticket status changes |
Ticket_updateCategory($ticket, $params) |
Ticket category changes |
Ticket_updateUser($ticket, $params) |
Ticket user/owner changes |
Ticket_updateProduct($ticket, $params) |
Ticket product changes |
Ticket_updateDepartment($ticket, $params) |
Ticket department changes |
Ticket_updateUnregEMail($ticket, $params) |
Unregistered user email changes |
Ticket_updateSubject($ticket, $params) |
Ticket subject changes |
Ticket_updateLock($ticket) |
Ticket lock status changes (handler access) |
Ticket_updateCustomField($ticket, $params) |
Custom field value changes |
Ticket_updateMessage($ticket, $params) |
Ticket message is edited |
Ticket_addTag($ticket, $params) |
Tag added to ticket |
Ticket_removeTag($ticket, $params) |
Tag removed from ticket |
Ticket_addTime($ticket, $params) |
Time entry added (can be negative) |
Ticket_addMessage($ticket, $params) |
Reply added to ticket |
Ticket_addFile($ticket, $params) |
File attached to ticket |
Ticket_deleteAttach($ticket, $params) |
Attachment removed from ticket |
Ticket_assignHandler($ticket, $params) |
Handler assignment changes |
Ticket_addCC($ticket, $params) |
CC recipient added to ticket |
Reply and notification events:
| Method | Triggered When |
|---|---|
Admin_Reply($ticket, $params) |
Handler replies to a ticket |
Admin_Private($ticket, $params) |
Handler adds a private message |
Admin_ForwardUser($ticket, $params) |
Handler forwards ticket to another user |
Admin_ForwardProduct($ticket, $params) |
Handler forwards ticket to another product/department |
Admin_ForwardHandler($ticket, $params) |
Handler forwards ticket to another handler |
User_Reply($ticket, $params) |
User replies to a ticket |
User_Open($ticket, $params) |
User opens a new ticket |
Other events:
| Method | Triggered When |
|---|---|
beforeEMailSend($ticket, $params) |
Before an email notification is sent (modify mailer settings) |
beforeEMailImport($ticket, $params) |
Before an inbound email is imported (modify headers) |
ticketCreateRedirect($ticket, $params) |
Before the post-creation redirect (override destination) |
Tickets_openNew($params) |
Before a new ticket is created (return validation result) |
Tickets_customAssign($params) |
Override auto-assigned handler (return user ID or null) |
Message types (used in Ticket_addMessage):
| Value | Constant | Meaning |
|---|---|---|
| 0 | TICKET_MESSAGE_USER |
User message |
| 1 | TICKET_MESSAGE_ADMIN |
Handler message |
| 2 | TICKET_MESSAGE_PRIVATE |
Private note |
| 3 | TICKET_MESSAGE_AUDIT |
Audit log entry |
| 4 | TICKET_MESSAGE_DRAFT |
Draft message |
| 5 | TICKET_MESSAGE_TIME |
Time entry |
| 6 | TICKET_MESSAGE_OPENEDBY |
Opened-by record |
Handler assignment types (used in Ticket_assignHandler):
| Value | Constant | Meaning |
|---|---|---|
| 0 | TICKET_ASSIGN_FORWARD |
Forwarded to handler |
| 1 | TICKET_ASSIGN_TOOK_OWNER |
Took ownership on reply |
| 2 | TICKET_ASSIGN_UNASSIGNED |
Set to unassigned |
| 3 | TICKET_ASSIGN_ASSIGNED |
Directly assigned |
Included plugins:
| File | Description |
|---|---|
sample.php |
Reference plugin with all event methods documented |
emailsend.php |
Core email notification handler (sends emails on ticket actions) |
emailrecv.php |
Email receive handler |
eventaction.php |
Integration with the Freestyle Event Action System |
extraemails.php |
Additional email notifications (custom field changes, status changes, CC notifications) |
limitopen.php |
Limit the number of tickets a user can open per time period |
domaingroup.php |
Domain-based user grouping |
groupuserrestrict.php |
Group-based user restrictions |
jomsocial.php |
JomSocial integration |
uddeim.php |
UddeIM private messaging integration |
Important: The emailsend.php plugin is critical for the helpdesk to function properly. If it is disabled, no email notifications will be sent for any ticket actions.
3.6 Email Check Plugins
Directory: components/com_joomhelpdesk/plugins/emailcheck/
Email check plugins define rules for trimming and cleaning inbound email content. They use XML files containing regular expression patterns that identify where to truncate quoted reply text (e.g., removing "Original Message" headers, forwarded content, and signature blocks).
XML structure:
Each <trimmatch> element defines a trim rule:
<starts>-- Match lines that start with a specific string (e.g.,>for quoted text)<regex>-- Regular expression pattern to match against each line<nearby>-- Additional patterns that must appear near the matched line (within a specified number of lines)
Included plugins:
| File/Directory | Description |
|---|---|
trim/core.xml |
Core plain-text email trimming rules (removes quoted replies, "Original Message" headers, From/To/Subject blocks) |
trim/html.xml |
HTML email trimming rules |
3.7 Ticket Print Plugins
Directory: components/com_joomhelpdesk/plugins/ticketprint/
Ticket print plugins provide custom print layouts for tickets. Each print layout consists of an XML manifest file and a subdirectory containing the PHP template.
XML manifest structure:
| Element | Description |
|---|---|
<title> |
Display name shown in print menus |
<description> |
Description of the layout |
<user> |
1 to show in user (customer) print menu, 0 to hide |
<admin> |
1 to show in admin (handler) print menu, 0 to hide |
<batch> |
1 to show in batch print menu, 0 to hide |
<noheader> |
1 to hide the page heading |
<can_run_php> |
PHP code that returns true/false to control visibility per ticket |
<include> |
Filename of the PHP template in the plugin's subdirectory |
In the PHP template, the ticket object is available as $this->ticket, which includes properties like title, status, name, messages, and custom fields.
Included plugins:
| File/Directory | Description |
|---|---|
example.xml |
Example manifest |
example/main.php |
Example print template showing subject, status, user, and message history |
3.8 Ticket Source Plugins
Directory: components/com_joomhelpdesk/plugins/ticketsource/
Ticket source plugins add new ticket source categories and tabs to the admin support interface. Each plugin extends Ticket_Source and provides methods to generate navigation tabs and menu items.
Key methods:
| Method | Description |
|---|---|
getTabs() |
Returns tab data for the admin support interface |
getOverview_ListItem() |
Returns items for the admin overview list |
getMainMenu_ListItem() |
Returns items for the main menu |
getMainMenu_Module_Admin_ListItem() |
Returns items for the admin module menu |
Each plugin also defines $user_show and $admin_show flags controlling visibility.
Included plugins:
| File | Description |
|---|---|
email.php |
Shows pending email-sourced tickets tab |
email_accepted.php |
Tracks accepted email tickets |
email_declined.php |
Tracks declined email tickets |
3.9 Ticket Open Search Plugins
Directory: components/com_joomhelpdesk/plugins/ticketopensearch/
Ticket open search plugins power the search-as-you-type feature when users are opening a new ticket. They suggest existing content (FAQs, KB articles) that might answer the user's question before they submit a ticket.
Each plugin extends Joomhelpdesk_Plugin_OpenSearch and implements:
search($search)-- Receives the search string and returns an array ofJoomhelpdesk_OpenSearch_Resultobjects, each withtitle,type,link, andscoreproperties.
Results are ranked by score and displayed to the user during ticket creation.
Included plugins:
| File | Description |
|---|---|
faqs.php |
Searches FAQ entries by question and answer |
kbarts.php |
Searches Knowledge Base articles by title and body |
3.10 User List Plugins
Directory: components/com_joomhelpdesk/plugins/userlist/
User list plugins add extra columns to user selection popups throughout the helpdesk (used when assigning handlers, picking users for tickets, etc.). Each plugin extends User_List_Column.
Key methods:
| Method | Description |
|---|---|
getHeader() |
Returns the column header text |
loadData($users) |
Pre-loads data for all users in the list (batch query) |
displayUser($user) |
Returns the cell content for a specific user |
search($string) |
Returns an array of user IDs matching the search string |
Included plugins:
| File | Description |
|---|---|
postcode.php |
Shows the user's postal code from their Joomla profile in the user picker |
3.11 Pick Table Plugins
Directory: components/com_joomhelpdesk/plugins/picktable/
Pick table plugins define data tables that can be browsed and selected from within the helpdesk interface. They are XML-based and describe a SQL query, filters, display columns, and linking behavior.
XML structure:
| Element | Description |
|---|---|
<display> |
Table display name |
<sql> |
SQL query to fetch data |
<use_auth> |
Access control attributes (published, access, author) |
<addbtntext> |
Label for the select/add button |
<ordering> |
Default sort field |
<keyfield> |
Primary key field name |
<displayfield> |
Field used as the display label |
<link> |
URL pattern for linking to items (%ID% is replaced with the key value) |
<filters> |
Search and filter definitions |
<displayfields> |
Column definitions with sorting, linking, and type info |
Included plugins:
| File | Description |
|---|---|
article.xml |
Browse and select Joomla articles |
faq.xml |
Browse and select JoomHelpDesk FAQ entries |
kb.xml |
Browse and select JoomHelpDesk KB articles |
4. Enabling and Disabling Plugins
To enable or disable a plugin:
- Navigate to Administrator > Components > JoomHelpDesk > Plugins.
- Find the plugin in the list.
- Click the status icon in the Status column:
- A green publish icon indicates the plugin is enabled. Click it to disable.
- A grey unpublish icon indicates the plugin is disabled. Click it to enable.
The enable/disable state is stored in the #__joomhelpdesk_plugins database table. The system checks this table when loading plugins to determine which ones should be active.
Some plugins (like emailsend.php for ticket email notifications) are essential for normal helpdesk operation. Disabling them will stop the corresponding functionality across the entire system.
Certain plugin files can also be disabled at the filesystem level by appending .disabled to the filename (e.g., acysms.php.disabled), which prevents the system from discovering them at all.
5. Plugin Configuration
Plugins that support configuration have an Options button in the Status column of the plugin management page. Clicking this button opens a settings form.
Settings Files
Plugin settings are defined in XML files that follow Joomla's standard form field XML format. The settings file must be named {plugin_name}.settings.xml and placed alongside the plugin's PHP file.
For example, the "Extra Admin Tabs" GUI plugin uses:
components/com_joomhelpdesk/plugins/gui/extra_tabs.settings.xml
Settings XML Format
Settings files use Joomla's <form> XML structure with <fields> groups (displayed as tabs) and <fieldset> elements containing individual <field> definitions:
<?xml version="1.0" encoding="utf-8"?>
<form>
<fields name="tab1" label="General Settings">
<fieldset name="tab1" label="">
<field name="enabled" type="radio" class="btn-group btn-group-yesno"
label="Enable Feature" default="0">
<option value="0">JNO</option>
<option value="1">JYES</option>
</field>
<field name="message" type="text" label="Message" description="" />
</fieldset>
</fields>
</form>
Each <fields> group with a label attribute becomes a separate tab in the configuration interface. Standard Joomla field types are supported (text, textarea, radio, list, editor), along with JoomHelpDesk-specific types like joomhelpdeskeditor, joomhelpdesksqlcombo, and joomhelpdeskchecklist.
Accessing Settings in Code
Within a plugin class, call $this->loadSettings() to load the saved configuration. Settings are then available as a structured object on $this->settings:
function myMethod($ticket, $params)
{
$this->loadSettings();
if ($this->settings->tab1->enabled) {
$message = $this->settings->tab1->message;
// Use the setting...
}
}
The settings object mirrors the XML structure: top-level properties correspond to <fields name="..."> groups, and nested properties correspond to individual <field name="..."> elements within those groups.
Settings are stored as JSON in the settings column of the #__joomhelpdesk_plugins database table.