-
Add the hook to getHooks() in src/Plugin.php. The key is self::$module.'.load_addons', value is [__CLASS__, 'getAddon'].
public static function getHooks(): array {
return [
self::$module.'.load_addons' => [__CLASS__, 'getAddon'],
self::$module.'.settings' => [__CLASS__, 'getSettings'],
];
}
Verify getHooks() returns this key before proceeding.
-
Write the getAddon method immediately after getHooks(). Extract $service from the event, call function_requirements, instantiate \AddonHandler, chain all setters, call register(), then call $service->addAddon($addon).
public static function getAddon(GenericEvent $event)
{
$service = $event->getSubject();
function_requirements('class.AddonHandler');
$addon = new \AddonHandler();
$addon->setModule(self::$module)
->set_text('Your Addon Name')
->set_text_match('Your Addon Name (.*)')
->set_cost(YOUR_COST_CONSTANT)
->setEnable([__CLASS__, 'doEnable'])
->setDisable([__CLASS__, 'doDisable'])
->register();
$service->addAddon($addon);
}
set_text_match must be a regex where (.*) captures the variable part (e.g., IP or plan name).
-
Write doEnable. It receives \ServiceHandler $serviceOrder. Retrieve service info and settings first. Skip WHM calls for WEB_DIRECTADMIN and WEB_STORAGE types. Log every WHM response before acting on it.
public static function doEnable(\ServiceHandler $serviceOrder, $repeatInvoiceId, $regexMatch = false)
{
$serviceInfo = $serviceOrder->getServiceInfo();
$settings = get_module_settings(self::$module);
if ($regexMatch === false) {
function_requirements('get_service_master');
$serverdata = get_service_master($serviceInfo[$settings['PREFIX'].'_server'], self::$module);
if (in_array($serviceInfo[$settings['PREFIX'].'_type'], [get_service_define('WEB_DIRECTADMIN'), get_service_define('WEB_STORAGE')])) {
} else {
myadmin_log(self::$module, 'info', 'Enabling addon for '.$serviceInfo[$settings['PREFIX'].'_id'], __LINE__, __FILE__, self::$module, $serviceInfo[$settings['PREFIX'].'_id']);
}
}
}
-
Write doDisable. Same signature as doEnable. Always call add_output('...') and send an admin cancellation email via (new \MyAdmin\Mail())->adminMail().
public static function doDisable(\ServiceHandler $serviceOrder, $repeatInvoiceId, $regexMatch = false)
{
$serviceInfo = $serviceOrder->getServiceInfo();
$settings = get_module_settings(self::$module);
$db = get_module_db(self::$module);
add_output('Your Addon Order Canceled');
$subject = $settings['TBLNAME'].' '.$serviceInfo[$settings['PREFIX'].'_id'].' Canceled Your Addon';
$email = $settings['TBLNAME'].' ID: '.$serviceInfo[$settings['PREFIX'].'_id'].'<br>Description: '.self::$name.'<br>';
(new \MyAdmin\Mail())->adminMail($subject, $email, false, 'admin/website_ip_canceled.tpl');
}
-
Run tests to verify hook registration and addon wiring:
vendor/bin/phpunit tests/ -v