# Создание формы

Каждая форма должна быть экземпляром pm_Form_Simple , чтобы выглядеть так же, как остальные формы в Plesk. В большинстве случаев вы можете использовать такие же возможности, как и для Zend_Form. А именно, вы можете:

## Шаг 1. Указать элементы

По сути, вам надо добавлять элементы к форме, используя метод addElement. Существует несколько стандартных элементов, таких как «text» или «select», и они обладают той же гибкостью, что и `Zend_Form`, включая способность указывать декораторы для сложных элементов:

    public function formAction()
    {
        $form = new pm_Form_Simple();
        $form->addElement('text', 'exampleText', [
            'label' => 'Example Text',
            'value' => 'Default value',
            'required' => true,
        ]);
    }

На странице это будет выглядеть так:

## Шаг 2. Укажите кнопки

Вы можете указать, как будут выглядеть кнопки внизу формы, используя метод addControlButtons:

    public function formAction()
    {
        $form = new pm_Form_Simple();

        // form elements are added here

        $form->addControlButtons([
            'cancelLink' => pm_Context::getModulesListUrl(),
        ]);
    }

В результате этого будут добавлены кнопки OK и Отмена:

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

Прежде всего вам надо передать форму из контроллера в представление:

    public function formAction()
    {
        $form = new pm_Form_Simple();

        // form elements and buttons are defined here

        $this->view->form = $form;
    }

А затем отобразить ее в представлении (в файле `.phtml`):

    <?php echo $this->form; ?>

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

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

## Шаг 4. Валидация и обработка формы

Следующий шаг – валидировать форму и обработать ее в момент сохранения пользователем. Рекомендуется сделать это в контроллере в том же действии. Чтобы валидировать форму, вы можете указать валидаторы для элементов или можете создать класс для своей формы в папке library, наследовать его от класса pm_Form_Simple и перезаписать метод `isValid` (чтобы посмотреть пример такой формы, обратитесь к https://github.com/plesk/ext-route53/blob/master/plib/library/Form/Settings.php, а пример использования можно посмотреть в https://github.com/plesk/ext-route53/blob/master/plib/controllers/IndexController.php в `indexAction`).

    public function formAction()
    {
        $form = new pm_Form_Simple();

        // form elements and buttons are defined here

        if ($this->getRequest()->isPost() && $form->isValid($this->getRequest()->getPost())) {
            $value = $form->getValue('exampleText');

            // Proccess/save value here

            $this->_status->addInfo('Data was successfully saved.');
            $this->_helper->json(['redirect' => pm_Context::getBaseUrl() ]);
        }

        $this->view->form = $form;
    }

Обычно после обработки формы отображается сообщение об успешном иди неуспешном завершении обработки.

Его можно создать, используя pm_View_Status , как показано в примере выше. Вы также можете указать, куда следует перенаправить пользователя после завершения обработки формы с помощью параметра «redirect» ответа JSON и помощников pm_Context для составления URL.

## Формы только для чтения

Другим часто используемым типом страниц в Plesk является страница с обзором какого-либо объекта. Она может быть реализована как форма, все поля которой помечены как поля только для чтения. Например, вы можете создать такое действие (мы использовали `pm_Session`, чтобы получить экземпляр учетной записи текущего пользователя `pm_Client`):

    public function overviewAction()
    {
        $client = pm_Session::getClient();
        $form = new pm_Form_Simple();
        $form->addElement('text', 'name', [
            'label' => 'Name',
            'value' => $client->getProperty('pname') ,
            'readonly' => true,
        ]);
        $form->addElement('text', 'email', [
            'label' => 'Email',
            'value' => $client->getProperty('email') ,
            'readonly' => true,
        ]);
        $this->view->form = $form;
    }

Затем добавьте ее к представлению (`overview.phtml`):

    Current logged in user:
    <?php echo $this->form; ?>

На странице форма только для чтения выглядит так: