# Упражнение 2. Планирование задач и интеграция с информационной панелью

В этом упражнении вы сможете создать простой считыватель новостей RSS, который отображает последний элемент ленты новостей Plesk на информационной панели администратора. Во время написания этого расширения вы узнаете, как делать следующее:

- Писать скрипты для установки и удаления.

- Использовать хранилище пар «ключ-значение».

- Добавлять запланированные задачи.

- Создавать промо-блоки на информационной панели администратора.

Мы предполагаем, что идентификатор расширения — panel-news, и что вы начнете разработку с кода внутри папки ex2. Мы уже частично написали этот код, чтобы помочь вам сосредоточиться только на определенных областях. Кроме того, мы добавили в папку медиа-контент, необходимый для выполнения упражнения. Чтобы посмотреть завершенное упражнение, ознакомьтесь с содержимым папки ex2complete.

## Шаг 1. Создание помощника для скачивания RSS-ленты

Прежде всего, давайте реализуем класс для скачивания RSS-ленты и сохранения ее последнего элемента в локальном хранилище. Для этого откройте файл `/plib/library/News.php`. Обратите внимание на имя класса: оно соответствует соглашению по именованию классов, и поэтому будет загружено автоматически. В плане автозагрузки мы полагаемся на подход Zend. Читайте об этом больше здесь.

Теперь давайте реализуем метод загрузки:

    public static function load()
    {
        $url = 'http://kb.plesk.com/rss/gen.xml?p=PLESK';
        $content = @file_get_contents($url);
        if (false === $content) {
        return;
        }
        $xml = simplexml_load_string($content);
        if (false === $xml || !$xml->channel) {
        return;
        }
        $lastItem = $xml->channel->item;
        pm_Settings::set('news_text', $lastItem ? (string) $lastItem->title : '');
        pm_Settings::set('news_link', $lastItem ? (string) $lastItem->link : '');
    }

Этот код показывает, как элемент ленты новостей помещается в хранилище пар «ключ-значение» с использованием pm_Settings::set путем присвоения переменных news_text и news_link. Теперь мы можем получить значения переменных в любое время в помощью pm_Settings::get, если контекст расширения инициализирован.

## Шаг 2. Добавьте в хранилище последний элемент ленты новостей.

Расширение, которое мы собираемся написать, не будет иметь собственного графического интерфейса. Все его функции будут доступны из промо-блока на Домашней странице администратора. Поэтому у нас нет необходимости получать порядок выполнения, как мы делали в Упражнении 1 на шаге 1. Однако нам надо записать в хранилище расширения последний элемент ленты новостей. Для этого нам надо написать скрипт, который получает этот элемент и сохраняет его непосредственно после установки нашего расширения.

SDK расширений предоставляет возможность запускать скрипты PHP в этой и некоторых других ситуациях. Следующая таблица показывает, какие файлы расширения вызываются в определенных условиях.

Файл | Условие
--- | ---
`/plib/scripts/pre-install.php` | Запускается перед копированием файлов расширения. Этот скрипт позволяет убедиться, что система отвечает всем требованиям расширения и не выполняет никаких изменений на сервере. На этой стадии файлы расширения недоступны.
`/plib/scripts/post-install.php` | Запускается после копирования файлов расширения. Этот скрипт выполняет все изменения, необходимые для работы расширения. Например, используя этот скрипт, вы можете создать базы данных или подготовить необходимую структуру папок.
`/plib/scripts/pre-uninstall.php` | Запускается перед удалением расширения. Этот скрипт удаляет файлы, используемые расширением, такие как базы данных, шаблоны и контент пользователей.

Таким образом, система сканирует каждое расширение на наличие этих скриптов и запускает скрипты тогда, когда это необходимо.

В нашем упражнении мы хотим получить элемент ленты новостей после установки расширения, поэтому вам нужно изменить файл `/plib/scripts/post-install.php`, добавив в него следующую строку:

    Modules_PanelNews_News::load();

Это приведет к инициализации значений в хранилище пар «ключ-значение».

## Шаг 3. Отобразите элемент ленты новостей в промо-блоке.

