Шаг 1. Создание действий в контроллере.

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

public function listAction()
{
 $list = $this->_getNumbersList();

 // Объект списка для pm_View_Helper_RenderList
 $this->view->list = $list;
}

public function listDataAction()
{
 $list = $this->_getNumbersList();

 // Данные Json из pm_View_List_Simple
 $this->_helper->json($list->fetchData());
}

Первый метод определяет действие как таковое и будет иметь представление, заданное в list.phtml. Оно загружает список и передает его в представление. Второй метод определяет способ, которым список может получать данные в формате JSON. Этот метод используется, когда пользователь меняет способ сортировки списка или переходит на следующую страницу (когда, например, список состоит из 30 строк, а на одной странице отображается только 25 строк). В этом случае, вместо загрузки целой страницы, перезагружается только список при помощи запроса AJAX к данному методу действия для списка.

Шаг 2. Создание объекта Список.

Теперь пора создать сам список. Для корректной визуализации в представлении он должен быть экземпляром pm_View_List_Simple. Мы рекомендуем создать его как закрытый метод внутри контроллера:

private function _getNumbersList()
{
 $data = [];
 $iconPath = pm_Context::getBaseUrl() . 'images/icon_16.gif';
 for ($index = 1; $index < 150; $index++)
 {
 $data[] = [
 'column-1' => '<a href="#">link #' . $index . '</a>',
 'column-2' => '<img src="' . $iconPath . '" /> image #' . $index,
 ];
 }

 $list = new pm_View_List_Simple($this->view, $this->_request);
 $list->setData($data);
 $list->setColumns([
 'column-1' => [
 'title' => 'Link',
 'noEscape' => true,
 'searchable' => true,
 ],
 'column-2' => [
 'title' => 'Description',
 'noEscape' => true,
 'sortable' => false,
 ],
 ]);

 // Учтите, что listDataAction соответствует URL /list-data/
 $list->setDataUrl(['action' => 'list-data']);
 return $list;
}

Обратите внимание на setDataUrl, где мы явно указываем, какое действие используется для получения данных. Кроме того, мы можем создать список как отдельный класс, который расширяет pm_View_List_Simple. В этом случае класс помещается в plib/library, и контроллер просто создает его экземпляр. Это делает возможным, например, повторное использование списка в другом месте или создание иерархии списков для повторного использования реализованной функциональности. В качестве примера такого подхода, вы можете посмотреть реализацию списка и способ его вызова в контроллере (методы listAction и listDataAction).

Шаг 3. Определите представление

Когда вы создаете список при помощи pm_View_List_Simple, представление (в файле .phtml) является очень простым и использует помощник pm_View_Helper_RenderList для его визуализации:

<?php echo $this->renderList($this->list); ?>

Теперь вы можете посмотреть список в вашем расширении и проверить результат его работы:

image-79427.png

Более того, вы можете посмотреть, как будет выглядеть список на сервере Plesk с использованием другой цветовой схемы или стиля (например, когда установлено расширение Skins and Color Schemes) или как он будет выглядеть в интерфейсе, адаптированном к мобильным устройствам.

Настройка колонки для сортировки по умолчанию

Начиная с Plesk 12.5, стало возможным указать колонку для сортировки по умолчанию с помощью опций, доступных при создании объекта класса pm_View_List_Simple.

$options = [
 'defaultSortField' => 'column-1',
 'defaultSortDirection' => pm_View_List_Simple::SORT_DIR_DOWN,
];

$list = new pm_View_List_Simple($this->view, $this->_request, $options);
$list->setData($data);
$list->setColumns([
 pm_View_List_Simple::COLUMN_SELECTION,
 'column-1' => [
 'title' => 'Link',
 'noEscape' => true,
 'searchable' => true,
 ],
 'column-2' => [
 'title' => 'Description',
 'noEscape' => true,
 'sortable' => false,
 ],
]);

Добавление панели инструментов к списку

Большинство списков в Plesk включает в себя панель инструментов с кнопками, и управление объектами списка с помощью этих кнопок является обычной практикой пользователей. Начиная с Plesk 12.5, стало возможным выполнение операций группировки с использованием SDK. Вы можете определить, какие кнопки будут отображаться для вашего списка, с помощью метода setTools. Кнопки могут инициировать различные операции, такие как переход на другую страницу. Кнопка Добавить, пожалуй, является наиболее часто используемой. Вы можете использовать помощники из pm_Context, чтобы составить URL:

$list->setTools([
 [
 'title' => 'Button 1',
 'description' => 'Ссылка на список расширений',
 'link' => pm_Context::getModulesListUrl(),
 ], [
 'title' => 'Button 2',
 'description' => 'Ссылка на стартовую страницу расширения',
 'link' => pm_Context::getBaseUrl(),
 ], [
 'title' => 'Button 3',
 'description' => 'Ссылка на контроллер custom и действие test расширения',
 'controller' => 'custom',
 'action' => 'test',
 ],
]);

Кнопки, определенные таким образом, на странице будут выглядеть так:

image-79426.png

Другой часто используемый сценарий – выполнение операции группировки выбранных объектов. Для этого вам надо добавить колонку с флажками к списку:

$list->setColumns([
 pm_View_List_Simple::COLUMN_SELECTION,

 // все остальные колонки
]);

image-79428.png

А затем добавьте кнопку с указанным свойством execGroupOperation:

$list->setTools([
 [
 'title' => 'Hide',
 'description' => 'Сделайте выбранные строки невидимыми.',
 'execGroupOperation' => [
 'submitHandler' => 'function(url, ids) {
 $A(ids).each(function(id) {
 $("' . $list->getId() . '")
 .select("[name=\'listCheckbox[]\'][value=\'" + id.value + "\']")
 .first()
 .up("tr")
 .hide();
 });
 }'
 ],
 ], [
 'title' => 'Remove',
 'description' => 'Удалите выбранные строки.',
 'execGroupOperation' => $this->_helper->url('remove'),
 ],
]);

В случае, когда вы указываете URL контроллера и действие, которое отвечает за выполнение операции группировки, создайте функцию действия в контроллере:

public function removeAction()
{
 $messages = [];
 foreach((array)$this->_getParam('ids') as $id) {

 // Здесь нам надо удалить объект с id = $id

 $messages[] = ['status' => 'info', 'content' => "Строка #$id была успешно удалена."];
 }
 $this->_helper->json(['status' => 'success', 'statusMessages' => $messages]);
}

Обратите внимание, что выполнение операции группировки осуществляется путем запроса AJAX так же, как и операция смены порядка элементов, описанная выше. Таким образом, действие должно вернуть в ответ данные JSON.

Больше примеров кода доступно в этом примере расширения: https://github.com/plesk/ext-example/blob/master/plib/controllers/IndexController.php.