Files
grzanieplus.pl/plugins/stTaskScheluderPlugin/lib/stTaskConfiguration.class.php
2025-03-12 17:06:23 +01:00

168 lines
5.0 KiB
PHP

<?php
/**
* Konfiguracja harmonogramu zadań
* @author Marcin Butlak <marcin.butlak@sote.pl>
*/
class stTaskConfiguration
{
const TIME_INTERVAL_5MIN = 300;
const TIME_INTERVAL_10MIN = self::TIME_INTERVAL_5MIN * 2;
const TIME_INTERVAL_15MIN = self::TIME_INTERVAL_5MIN * 3;
const TIME_INTERVAL_30MIN = self::TIME_INTERVAL_15MIN * 2;
const TIME_INTERVAL_1HOUR = self::TIME_INTERVAL_30MIN * 2;
const TIME_INTERVAL_2HOURS = self::TIME_INTERVAL_1HOUR * 2;
const TIME_INTERVAL_4HOURS = self::TIME_INTERVAL_1HOUR * 4;
const TIME_INTERVAL_6HOURS = self::TIME_INTERVAL_1HOUR * 6;
const TIME_INTERVAL_12HOURS = self::TIME_INTERVAL_1HOUR * 12;
const TIME_INTERVAL_1DAY = self::TIME_INTERVAL_1HOUR * 24;
const TIME_INTERVAL_1WEEK = self::TIME_INTERVAL_1DAY * 7;
const PRIORITY_FIRST = -1000000;
const PRIORITY_LAST = 1000000;
static $tasks = null;
/**
* Dodaje nowe zadanie
*
* @param string $id Id zadania
* @param string $className Klasa zadania
* @param string $name Nazwa zadania (wyświetlana użytkownikowi)
* @param integer $interval Interwał czasowy
* @param string $executeAt Godzina o której ma zostać wykonane zadanie (parametr jest brany pod uwagę tylko w przypadku interwału czasowego: TIME_INTERVAL_1DAY, TIME_INTERVAL_1WEEK)
* @param bool $isSystem Zadanie systemowe
* @return void
*/
public static function addTask(string $id, string $className, string $name, array $options = array()): void
{
if (strlen($id) > 64)
{
throw new stTaskConfigurationException('The task id cannot exceed 64 characters');
}
if (!class_exists($className))
{
throw new stTaskConfigurationException(sprintf('The class name "%s" does not exist', $className));
}
$options = stConfigHelper::mergeOptions($options, [
'time_interval' => self::TIME_INTERVAL_1HOUR,
'execute_at' => '23:59:59',
'is_system' => false,
'priority' => 0,
'is_active' => true,
'frontend' => false,
'parent' => null,
]);
$options['class_name'] = $className;
$options['name'] = $name;
$tasks = sfConfig::get('app_st_task_scheluder_tasks', array());
if (!self::hasTimeInterval($options['time_interval']))
{
$options['is_system'] = true;
}
$tasks[$id] = $options;
sfConfig::set('app_st_task_scheluder_tasks', $tasks);
}
/**
* Sprawdza czy podany interwał czasowy istnieje
*
* @param int $timeInterval Interwał czasowy
* @return bool
*/
public static function hasTimeInterval(int $timeInterval)
{
$timeIntervals = self::getTimeIntervals();
return isset($timeIntervals[$timeInterval]);
}
/**
* Zwraca listę dostępnych interwałów czasowych
*
* @var int $minTimeInerval Minimalny interwał czasowy
*/
public static function getTimeIntervals(int $minTimeInerval = null)
{
$timeIntervals = array(
stTaskConfiguration::TIME_INTERVAL_10MIN => 'co 10 minut',
stTaskConfiguration::TIME_INTERVAL_15MIN => 'co 15 minut',
stTaskConfiguration::TIME_INTERVAL_30MIN => 'co 30 minut',
stTaskConfiguration::TIME_INTERVAL_1HOUR => 'co 1 godzinę',
stTaskConfiguration::TIME_INTERVAL_2HOURS => 'co 2 godziny',
stTaskConfiguration::TIME_INTERVAL_4HOURS => 'co 4 godziny',
stTaskConfiguration::TIME_INTERVAL_6HOURS => 'co 6 godzin',
stTaskConfiguration::TIME_INTERVAL_12HOURS => 'co 12 godzin',
stTaskConfiguration::TIME_INTERVAL_1DAY => 'raz dziennie',
stTaskConfiguration::TIME_INTERVAL_1WEEK => 'co tydzień',
);
if (null !== $minTimeInerval)
{
foreach ($timeIntervals as $timeInterval => $label)
{
if ($minTimeInerval > $timeInterval)
{
unset($timeIntervals[$timeInterval]);
}
}
}
return $timeIntervals;
}
/**
* Zwraca konfiguracje dla zadania
*
* @param string $taskId
* @return array
*/
public static function getTask(string $taskId)
{
$tasks = self::getTasks();
if (!isset($tasks[$taskId]))
{
throw new stTaskConfigurationException(sprintf('The task with id "%s" does not exist', $taskId));
}
return $tasks[$taskId];
}
/**
* Zwraca listę konfiguracji zadań
*
* @return array
*/
public static function getTasks(): array
{
if (null === self::$tasks)
{
stEventDispatcher::getInstance()->notify(new sfEvent(null, 'stTaskConfiguration.getTasks'));
$tasks = sfConfig::get('app_st_task_scheluder_tasks', array());
uasort($tasks, function ($t1, $t2)
{
if ($t1['priority'] == $t2['priority'])
{
return 0;
}
return ($t1['priority'] < $t2['priority']) ? -1 : 1;
});
self::$tasks = $tasks;
}
return self::$tasks;
}
}