diff --git a/hooks.php b/hooks.php index b3d9bbc..d755988 100644 --- a/hooks.php +++ b/hooks.php @@ -1 +1,177 @@ API. + * + * const VIRT_TOKEN = "your-virtfusion-token"; + */ + +/** + * If the constants are not defined, return null to prevent errors. + */ +if (!defined("VIRTFUSION_API_URL") || !defined("VIRT_TOKEN")) { + return null; +} + +if (!function_exists('fetchPackageId')) { + /** + * @param string $packageName + * @return int|null + * @throws JsonException + */ + function fetchPackageId(string $packageName): ?int + { + $url = sprintf("%s/packages", VIRTFUSION_API_URL); + + $curl = curl_init(); + curl_setopt_array($curl, [ + CURLOPT_URL => $url, + CURLOPT_RETURNTRANSFER => true, + CURLOPT_HTTPHEADER => [ + sprintf("Authorization: Bearer %s", VIRT_TOKEN) + ] + ]); + + $response = curl_exec($curl); + $err = curl_error($curl); + curl_close($curl); + + if ($err) { + throw new Exception("cURL Error: " . $err); + } + + $packages = json_decode($response, true, 512, JSON_THROW_ON_ERROR); + + foreach ($packages['data'] as $package) { + if ($package['name'] === $packageName && $package['enabled'] === true) { + return $package['id']; + } + } + + return null; + } +} + +if (!function_exists('fetchTemplates')) { + /** + * @param int $serverPackageId + * @return array|null + * @throws JsonException + * @throws Exception + */ + function fetchTemplates(int $serverPackageId): ?array + { + $url = sprintf("%s/media/templates/fromServerPackageSpec/%d", VIRTFUSION_API_URL, $serverPackageId); + + $curl = curl_init(); + curl_setopt_array($curl, array( + CURLOPT_URL => $url, + CURLOPT_RETURNTRANSFER => true, + CURLOPT_HTTPHEADER => array( + sprintf("Authorization: Bearer %s", VIRT_TOKEN) + ) + )); + + $response = curl_exec($curl); + $err = curl_error($curl); + curl_close($curl); + + if ($err) { + throw new Exception("cURL Error: " . $err); + } + + return json_decode($response, true, 512, JSON_THROW_ON_ERROR); + } +} + +if (!function_exists('custom_os_templates_hook')) { + /** + * @param array $vars + * @return array|null[] + * @throws Exception + */ + function custom_os_templates_hook(array $vars): array + { + try { + $serverPackageId = fetchPackageId($vars['productinfo']['name']); // Replace with the appropriate server package ID + + if ($serverPackageId === null) { + return [ + 'templates' => null, + ]; + } + + $templates = fetchTemplates($serverPackageId); + + // Assign the generated dropdown menu to a Smarty template variable + return [ + 'templates' => $templates, + ]; + } catch (JsonException $e) { + return [ + 'templates' => null, + ]; + } + } +} + +if (!function_exists('add_hook_os_templates')) { + /** + * @param array $vars + * @return array|null + * @throws Exception + */ + function add_hook_os_templates(array $vars): ?array + { + if (!isset($vars['productinfo']['module']) || $vars['productinfo']['module'] !== 'VirtFusionDirect') { + return null; + } + + $templates_data = custom_os_templates_hook($vars)['templates']; + + if (empty($templates_data)) { + return null; + } + + $dropdownOptions = []; + foreach ($templates_data['data'] as $osCategory) { + foreach ($osCategory['templates'] as $template) { + $optionValue = $template['id']; + $optionLabel = $template['name'] . " " . $template['version'] . " " . $template['variant']; + $dropdownOptions[] = ['id' => $optionValue, 'name' => $optionLabel]; + } + } + + // Sort dropdownOptions alphabetically by the 'name' key + usort($dropdownOptions, function ($a, $b) { + return strcmp($a['name'], $b['name']); + }); + + $newOption = [ + 'id' => 'os_template', + 'optionname' => 'Initial Operating System', + 'optiontype' => 1, + 'options' => $dropdownOptions, + 'selectedvalue' => '' + ]; + $configurableoptions = $vars['configurableoptions']; + $configurableoptions[] = $newOption; + + return [ + 'configurableoptions' => $configurableoptions, + ]; + } + + add_hook('ClientAreaPageCart', 1, 'add_hook_os_templates'); +} + +