primo commit
This commit is contained in:
@ -0,0 +1,170 @@
|
||||
<?php
|
||||
|
||||
/**
|
||||
* @package Joomla.Administrator
|
||||
* @subpackage com_scheduler
|
||||
*
|
||||
* @copyright (C) 2021 Open Source Matters, Inc. <https://www.joomla.org>
|
||||
* @license GNU General Public License version 2 or later; see LICENSE.txt
|
||||
*/
|
||||
|
||||
namespace Joomla\Component\Scheduler\Administrator\Helper;
|
||||
|
||||
use Cron\CronExpression;
|
||||
use Joomla\CMS\Date\Date;
|
||||
use Joomla\CMS\Factory;
|
||||
use Joomla\Component\Scheduler\Administrator\Task\Task;
|
||||
use Joomla\Database\DatabaseInterface;
|
||||
use Joomla\Utilities\ArrayHelper;
|
||||
|
||||
// phpcs:disable PSR1.Files.SideEffects
|
||||
\defined('_JEXEC') or die;
|
||||
// phpcs:enable PSR1.Files.SideEffects
|
||||
|
||||
/**
|
||||
* Helper class for supporting task execution rules.
|
||||
*
|
||||
* @since 4.1.0
|
||||
* @todo This helper should probably be merged into the {@see Task} class.
|
||||
*/
|
||||
class ExecRuleHelper
|
||||
{
|
||||
/**
|
||||
* The execution rule type
|
||||
*
|
||||
* @var string
|
||||
* @since 4.1.0
|
||||
*/
|
||||
private $type;
|
||||
|
||||
/**
|
||||
* @var array
|
||||
* @since 4.1.0
|
||||
*/
|
||||
private $task;
|
||||
|
||||
/**
|
||||
* @var object
|
||||
* @since 4.1.0
|
||||
*/
|
||||
private $rule;
|
||||
|
||||
/**
|
||||
* @param array|object $task A task entry
|
||||
*
|
||||
* @since 4.1.0
|
||||
*/
|
||||
public function __construct($task)
|
||||
{
|
||||
$this->task = \is_array($task) ? $task : ArrayHelper::fromObject($task);
|
||||
$rule = $this->getFromTask('cron_rules');
|
||||
$this->rule = \is_string($rule)
|
||||
? (object) json_decode($rule)
|
||||
: (\is_array($rule) ? (object) $rule : $rule);
|
||||
$this->type = $this->rule->type;
|
||||
}
|
||||
|
||||
/**
|
||||
* Get a property from the task array
|
||||
*
|
||||
* @param string $property The property to get
|
||||
* @param mixed $default The default value returned if property does not exist
|
||||
*
|
||||
* @return mixed
|
||||
*
|
||||
* @since 4.1.0
|
||||
*/
|
||||
private function getFromTask(string $property, $default = null)
|
||||
{
|
||||
$property = ArrayHelper::getValue($this->task, $property);
|
||||
|
||||
return $property ?? $default;
|
||||
}
|
||||
|
||||
/**
|
||||
* @param boolean $string If true, an SQL formatted string is returned.
|
||||
* @param boolean $basisNow If true, the current date-time is used as the basis for projecting the next
|
||||
* execution.
|
||||
*
|
||||
* @return ?Date|string
|
||||
*
|
||||
* @since 4.1.0
|
||||
* @throws \Exception
|
||||
*/
|
||||
public function nextExec(bool $string = true, bool $basisNow = false)
|
||||
{
|
||||
$executionRules = $this->getFromTask('execution_rules');
|
||||
$type = $executionRules['rule-type'];
|
||||
switch ($type) {
|
||||
case 'interval-minutes':
|
||||
$now = Factory::getDate('now', 'UTC');
|
||||
$intervalMinutes = (int) $executionRules['interval-minutes'];
|
||||
$interval = new \DateInterval('PT' . $intervalMinutes . 'M');
|
||||
$nextExec = $now->add($interval);
|
||||
$nextExec = $string ? $nextExec->toSql() : $nextExec;
|
||||
break;
|
||||
case 'interval-hours':
|
||||
$now = Factory::getDate('now', 'UTC');
|
||||
$intervalHours = $executionRules['interval-hours'];
|
||||
$interval = new \DateInterval('PT' . $intervalHours . 'H');
|
||||
$nextExec = $now->add($interval);
|
||||
$nextExec = $string ? $nextExec->toSql() : $nextExec;
|
||||
break;
|
||||
case 'interval-days':
|
||||
$now = Factory::getDate('now', 'UTC');
|
||||
$intervalDays = $executionRules['interval-days'];
|
||||
$interval = new \DateInterval('P' . $intervalDays . 'D');
|
||||
$nextExec = $now->add($interval);
|
||||
$execTime = $executionRules['exec-time'];
|
||||
list($hour, $minute) = explode(':', $execTime);
|
||||
$nextExec->setTime($hour, $minute);
|
||||
$nextExec = $string ? $nextExec->toSql() : $nextExec;
|
||||
break;
|
||||
case 'interval-months':
|
||||
$now = Factory::getDate('now', 'UTC');
|
||||
$intervalMonths = $executionRules['interval-months'];
|
||||
$interval = new \DateInterval('P' . $intervalMonths . 'M');
|
||||
$nextExec = $now->add($interval);
|
||||
$execDay = $executionRules['exec-day'];
|
||||
$nextExecYear = $nextExec->format('Y');
|
||||
$nextExecMonth = $nextExec->format('n');
|
||||
$nextExec->setDate($nextExecYear, $nextExecMonth, $execDay);
|
||||
|
||||
$execTime = $executionRules['exec-time'];
|
||||
list($hour, $minute) = explode(':', $execTime);
|
||||
$nextExec->setTime($hour, $minute);
|
||||
$nextExec = $string ? $nextExec->toSql() : $nextExec;
|
||||
break;
|
||||
case 'cron-expression':
|
||||
// @todo: testing
|
||||
$cExp = new CronExpression((string) $this->rule->exp);
|
||||
$nextExec = $cExp->getNextRunDate('now', 0, false, Factory::getApplication()->get('offset', 'UTC'));
|
||||
$nextExec->setTimezone(new \DateTimeZone('UTC'));
|
||||
$nextExec = $string ? $this->dateTimeToSql($nextExec) : $nextExec;
|
||||
break;
|
||||
default:
|
||||
// 'manual' execution is handled here.
|
||||
$nextExec = null;
|
||||
}
|
||||
|
||||
return $nextExec;
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns a sql-formatted string for a DateTime object.
|
||||
* Only needed for DateTime objects returned by CronExpression, JDate supports this as class method.
|
||||
*
|
||||
* @param \DateTime $dateTime A DateTime object to format
|
||||
*
|
||||
* @return string
|
||||
*
|
||||
* @since 4.1.0
|
||||
*/
|
||||
private function dateTimeToSql(\DateTime $dateTime): string
|
||||
{
|
||||
static $db;
|
||||
$db = $db ?? Factory::getContainer()->get(DatabaseInterface::class);
|
||||
|
||||
return $dateTime->format($db->getDateFormat());
|
||||
}
|
||||
}
|
||||
@ -0,0 +1,70 @@
|
||||
<?php
|
||||
|
||||
/**
|
||||
* @package Joomla.Administrator
|
||||
* @subpackage com_scheduler
|
||||
*
|
||||
* @copyright (C) 2021 Open Source Matters, Inc. <https://www.joomla.org>
|
||||
* @license GNU General Public License version 2 or later; see LICENSE.txt
|
||||
*/
|
||||
|
||||
namespace Joomla\Component\Scheduler\Administrator\Helper;
|
||||
|
||||
use Joomla\CMS\Application\AdministratorApplication;
|
||||
use Joomla\CMS\Event\AbstractEvent;
|
||||
use Joomla\CMS\Factory;
|
||||
use Joomla\CMS\Plugin\PluginHelper;
|
||||
use Joomla\Component\Scheduler\Administrator\Task\TaskOptions;
|
||||
|
||||
// phpcs:disable PSR1.Files.SideEffects
|
||||
\defined('_JEXEC') or die;
|
||||
// phpcs:enable PSR1.Files.SideEffects
|
||||
|
||||
/**
|
||||
* The SchedulerHelper class.
|
||||
* Provides static methods used across com_scheduler
|
||||
*
|
||||
* @since 4.1.0
|
||||
*/
|
||||
abstract class SchedulerHelper
|
||||
{
|
||||
/**
|
||||
* Cached TaskOptions object
|
||||
*
|
||||
* @var TaskOptions
|
||||
* @since 4.1.0
|
||||
*/
|
||||
protected static $taskOptionsCache;
|
||||
|
||||
/**
|
||||
* Returns available task routines as a TaskOptions object.
|
||||
*
|
||||
* @return TaskOptions A TaskOptions object populated with task routines offered by plugins
|
||||
*
|
||||
* @since 4.1.0
|
||||
* @throws \Exception
|
||||
*/
|
||||
public static function getTaskOptions(): TaskOptions
|
||||
{
|
||||
if (self::$taskOptionsCache !== null) {
|
||||
return self::$taskOptionsCache;
|
||||
}
|
||||
|
||||
/** @var AdministratorApplication $app */
|
||||
$app = Factory::getApplication();
|
||||
$options = new TaskOptions();
|
||||
$event = AbstractEvent::create(
|
||||
'onTaskOptionsList',
|
||||
[
|
||||
'subject' => $options,
|
||||
]
|
||||
);
|
||||
|
||||
PluginHelper::importPlugin('task');
|
||||
$app->getDispatcher()->dispatch('onTaskOptionsList', $event);
|
||||
|
||||
self::$taskOptionsCache = $options;
|
||||
|
||||
return $options;
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user