feat: add release workflow + migrate MokoCassiopeia styles on install
- .gitea/workflows/release.yml: auto-bump, build ZIP, Gitea release, per-channel updates.xml targeting (same as MokoCassiopeia) - script.php: on install, detect MokoCassiopeia styles, create matching MokoOnyx style copies with same params, set default, copy user files Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
This commit is contained in:
@@ -96,13 +96,14 @@ class Tpl_MokoonyxInstallerScript
|
||||
}
|
||||
|
||||
/**
|
||||
* Detect MokoCassiopeia and migrate styles, params, and user files to MokoOnyx.
|
||||
* Detect MokoCassiopeia and create matching MokoOnyx styles with the same params.
|
||||
* Creates a MokoOnyx style copy for each MokoCassiopeia style.
|
||||
*/
|
||||
private function migrateFromCassiopeia(): void
|
||||
{
|
||||
$db = Factory::getDbo();
|
||||
|
||||
// Check if MokoCassiopeia has any template styles
|
||||
// Get all MokoCassiopeia styles
|
||||
$query = $db->getQuery(true)
|
||||
->select('*')
|
||||
->from('#__template_styles')
|
||||
@@ -115,69 +116,74 @@ class Tpl_MokoonyxInstallerScript
|
||||
return;
|
||||
}
|
||||
|
||||
$this->logMessage('MokoCassiopeia detected — migrating ' . count($oldStyles) . ' style(s).');
|
||||
$this->logMessage('MokoCassiopeia detected — creating ' . count($oldStyles) . ' matching MokoOnyx style(s).');
|
||||
|
||||
// Get the installer-created default MokoOnyx style (to apply params to it)
|
||||
$query = $db->getQuery(true)
|
||||
->select('id')
|
||||
->from('#__template_styles')
|
||||
->where($db->quoteName('template') . ' = ' . $db->quote(self::NEW_NAME))
|
||||
->where($db->quoteName('client_id') . ' = 0')
|
||||
->order($db->quoteName('id') . ' ASC');
|
||||
$defaultOnyxId = (int) $db->setQuery($query, 0, 1)->loadResult();
|
||||
|
||||
$firstStyle = true;
|
||||
|
||||
// 1. Copy template styles with params
|
||||
foreach ($oldStyles as $oldStyle) {
|
||||
$newTitle = str_replace(self::OLD_DISPLAY, self::NEW_DISPLAY, $oldStyle->title);
|
||||
$newTitle = str_replace(self::OLD_NAME, self::NEW_NAME, $newTitle);
|
||||
|
||||
// Check if MokoOnyx already has a style with this title
|
||||
$check = $db->getQuery(true)
|
||||
->select('COUNT(*)')
|
||||
->from('#__template_styles')
|
||||
->where($db->quoteName('template') . ' = ' . $db->quote(self::NEW_NAME))
|
||||
->where($db->quoteName('title') . ' = ' . $db->quote($newTitle));
|
||||
if ((int) $db->setQuery($check)->loadResult() > 0) {
|
||||
// Update existing MokoOnyx style with MokoCassiopeia's params
|
||||
$params = is_string($oldStyle->params)
|
||||
? str_replace(self::OLD_NAME, self::NEW_NAME, $oldStyle->params)
|
||||
: $oldStyle->params;
|
||||
$params = is_string($oldStyle->params)
|
||||
? str_replace(self::OLD_NAME, self::NEW_NAME, $oldStyle->params)
|
||||
: $oldStyle->params;
|
||||
|
||||
if ($firstStyle && $defaultOnyxId) {
|
||||
// Update the installer-created default style with the first MokoCassiopeia style's params
|
||||
$update = $db->getQuery(true)
|
||||
->update('#__template_styles')
|
||||
->set($db->quoteName('params') . ' = ' . $db->quote($params))
|
||||
->where($db->quoteName('template') . ' = ' . $db->quote(self::NEW_NAME))
|
||||
->where($db->quoteName('title') . ' = ' . $db->quote($newTitle));
|
||||
->set($db->quoteName('title') . ' = ' . $db->quote($newTitle))
|
||||
->where('id = ' . $defaultOnyxId);
|
||||
$db->setQuery($update)->execute();
|
||||
$this->logMessage("Updated existing MokoOnyx style: {$newTitle}");
|
||||
|
||||
// Set as default if MokoCassiopeia was default
|
||||
if ($oldStyle->home == 1) {
|
||||
$db->setQuery(
|
||||
$db->getQuery(true)
|
||||
->update('#__template_styles')
|
||||
->set($db->quoteName('home') . ' = 1')
|
||||
->where('id = ' . $defaultOnyxId)
|
||||
)->execute();
|
||||
|
||||
$db->setQuery(
|
||||
$db->getQuery(true)
|
||||
->update('#__template_styles')
|
||||
->set($db->quoteName('home') . ' = 0')
|
||||
->where('id = ' . (int) $oldStyle->id)
|
||||
)->execute();
|
||||
|
||||
$this->logMessage('Set MokoOnyx as default site template.');
|
||||
}
|
||||
|
||||
$this->logMessage("Updated default MokoOnyx style with params: {$newTitle}");
|
||||
$firstStyle = false;
|
||||
continue;
|
||||
}
|
||||
|
||||
// Create new MokoOnyx style from MokoCassiopeia style
|
||||
// For additional styles: create new MokoOnyx style copies
|
||||
$newStyle = clone $oldStyle;
|
||||
unset($newStyle->id);
|
||||
$newStyle->template = self::NEW_NAME;
|
||||
$newStyle->title = $newTitle;
|
||||
$newStyle->home = 0; // Don't set as default yet
|
||||
$newStyle->home = 0;
|
||||
$newStyle->params = $params;
|
||||
|
||||
if (is_string($newStyle->params)) {
|
||||
$newStyle->params = str_replace(self::OLD_NAME, self::NEW_NAME, $newStyle->params);
|
||||
try {
|
||||
$db->insertObject('#__template_styles', $newStyle, 'id');
|
||||
$this->logMessage("Created MokoOnyx style: {$newTitle}");
|
||||
} catch (\Throwable $e) {
|
||||
$this->logMessage("Failed to create style {$newTitle}: " . $e->getMessage(), 'warning');
|
||||
}
|
||||
|
||||
$db->insertObject('#__template_styles', $newStyle, 'id');
|
||||
$newId = $newStyle->id;
|
||||
|
||||
// If the old style was the default, make the new one default
|
||||
if ($oldStyle->home == 1) {
|
||||
$db->setQuery(
|
||||
$db->getQuery(true)
|
||||
->update('#__template_styles')
|
||||
->set($db->quoteName('home') . ' = 1')
|
||||
->where('id = ' . (int) $newId)
|
||||
)->execute();
|
||||
|
||||
$db->setQuery(
|
||||
$db->getQuery(true)
|
||||
->update('#__template_styles')
|
||||
->set($db->quoteName('home') . ' = 0')
|
||||
->where('id = ' . (int) $oldStyle->id)
|
||||
)->execute();
|
||||
|
||||
$this->logMessage('Set MokoOnyx as default site template.');
|
||||
}
|
||||
|
||||
$this->logMessage("Migrated style: {$oldStyle->title} → {$newTitle}");
|
||||
}
|
||||
|
||||
// 2. Copy user files (custom themes, user.css, user.js)
|
||||
|
||||
Reference in New Issue
Block a user