'component', 'element' => 'com_mokosuitefield'], ['type' => 'plugin', 'element' => 'mokosuitefield', 'folder' => 'system'], ['type' => 'plugin', 'element' => 'mokosuitefield', 'folder' => 'webservices'], ]; private const PACKAGE_ELEMENT = 'pkg_mokosuitefield'; private const PACKAGE_LABEL = 'MokoSuite Field'; public function postflight(string $type, InstallerAdapter $adapter): void { if ($type === 'install') { $missing = $this->verifyInstallation(); if (!empty($missing)) { Factory::getApplication()->enqueueMessage( '' . self::PACKAGE_LABEL . ' — Incomplete Installation
' . 'The following extensions failed to install: ' . implode(', ', $missing) . '.
Please check file permissions and server logs, then reinstall the package.', 'error' ); $this->setPackageEnabled(false); return; } } $this->warnMissingLicenseKey(); } private function verifyInstallation(): array { $missing = []; try { $db = Factory::getDbo(); foreach (self::EXPECTED_EXTENSIONS as $ext) { $query = $db->getQuery(true) ->select('COUNT(*)') ->from($db->quoteName('#__extensions')) ->where($db->quoteName('type') . ' = ' . $db->quote($ext['type'])) ->where($db->quoteName('element') . ' = ' . $db->quote($ext['element'])); if (isset($ext['folder'])) { $query->where($db->quoteName('folder') . ' = ' . $db->quote($ext['folder'])); } $db->setQuery($query); if ((int) $db->loadResult() === 0) { $label = isset($ext['folder']) ? $ext['type'] . ':' . $ext['folder'] . '/' . $ext['element'] : $ext['type'] . ':' . $ext['element']; $missing[] = $label; } } } catch (\Throwable $e) { Log::add(self::PACKAGE_LABEL . ' install verification failed: ' . $e->getMessage(), Log::ERROR, 'mokosuite'); $missing[] = 'verification query failed'; } return $missing; } private function setPackageEnabled(bool $enabled): void { try { $db = Factory::getDbo(); $db->setQuery( $db->getQuery(true) ->update($db->quoteName('#__extensions')) ->set($db->quoteName('enabled') . ' = ' . ($enabled ? 1 : 0)) ->where($db->quoteName('type') . ' = ' . $db->quote('package')) ->where($db->quoteName('element') . ' = ' . $db->quote(self::PACKAGE_ELEMENT)) ); $db->execute(); } catch (\Throwable $e) { Log::add(self::PACKAGE_LABEL . ' failed to toggle package state: ' . $e->getMessage(), Log::ERROR, 'mokosuite'); } } private function warnMissingLicenseKey(): void { try { $db = Factory::getDbo(); $app = Factory::getApplication(); $query = $db->getQuery(true) ->select([$db->quoteName('update_site_id'), $db->quoteName('extra_query')]) ->from($db->quoteName('#__update_sites')) ->where('(' . $db->quoteName('name') . ' LIKE ' . $db->quote('%MokoSuiteField%') . ' OR ' . $db->quoteName('location') . ' LIKE ' . $db->quote('%MokoSuiteField%') . ')') ->setLimit(1); $db->setQuery($query); $site = $db->loadObject(); if ($site) { $extraQuery = (string) ($site->extra_query ?? ''); if (!empty($extraQuery) && strpos($extraQuery, 'dlid=') !== false) { parse_str($extraQuery, $parsed); if (!empty($parsed['dlid'])) { return; } } $editUrl = 'index.php?option=com_installer&task=updatesite.edit&update_site_id=' . (int) $site->update_site_id; } else { $editUrl = 'index.php?option=com_installer&view=updatesites'; } $app->enqueueMessage( 'Moko Consulting License Key Required — ' . 'No download key is configured. Updates will not be available until a valid license key is entered. ' . 'Enter License Key', 'warning' ); } catch (\Throwable $e) { // Silent — avoid breaking install if update_sites query fails } } }