Overview
FacturaScripts has a powerful plugin system that allows you to extend functionality without modifying core files. Plugins can add new features, modify existing behavior, and integrate with third-party services.Plugin Architecture
The plugin system is managed by two main classes:- Plugins (
Core/Plugins.php): Main plugin management class - Plugin (
Core/Internal/Plugin.php): Individual plugin representation
Plugin Directory Structure
Plugins are stored in thePlugins/ folder, each in its own directory:
Plugin Configuration File
Each plugin must have afacturascripts.ini file in its root directory:
Configuration Properties
- name: Plugin name (must match folder name)
- description: Brief description of functionality
- version: Plugin version number
- min_version: Minimum FacturaScripts version required
- min_php: Minimum PHP version required (default: 8.0)
- require: Comma-separated list of required plugins
- require_php: Comma-separated list of required PHP extensions
Plugin Properties
The Plugin class (Core/Internal/Plugin.php) includes:
Status Properties
- enabled: Whether plugin is active (default: false)
- installed: Whether plugin exists in filesystem
- hidden: Whether plugin is hidden from UI
- compatible: Whether plugin meets version requirements
Metadata Properties
- name: Plugin name
- description: Plugin description
- version: Current plugin version
- folder: Folder name (usually same as name)
- order: Load order for enabled plugins
Configuration Properties
- min_version: Minimum FacturaScripts version
- min_php: Minimum PHP version
- require: Array of required plugin names
- require_php: Array of required PHP extensions
State Properties
- post_enable: Flag to run post-enable hooks
- post_disable: Flag to run post-disable hooks
Installing Plugins
Add Plugin from ZIP
Use thePlugins::add() method to install a plugin from a ZIP file:
Plugins.php:37):
- Check if plugin installation is disabled
- Validate ZIP file structure
- Read
facturascripts.inifrom ZIP - Check compatibility
- Delete previous version if exists
- Extract ZIP to
Plugins/folder - Rename folder if necessary
- Add to plugins list
- Deploy if plugin was already enabled
Installation Validation
The system performs several security checks (Plugins.php:425):
Plugin Installation Disabled
You can disable plugin installation inconfig.php (Plugins.php:39):
Enabling Plugins
Enable a Plugin
Use thePlugins::enable() method:
Plugins.php:158):
- Check if plugin exists and is not already enabled
- Verify folder name matches plugin name
- Check dependencies are met
- Add to enabled list with incremental order
- Set
post_enableflag - Save plugins.json
- Deploy changes
- Initialize controllers
Enable Validation
Folder name must match plugin name (Plugins.php:168):
Dependency Checking
Dependencies are validated before enabling (Plugin.php:118):
Disabling Plugins
Disable a Plugin
Use thePlugins::disable() method:
Plugins.php:129):
- Check if plugin exists and is enabled
- Set
enabled = false - Set
post_disableflag if requested - Clear
post_enableflag - Save plugins.json
- Deploy changes
- Initialize controllers
Removing Plugins
Remove a Plugin
Use thePlugins::remove() method:
Plugins.php:310):
- Plugin must exist
- Plugin must be disabled
- Plugin removal must not be disabled in config
- Delete plugin directory recursively
- Remove from plugins list
- Save plugins.json
Plugin Deployment
Deploy Process
ThePlugins::deploy() method handles plugin deployment (Plugins.php:113):
- Run plugin deployment (copy files, merge assets)
- Rebuild application routes
- Save updated routes
- Rebuild database schema
- Clear cache
- Initialize controllers (if requested)
Plugin Initialization
Init.php File
Plugins can include anInit.php file in their root directory:
Init Execution
ThePlugin::init() method (Plugin.php:227) manages initialization:
Global Init Call
All plugins are initialized viaPlugins::init() (Plugins.php:235):
Plugin Compatibility
Compatibility Checking
ThePlugin::checkCompatibility() method validates requirements (Plugin.php:267):
Plugin Loading
Load Order
Enabled plugins are loaded in order of theirorder property (Plugins.php:202):
Plugin List
Get all plugins with optional filtering (Plugins.php:265):
Plugin Storage
Plugin state is stored inMyFiles/plugins.json (Plugins.php:32):
Save Plugins
ThePlugins::save() method persists plugin state (Plugins.php:405):
Load Plugins
Plugins are loaded from both the JSON file and the filesystem (Plugins.php:301):
Checking Plugin Status
Check if Enabled
Check if Installed
Get Plugin Object
Hidden Plugins
Plugins can be hidden from the UI by adding them toconfig.php (Plugin.php:303):
config.php:
Best Practices
- Complete facturascripts.ini: Always include all metadata fields
- Version Compatibility: Set realistic
min_versionandmin_phprequirements - Declare Dependencies: List all required plugins in
requirefield - Proper Init Hooks: Use
update()for one-time setup,init()for every request - Clean Uninstall: Implement
uninstall()to clean up database changes - Folder Naming: Plugin folder must match the name in facturascripts.ini
- Test Compatibility: Test on minimum required versions before release
- Semantic Versioning: Use proper version numbering (major.minor format)
- Security First: Validate and sanitize all external data
- Document Changes: Include changelog and upgrade instructions
Related Files
- Plugins Manager:
/Core/Plugins.php - Plugin Class:
/Core/Internal/Plugin.php - Plugin Deployment:
/Core/Internal/PluginsDeploy.php - Plugin List:
/MyFiles/plugins.json - Plugins Directory:
/Plugins/

