Package - MokoSuite Realty
mokosuiterealty
- 01.00.32
+ 01.00.40
2026-06-21
Moko Consulting
hello@mokoconsulting.tech
diff --git a/source/script.php b/source/script.php
new file mode 100644
index 0000000..38a6923
--- /dev/null
+++ b/source/script.php
@@ -0,0 +1,169 @@
+missingChildExtensions($adapter);
+
+ if (!empty($missing))
+ {
+ Factory::getApplication()->enqueueMessage(
+ 'MokoSuiteRealty did not install correctly.
'
+ . 'The following bundled extensions are missing: '
+ . htmlspecialchars(implode(', ', $missing), ENT_QUOTES) . '
'
+ . 'Please uninstall MokoSuiteRealty and reinstall the full package.
',
+ 'error'
+ );
+
+ return;
+ }
+
+ $this->warnMissingLicenseKey();
+ }
+
+ /**
+ * Verify every child extension declared in the package manifest actually landed in
+ * #__extensions. Returns readable labels of any that are missing.
+ *
+ * Matching per Joomla's #__extensions uniqueness: type = "type"; element =
+ * "id" (for plugins, strip a leading plg__); plugins also match
+ * folder = "group".
+ *
+ * FAILS OPEN: any error returns [] so a transient glitch never fakes a failure.
+ */
+ private function missingChildExtensions($adapter): array
+ {
+ try
+ {
+ $manifest = $adapter->getParent()->getManifest();
+
+ if (!$manifest || !isset($manifest->files) || !isset($manifest->files->file))
+ {
+ return [];
+ }
+
+ $db = Factory::getDbo();
+ $missing = [];
+
+ foreach ($manifest->files->file as $file)
+ {
+ $attrs = $file->attributes();
+ $id = isset($attrs['id']) ? (string) $attrs['id'] : '';
+ $exType = isset($attrs['type']) ? (string) $attrs['type'] : '';
+
+ if ($id === '' || $exType === '')
+ {
+ continue;
+ }
+
+ $group = isset($attrs['group']) ? (string) $attrs['group'] : '';
+ $element = $id;
+
+ // Plugin element in #__extensions is the id minus any leading plg__.
+ if ($exType === 'plugin' && $group !== '')
+ {
+ $prefix = 'plg_' . $group . '_';
+
+ if (strpos($element, $prefix) === 0)
+ {
+ $element = substr($element, \strlen($prefix));
+ }
+ }
+
+ $query = $db->getQuery(true)
+ ->select('COUNT(*)')
+ ->from($db->quoteName('#__extensions'))
+ ->where($db->quoteName('element') . ' = ' . $db->quote($element))
+ ->where($db->quoteName('type') . ' = ' . $db->quote($exType));
+
+ if ($exType === 'plugin' && $group !== '')
+ {
+ $query->where($db->quoteName('folder') . ' = ' . $db->quote($group));
+ }
+
+ if ((int) $db->setQuery($query)->loadResult() === 0)
+ {
+ $label = trim((string) $file);
+ $missing[] = $label !== '' ? preg_replace('/\.zip$/i', '', $label) : $id;
+ }
+ }
+
+ return $missing;
+ }
+ catch (\Throwable $e)
+ {
+ // Fail open β never fake a failure on a glitch.
+ return [];
+ }
+ }
+
+ 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('%MokoSuiteRealty%')
+ . ' OR ' . $db->quoteName('location') . ' LIKE ' . $db->quote('%MokoSuiteRealty%') . ')')
+ ->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
+ }
+ }
+}