# Создание списка

## Шаг 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); ?>

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

Более того, вы можете посмотреть, как будет выглядеть список на сервере 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',
        ],
    ]);

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

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

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

        // all other columns
    ]);

А затем добавьте кнопку с указанным свойством `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.