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

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

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

    // List object for pm_View_Helper_RenderList
    $this->view->list = $list;
}

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

    // Json data from 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,
        ],
    ]);

    // Take into account listDataAction corresponds to the 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 to list of extensions',
        'link' => pm_Context::getModulesListUrl() ,
    ], [
        'title' => 'Button 2',
        'description' => 'Link to index page of the extension',
        'link' => pm_Context::getBaseUrl() ,
    ], [
        'title' => 'Button 3',
        'description' => 'Link to controller custom and action test of the extension',
        'controller' => 'custom',
        'action' => 'test',
    ],
]);

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

image-79426.png

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

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

    // all other columns
]);

image-79428.png

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

$list->setTools([
    [
        'title' => 'Hide',
        'description' => 'Make selected rows invisible.',
        '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' => 'Remove selected rows.',
        'execGroupOperation' => $this->_helper->url('remove') ,
    ],
]);

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

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

        // Here we should remove the object with id = $id

        $messages[] = ['status' => 'info', 'content' => "Row #$id was successfully removed."];
    }
    $this->_helper->json(['status' => 'success', 'statusMessages' => $messages]);
}

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

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