diff --git a/events.xml b/events.xml index 863282f650c031b69128eba0817018e7926d6e13..a9edc9b86522e94889eabac705987239c7e1a8e0 100644 --- a/events.xml +++ b/events.xml @@ -3,4 +3,6 @@ <event on="onAdminLoad" fire="\QUI\Cron\EventHandler::onAdminLoad"/> <event on="onAdminLoadFooter" fire="\QUI\Cron\EventHandler::adminLoadFooter"/> <event on="onPackageSetup" fire="\QUI\Cron\EventHandler::onPackageSetup"/> + <event on="onPackageInstall" fire="\QUI\Cron\EventHandler::onPackageInstall"/> + <event on="onCreateProject" fire="\QUI\Cron\EventHandler::onCreateProject"/> </events> \ No newline at end of file diff --git a/src/QUI/Cron/EventHandler.php b/src/QUI/Cron/EventHandler.php index ef6f2fb8999cbff5f980f79883fe316bbea0814b..aeb8c5ded82b9fed5e83a845d57b9c1710b95337 100644 --- a/src/QUI/Cron/EventHandler.php +++ b/src/QUI/Cron/EventHandler.php @@ -80,6 +80,7 @@ class EventHandler if (!isset($result[0])) { self::sendAdminInfoCronError(); + return; } @@ -129,4 +130,115 @@ class EventHandler QUI::getUserBySession()->getLocale()->get('quiqqer/cron', 'message.cron.admin.info.24h') ); } + + + /** + * Event: onPackageInstall => Add default crons + */ + public static function onPackageInstall() + { + self::createDefaultCrons(); + } + + /** + * Creates the default crons, if they do not exist yet + * + */ + public static function createDefaultCrons() + { + $CronManager = new Manager(); + + $defaultCrons = array( + // Clear temp folder + "quiqqer/cron:0" => array( + "min" => "0", + "hour" => "0", + "day" => "*", + "month" => "*", + "dow" => "*" + ), + // Clear sessions + "quiqqer/cron:1" => array( + "min" => "0", + "hour" => "*", + "day" => "*", + "month" => "*", + "dow" => "*" + ), + // Process mail queue + "quiqqer/cron:6" => array( + "min" => "*/5", + "hour" => "0", + "day" => "*", + "month" => "*", + "dow" => "*" + ) + ); + + // Parse the installed crons + $installedCrons = array(); + foreach ($CronManager->getList() as $row) { + $installedCrons[] = strtolower(trim($row['exec'])); + } + + + // add the simple default crons, if they dont exist yet + foreach ($defaultCrons as $identifier => $time) { + $data = $CronManager->getCronData($identifier); + + $exec = trim($data['exec']); + $title = trim($data['title']); + + if (in_array(strtolower($exec), $installedCrons)) { + continue; + } + + $CronManager->add($title, $time['min'], $time['hour'], $time['day'], $time['month'], $time['dow']); + } + } + + /** + * Event: onCreateProject => Add the publish cron for this project + * @param QUI\Projects\Project $Project + */ + public static function onCreateProject(QUI\Projects\Project $Project) + { + $CronManager = new Manager(); + $publishCronData = $CronManager->getCronData("quiqqer/cron:5"); + + $languages = $Project->getLanguages(); + $installedCrons = $CronManager->getList(); + + foreach ($languages as $lang) { + // Check that no cron with the same parameters exists yet + foreach ($installedCrons as $installedCronData) { + $installedParams = json_decode($installedCronData['params'], true); + $installedProject = ""; + $installedLang = ""; + + foreach ($installedParams as $name => $value) { + if ($name == "project") { + $installedProject = strtolower(trim($value)); + } + + if ($name == "lang") { + $installedLang = strtolower(trim($value)); + } + } + + // Cron for this project & lang combination exists => skip + if ($installedProject == strtolower(trim($Project->getName())) && + $installedLang == strtolower(trim($lang)) + ) { + continue 2; + } + } + + // Add the cron + $CronManager->add($publishCronData['title'], "0", "*", "*", "*", "*", array( + "project" => $Project->getName(), + "lang" => $lang + )); + } + } } diff --git a/src/QUI/Cron/Manager.php b/src/QUI/Cron/Manager.php index 293b1e3b35a48fb9d4c703e9313af50b94db540c..9f66c7f0b9ecd7441201c2e9d7e2203d9343154e 100644 --- a/src/QUI/Cron/Manager.php +++ b/src/QUI/Cron/Manager.php @@ -362,15 +362,36 @@ class Manager * Return the data of a specific cron from the available cron list * This cron is not in the cron list * - * @param string $cron - Name of the Cron - * + * @param string $cron - Cron-Identifier (package/package:NO) or name of the Cron * @return array|false - Cron Data */ public function getCronData($cron) { $availableCrons = $this->getAvailableCrons(); - // check if cron is available + // cron by package Identifier package/package:NO + $cronParts = explode(':', $cron); + + try { + $Package = QUI::getPackage($cronParts[0]); + $cronFile = $Package->getXMLFile('cron.xml'); + + if ($Package->isQuiqqerPackage() + && $cronFile + && isset($cronParts[1]) + && is_numeric($cronParts[1]) + ) { + $cronNo = (int)$cronParts[1]; + $cronList = $this->getCronsFromFile($cronFile); + + if (isset($cronList[$cronNo])) { + return $cronList[$cronNo]; + } + } + } catch (QUI\Exception $Exception) { + } + + // search cron via title foreach ($availableCrons as $entry) { if ($entry['title'] == $cron) { return $entry;