Чтобы создать промо-блок в Plesk, добавьте следующие строки в `/plib/library/Promo/Home.php`:

    class Modules_PanelNews_Promo_Home extends pm_Promo_Home
    {

        public function getTitle()
        {
            return 'Plesk News';
        }

        public function getText()
        {
            pm_Context::init($this->_moduleId);
            return pm_Settings::get('news_text');
        }

        public function getButtonText()
        {
            return 'View Article';
        }

        public function getButtonUrl()
        {
            return pm_Settings::get('news_link');
        }

        public function getIconUrl()
        {
            pm_Context::init('plesk-news');
            return pm_Context::getBaseUrl() . '/images/feed.png';
        }

    }

Как вы можете видеть, этот класс описывает промо-блок. Он не вызывается сам по себе где-либо в расширении. Фактически, Plesk загружает все классы, которые расширяют pm_Promo_Home автоматически, когда администратор Plesk загружает Домашнюю страницу. Для загрузки класса его имя должно соответствовать соглашению по именованию, описанному на шаге 1. Если вы упакуете расширение и добавите его в Plesk, вы увидите на информационной панели следующий новый блок. Когда администратор нажимает ссылку, он перенаправляется к переменной news_link из хранилища пар «ключ-значение».

## Шаг 4. Запланируйте периодическое обновление последнего элемента ленты новостей

Переменной news_link значение присваивается всего один раз, а именно, когда расширение установлено. Нам нужно периодически обновлять ее значение в соответствии с лентой новостей Plesk. Для этого мы будем запускать запланированный скрипт. Но сначала давайте создадим этот скрипт.

Примечание

Все скрипты необходимо помещать в папку `/plib/scripts`.

Предположим, имя нашего скрипта — `periodic-task.php`, так что путь к нему в расширении будет `/plib/scripts/periodic-task.php`. Откройте файл и добавьте в него следующий код:

    Modules_PanelNews_News::load();

Выглядит знакомо? Да, мы использовали такой же код в `post-install.php`. Теперь настало время запланировать запуск скрипта. Лучшее место для этого — скрипт, запускаемый после установки, так как это позволит нам убедиться, что задача успешно запланирована, сразу после установки расширения. Откройте файл `/plib/scripts/post-install.php` и измените его, чтобы он выглядел следующим образом:

    <?php
    $task = new pm_Scheduler_Task();
    $task->setSchedule(pm_Scheduler::$EVERY_DAY);
    $task->setCmd('periodic-task.php');
    pm_Scheduler::getInstance()->putTask($task);
    Modules_PanelNews_News::load();

Этот код показывает, что для планирования запуска скрипта (так называемой задачи), нам надо создать экземпляр pm_Scheduler_Task, задать период выполнения с помощью setSchedule и указать целевой скрипт с помощью setCmd. Наконец, добавьте задачу к интерфейсу планировщика задач с помощью putTask.

При удалении расширения запланированная задача также должна быть удалена. Для этого добавьте следующую строку в файл `/plib/scripts/postpre-uninstall.php`:

    pm_Scheduler::getInstance()->removeAllTasks();

Этот код удалит задачу из интерфейса планировщика задач с помощью removeAllTasks.

## Шаг 5. Установите и протестируйте расширение.

Поздравляем! Вы выполнили упражнение. Чтобы установить ваше расширение в Plesk:

1. Упакуйте содержимое папки ex2 (но не саму папку) в архив ZIP, используя вашу любимую программу-архиватор.

   Примечание

   Удостоверьтесь в том, что файл `meta.xml` находится в корне распакованного архива. Это требование очень важно, и, если оно не выполнено, при попытке добавить расширение в Plesk возникнет ошибка.

2. Войдите в Plesk как администратор и добавьте расширение на странице Управление сервером > Расширения.

Ваше расширение должно появиться в списке. Оно отображается как недоступное, так как у него нет своего графического интерфейса, но вы можете видеть промо-блок на Домашней странице и проверить, что соответствующая задача запланирована, в разделе Инструменты и настройки > Планировщик задач.

Перепроверьте добавленную функциональность, чтобы убедиться, что все необходимое доступно в архиве расширения. Вы можете использовать для примера готовое расширение, доступное здесь.