---
title: "Создание WebCron плагина для Joomla 4 (Task Scheduler Plugin) - WebTolk"
description: "В Joomla! 4.1 появился планировщик задач - WebCron. Он помогает автоматизировать повторяющиеся самые разные задачи по расписанию. Как создать плагин WebCron Joo"
url: "https://web-tolk.ru/blog/sozdanie-webcron-plagina-dlya-joomla-4-task-scheduler-plugin"
date: "2022-09-24T13:18:08+00:00"
language: "ru-RU"
---

# Создание WebCron плагина для Joomla 4 (Task Scheduler Plugin)

 Автор: Сергей Толкачев Создано: 24 сентября 2022 Обновлено: 01 сентября 2025 Просмотров: 2849    ![Создание WebCron плагина для Joomla 4 (Task Scheduler Plugin)](https://web-tolk.ru/blog/images/blog/sozdanie-webcron-plagina-dlya-joomla-4-task-scheduler-plugin/joomla-task-scheduler-plugin-article-header.jpg)

Эта статья - дополненный перевод статьи [How to Create Joomla Task Scheduler Plugin](https://www.techfry.com/joomla/how-to-create-joomla-task-scheduler-plugin).

В Joomla! появился планировщик задач начиная с версии 4.1. Он помогает автоматизировать повторяющиеся и рутинные задачи самого широкого спектра, начиная от технического обслуживания и заканчивая сложными синхронизациями по API.

Планировщик задач запускает задачу, определенную в плагине, с помощью задания CRON.

**Задания CRON (CRON Job)**: Задание CRON используется для автоматизации повторяющихся задач. Например, для обработки очередей электронной почты, для синхронизации заказов или остатков товаров, обновления цен интернет-магазина, для проверки веб-сайта на наличие проблем и так далее.

Также о технологии WebCron в Joomla 4.1 сообщалось в обзоре [Новое в Joomla 4.1](https://habr.com/ru/post/657647/) на Хабре, в разделе "**WebCron в Joomla 4.1**".

### Плагин планировщика задач Joomla 4 (Task Scheduler)

Это стандартный Joomla! плагин с `group="task"`. В нём необходимо использовать `TaskPluginTrait`.

```
use Joomla\CMS\Plugin\CMSPlugin;
use Joomla\Component\Scheduler\Administrator\Event\ExecuteTaskEvent;
use Joomla\Component\Scheduler\Administrator\Task\Status;
use Joomla\Component\Scheduler\Administrator\Task\Task;
use Joomla\Component\Scheduler\Administrator\Traits\TaskPluginTrait;
use Joomla\Event\SubscriberInterface;

class PlgTaskExample extends CMSPlugin implements SubscriberInterface
{
    use TaskPluginTrait;

    protected const TASKS_MAP = array(
        'plg_task_do_example' => array(
            'langConstPrefix' => 'PLG_TASK_DO_EXAMPLE',
            'method' => 'doExample',
            'form' => 'do_example'
            )
        );

    protected $autoloadLanguage = true;
    protected $app;
    protected $db;

    public static function getSubscribedEvents(): array
    {
        return array(
            'onTaskOptionsList' => 'advertiseRoutines',
            'onExecuteTask' => 'standardRoutineHandler',
            'onContentPrepareForm' => 'enhanceTaskItemForm',
        );
    }

    private function doExample(ExecuteTaskEvent $event): int
    {
        // Code for Tasks

        return Status::OK;
    }
}
```

### Реализация

Плагин планировщика задач в Joomla 4 должен использовать `TaskPluginTrait` и определять методы, соответствующие каждой процедуре вместе с константой класса `TASKS_MAP` для объявления поддерживаемых процедур и связанных с ними свойств. `TaskPluginTrait` включает в себя стандартные методы для трансляции процедур (*routines)*, улучшения форм задач и вызов подзадач.

#### advertiseRoutines()

Этот метод объявляет процедуры, поддерживаемые плагином. Он должен быть сопоставлен с событием `onTaskOptionsList`, позволяющим плагину объявлять свои процедуры. Метод уже определен в трейте, поэтому Вам не требуется определять его в вашем плагине.

#### enhanceTaskItemForm()

Этот метод расширяет форму задачи из XML-файла плагина, объявленного с помощью константы `TASKS_MAP`. Этот метод может быть сопоставлен с событием `onContentPrepareForm`. Этот метод уже определен в трейте, поэтому вам не требуется определять его в вашем плагине.

Вам нужно добавить имя формы в `TASKS_MAP` и константу и создать XML-форму в папке `forms` плагина с тем же именем.

 ![Пример из кода плагина "Задача - Запросы GET". В TASKS_MAP указан файл формы для настроек плагина. Событие onContentPrepareForm в getSubscribedEvents позволит его отобразить в админке.](https://web-tolk.ru/blog/images/blog/sozdanie-webcron-plagina-dlya-joomla-4-task-scheduler-plugin/1.png) Пример из кода плагина "Задача - Запросы GET". В TASKS_MAP указан файл формы для настроек плагина. Событие onContentPrepareForm в getSubscribedEvents позволит его отобразить в админке.

#### standardRoutineHandler()

Метод сопоставляет стандартные процедуры задачи с методами класса. Вы можете добавить имя метода в константу `TASKS_MAP` и определить его в своем плагине. Выполняться метод будет при запуске задачи.

Этот метод должен быть сопоставлен с событием `onExecuteTask`. Ожидается, что эти методы будут принимать один аргумент (событие) и возвращать статус задачи в виде числа (integer).

#### logTask()

Этот метод добавляет сообщение в логи. Первый аргумент - это сообщение, а второй аргумент - приоритет: отладка, ошибка, предупреждение, уведомление, информация:

- debug
- error
- info
- notice
- warning

```
$this->logTask('Task is being executed', 'info');
```

## Основной метод для выполнения задачи (doExample)

В примере выше это метод doExample.

```
use Joomla\Component\Scheduler\Administrator\Event\ExecuteTaskEvent;
use Joomla\Component\Scheduler\Administrator\Task\Status;

/**
	 * Standard routine method for the get request routine.
	 *
	 * @param   ExecuteTaskEvent  $event  The onExecuteTask event
	 *
	 * @return integer  The exit code
	 *
	 * @since 4.1.0
	 * @throws Exception
	 */
private function doExample(ExecuteTaskEvent $event): int
    {
        // Code for Tasks

        return Status::OK;
    }
```

В качестве параметра он принимает объект события `onExecuteTask`. Для выполнения задачи нам могут понадобится параметры, указанные в настройках плагина задачи. Получить параметры плагина можно с помощью метода `$event->getArgument('params')`

```
$id     = $event->getTaskId();

// Получаем параметры плагина, указанные в настройках

$params = $event->getArgument('params');
$url      = $params->url;
$timeout  = $params->timeout;
$auth     = (string) $params->auth ?? 0;
$authType = (string) $params->authType ?? '';
$authKey  = (string) $params->authKey ?? '';
```

По завершении работы основного метода он должен вернуть статус выхода задачи.

### Статусы выхода задачи в Joomla

На данный момент в Joomla 4 существует 12 возможных статусов завершения задачи, которым назначены числовые значения.

1. `INVALID_EXIT` = -2: используется, когда процедура возвращает неверный (не целочисленное, non-integer) статус завершения задачи.
2. `NO_EXIT` = -1: используется, когда процедура не возвращает статус завершения задачи.
3. `RUNNING` = 1: Используется при старте задачи. Это значение не должно быть статусом завершения задачи.
4. `NO_LOCK` = 2: Используется при невозможности получения `pseudo-lock`.
5. `NO_RUN` = 3: Используется при ошибке запуска задачи.
6. `NO_RELEASE` = 4: Используется при невозможности снять блокировку или обновить запись.
7. `KNOCKOUT` = 5: Используется, когда процедура "валится" из-за выкинутых исключений (Exception).
8. `WILL_RESUME` = 123: Используется, когда необходимо возобновить выполнение задачи. Используйте это для длительных задач, чтобы разделить их на более мелкие пакеты. Когда будет выполнен последний пакет, верните `Status::OK`.
9. `TIMEOUT` = 124: Используется в случае таймаута задачи.
10. `NO_TASK` = 125: Используется в случае, если задача не обнаружена.
11. `NO_ROUTINE` = 127: Используется в случае, если процедура задачи не обнаружена.
12. `OK` = 0: Успешное завершение задачи.

Пример из кода плагина Задача - GET-запрос

```
use Joomla\Component\Scheduler\Administrator\Task\Status as TaskStatus;

protected function makeGetRequest(ExecuteTaskEvent $event): int
	{

...

try
		{
			$response = HttpFactory::getHttp($options)->get($url, $headers, $timeout);
		}
		catch (Exception $e)
		{
			$this->logTask(Text::sprintf('PLG_TASK_REQUESTS_TASK_GET_REQUEST_LOG_TIMEOUT'));

			return TaskStatus::TIMEOUT;
		}
...

$this->logTask(Text::sprintf('PLG_TASK_REQUESTS_TASK_GET_REQUEST_LOG_RESPONSE', $responseCode));

		if ($response->code !== 200)
		{
			return TaskStatus::KNOCKOUT;
		}

		return TaskStatus::OK;

}
```

- [Оригинал на английском. Tech Fry: How to Create Joomla Task Scheduler Plugin](https://www.techfry.com/joomla/how-to-create-joomla-task-scheduler-plugin)
- [Первоначальная публикация на Хабре](https://habr.com/ru/post/676902/)

## Об авторе

![Толкачев Сергей Юрьевич](https://web-tolk.ru/images/uslugi/sergey-tolkachyov-apr-2023.webp)

### Толкачев Сергей Юрьевич

Joomla-разработчик. [Контрибьютер ядра Joomla](https://github.com/joomla/joomla-cms/pulls?q=is%3Apr+author%3Asergeytolkachyov+). Один из ведущих Telegram-канала русскоязычного Joomla-сообщества [JoomlaFeed](https://t.me/joomlafeed), один из модераторов [чата русскоязычного Joomla-сообщества](https://t.me/joomlaru). Мои расширения в официальном маркетплейсе расширений Joomla - [Joomla Extensions Directory](https://extensions.joomla.org/profile/profile/details/528051/). Имею публикации в [официальном журнале международного Joomla-сообщества - Joomla Community Magazine](https://magazine.joomla.org/authors/sergeytolkachyov) и на [официальном сайте русскоязычного Joomla-сообщества](https://joomlaportal.ru/users/sergey-tolkachyov).

Муж. Отец 3 детей.

Россия, Саратов.

## JSON-LD Schema

```json
{
    "@context": "https://schema.org",
    "@type": "BreadcrumbList",
    "@id": "https://web-tolk.ru/#/schema/BreadcrumbList/17",
    "itemListElement": [
        {
            "@type": "ListItem",
            "position": 1,
            "item": {
                "@id": "https://web-tolk.ru/",
                "name": "Главная"
            }
        },
        {
            "@type": "ListItem",
            "position": 2,
            "item": {
                "@id": "https://web-tolk.ru/blog",
                "name": "Блог"
            }
        },
        {
            "@type": "ListItem",
            "position": 3,
            "item": {
                "name": "Создание WebCron плагина для Joomla 4 (Task Scheduler Plugin)"
            }
        }
    ]
}
```

```json
{
    "@context": "https://schema.org",
    "@graph": [
        {
            "@type": "Organization",
            "@id": "https://web-tolk.ru/#/schema/Organization/base",
            "name": "WebTolk",
            "url": "https://web-tolk.ru/",
            "logo": {
                "@type": "ImageObject",
                "@id": "https://web-tolk.ru/#/schema/ImageObject/logo",
                "url": "images/webtolk-1080p.jpg",
                "contentUrl": "images/webtolk-1080p.jpg",
                "width": 1920,
                "height": 1080
            },
            "image": {
                "@id": "https://web-tolk.ru/#/schema/ImageObject/logo"
            },
            "sameAs": [
                "https://github.com/WebTolk",
                "https://github.com/sergeytolkachyov",
                "https://vk.com/web_tolk",
                "https://vk.com/webtolkru",
                "https://tenchat.ru/sergeytolkachyov",
                "https://t.me/sergeytolkachyov",
                "https://t.me/webtolkru"
            ]
        },
        {
            "@type": "WebSite",
            "@id": "https://web-tolk.ru/#/schema/WebSite/base",
            "url": "https://web-tolk.ru/",
            "name": "WebTolk",
            "publisher": {
                "@id": "https://web-tolk.ru/#/schema/Organization/base"
            }
        },
        {
            "@type": "WebPage",
            "@id": "https://web-tolk.ru/#/schema/WebPage/base",
            "url": "https://web-tolk.ru/blog/sozdanie-webcron-plagina-dlya-joomla-4-task-scheduler-plugin",
            "name": "Создание WebCron плагина для Joomla 4 (Task Scheduler Plugin) - WebTolk",
            "description": "В Joomla! 4.1 появился планировщик задач - WebCron. Он помогает автоматизировать повторяющиеся самые разные задачи по расписанию. Как создать плагин WebCron Joo",
            "isPartOf": {
                "@id": "https://web-tolk.ru/#/schema/WebSite/base"
            },
            "about": {
                "@id": "https://web-tolk.ru/#/schema/Organization/base"
            },
            "inLanguage": "ru-RU",
            "breadcrumb": {
                "@id": "https://web-tolk.ru/#/schema/BreadcrumbList/17"
            }
        },
        {
            "@type": "Article",
            "@id": "https://web-tolk.ru/#/schema/com_content/article/54",
            "isPartOf": {
                "@id": "https://web-tolk.ru/#/schema/WebPage/base"
            }
        }
    ]
}
```
