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

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

  • Писать скрипты для установки и удаления.
  • Использовать хранилище пар "ключ-значение".
  • Добавлять запланированные задачи.
  • Создавать промо-блоки на информационной панели администратора.

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

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

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

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

Файл Условие

/plib/scripts/pre-install.php

Перед установкой расширения

/plib/scripts/post-install.php

После установки расширения

/plib/scripts/pre-uninstall.php

Перед удалением расширения

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

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

pm_Context::init('panel-news');

Modules_PanelNews_News::load();

Первая строка загружает контекст расширения. Мы будем использовать его позже для взаимодействия с хранилищем пар "ключ-значение". Следующая строка вызывает метод, который отвечает за получение элемента ленты новостей. Мы собираемся использовать этот метод более чем в одном месте, поэтому мы изолировали его в отдельный класс.

 

Как вы могли заметить, мы не включали Modules_PanelNews_News в post-install.php. Это произошло благодаря автоматической загрузке. В плане автозагрузки мы полагаемся на подход Zend. Читайте о нем больше в http://framework.zend.com/manual/en/learning.autoloading.design.html.

Применительно к нашему классу, система выполняет следующую последовательность операций:

  1. Префикс Modules_ сообщает системе, что класс должен находиться внутри расширения.
  2. Часть PanelNews_ преобразуется в идентификатор расширения путем добавления дефисов перед заглавными буквами и перевода заглавных букв в нижний регистр. После преобразования идентификатор будет таким: panel-news.
  3. Наконец, часть News дает указание системе искать определение класса в News.php в папке /plib/library нашего расширения.

Зная эту стратегию, вы можете писать свои собственные классы, помещать их в папку /plib/library, а позже использовать их в своем коде без предварительного включения.

Возвращаясь к реализации метода load, откройте файл /plib/library/News.php и измените load следующим образом:

public static function load()
 {
 $xml = simplexml_load_file('http://www.parallels.com/products/plesk/rss');

 $lastItem = $xml->channel->item;

 pm_Settings::set('news_text', (string) $lastItem->title);
 pm_Settings::set('news_link', (string) $lastItem->link);
 }

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

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

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

class Modules_PanelNews_Promo_Home extends pm_Promo_Home
{

 public function getTitle()
 {
 return 'Parallels Plesk Panel 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('panel-news');
 return pm_Context::getBaseUrl() . '/images/feed.png';
 }

}

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

Когда администратор нажимает ссылку, он перенаправляется к переменной news_link из хранилища пар "ключ-значение". Мы делаем два инициализирующих вызова в коде Modules_PanelNews_Promo_Home, чтобы удостовериться, что хранилище инициализировано перед использованием.

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

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

Примечание. Запланированные скрипты должны храниться в /plib/scripts.

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

pm_Context::init('panel-news');

Modules_PanelNews_News::load();

 

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

<?php

pm_Context::init('panel-news');

$task = new pm_Scheduler_Task();
$task->setSchedule(pm_Scheduler::$EVERY_DAY);
$task->setCmd('periodic-task.php');

pm_Scheduler::getInstance()->putTask($task);
pm_Settings::set('periodic_task_id', $task->getId());

Modules_PanelNews_News::load();

 

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

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

pm_Context::init('panel-news');

$taskId = pm_Settings::get('periodic_task_id');
$task = pm_Scheduler::getInstance()->getTaskById($taskId);
pm_Scheduler::getInstance()->removeTask($task);

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

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

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

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

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

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

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