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

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

 

Leave your feedback on this topic here

If you have questions or need support, please visit the Plesk forum or contact your hosting provider.
The comments below are for feedback on the documentation only. No timely answers or help will be provided.