# Модуль RT Form
Данный модуль позволяет создавать произвольные формы с возможностью сохранение 
всех запросов пользователя в административном разделе.  
***
## Настройка
1. Создать шаблон письма в E-mail менеджере
2. Создать класс валидатор для обработки формы. Данный клас можно создать используя модуль skeleton
3. Создать форму в административном разделе модуля
4. Собрать html формы используя встроенные парсеры - rtform_open, rtform_message, form_error, form_close и другие 

### Пример шаблона письма
```
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Pitch submission form</title>
</head>
<body>
<p>User filled pitch submission form</p>
<table>
    <tr>
        <td>Name</td>
        <td>[[name]]</td>
    </tr>
    <tr>
        <td>Email Address</td>
        <td>[[email]]</td>
    </tr>
    <tr>
        <td>Phone Number</td>
        <td>[[phone]]</td>
    </tr>
</table>
</body>
</html>

```  
### Пример класса валидатора  
```
class Rtform_pitch_form extends \Ciext\Form\AbstractForm
{

    public function get_rules()
    {
        return [
            [
                'field' => 'name',
                'label' => $this->ci->lang->line('Name'),
                'rules' => [
                    'trim',
                    'min_length[3]',
                    'max_length[255]',
                ]
            ],
            [
                'field' => 'email',
                'label' => $this->ci->lang->line('Email address'),
                'rules' => [
                    'trim',
                    'valid_email',
                ]
            ],
            [
                'field' => 'phone',
                'label' => $this->ci->lang->line('Phone number'),
                'rules' => [
                    'trim',
                    'max_length[255]',
                ]
            ],
        ];
    }
}
```  


### Пример формы с использованием парсера rtform_rows
```
// В административном разделе модуля создана форма с pitch_submission_form
// и настроена на валидатор Rtform_pitch_form
 
{{ rtform_open('pitch_submission_form') }}
    <h4>PITCH SUBMISSION FORM</h4>
    {{ rtform_rows('pitch_submission_form') }}
    {{ rtform_message('<div class="btn_box"><label class="label label-success">', '</label></div>') }}
{{ form_close() }}
```

### Пример индивидуальной html формы
```
// В административном разделе модуля создана форма с pitch_submission_form
// и настроена на валидатор Rtform_pitch_form
 
{{ rtform_open('pitch_submission_form') }}
    <h4>PITCH SUBMISSION FORM</h4>
    <div class="form_group">
        <label>Your name:</label>
        <input type="text" name="name" value="{{ form_set_value('name') }}" required />
        {{ form_error('name') }}
    </div>
    <div class="form_group">
        <label>Email address:</label>
        <input type="email" name="email" value="{{ form_set_value('email') }}" required />
        {{ form_error('email') }}
    </div>
    <div class="form_group">
        <label>Phone number:</label>
        <input type="tel" name="phone" value="{{ form_set_value('phone') }}" />
        {{ form_error('phone') }}
    </div>
    {{ rtform_message('<div class="btn_box"><label class="label label-success">', '</label></div>') }}
{{ form_close() }}
```  
### Пример формы з загрузкой файла
```
// Создаем форму с возможностью загрузки файлов, enctype="multipart/form-data" 
{{ rtform_open('pitch_submission_form', '', 'true') }}
...

// Добавляем инпут для выбора файла в HTML формы
<label>Attached Resume <input type="file" name="userfile" style="display: none"></label>
{{ form_error('userfile') }}

// В класс валидатор формы добавляем
    public function get_rules()
    {
        return [
            ...
            [
                'field' => 'userfile',
                'label' => $this->ci->lang->line('File'),
                'rules' => [
                    ['valid_file', [$this, 'valid_file']]
                ]
            ],
        ];
    }

    public function is_valid()
    {
        $is_valid = parent::is_valid();

        if (!$is_valid) {
            $data = $this->ci->upload->data();
            if (!empty($data['file_name']) && file_exists($data['full_path'])) {
                unlink($data['full_path']);
            }
        }

        return $is_valid;
    }

    public function valid_file($value)
    {
        $field = 'userfile';
        $config['upload_path'] = './assets/uploads/resumes/';
        $config['allowed_types'] = '*';
        $config['max_size'] = 10240; // 10Mb

        $this->ci->load->library('upload')->initialize($config);

        if (empty($_POST[$field]) && !$this->ci->upload->do_upload($field)) {
            $this->ci->form_validation->set_message('valid_file', $this->ci->upload->display_errors());

            return false;
        } else {
            $_POST[$field] = base_url(trim($config['upload_path'], '.') . $this->ci->upload->data('file_name'));

            return true;
        }
    }

```