diff --git a/source/script.php b/source/script.php index 9ce2d9b..7a76b9a 100644 --- a/source/script.php +++ b/source/script.php @@ -14,11 +14,100 @@ use Joomla\CMS\Log\Log; class Pkg_MokoSuiteFieldInstallerScript { + private const EXPECTED_EXTENSIONS = [ + ['type' => '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