В этом упражнении вы сможете создать простой считыватель новостей 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 как администратор и добавьте расширение на странице Управление сервером > Расширения.

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

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