--- name: perfex-forms description: Perfex CRM forms handling. form_open(), CSRF tokens, validation, AJAX. Based on official documentation only. Use when user mentions "perfex form", "form_open", "csrf token", "validation perfex". author: Descomplicar® Crescimento Digital version: 1.0.0 quality_score: 70 user_invocable: true desk_task: null --- # /perfex-forms - Formulários Perfex CRM Gestão de formulários em módulos. **Zero assumptions, zero hallucinations** - apenas documentação oficial. --- ## Documentação Base - [Working With Forms](https://help.perfexcrm.com/working-with-forms/) - [CodeIgniter Form Helper](https://codeigniter.com/userguide3/helpers/form_helper.html) --- ## Regra Fundamental: form_open() **SEMPRE usar `form_open()` para gerar token CSRF automaticamente.** ```php ``` **NUNCA usar `
` HTML directo:** ```html ``` --- ## Sintaxe form_open() ```php // Básico echo form_open(admin_url('meu_modulo/save')); // Com atributos echo form_open(admin_url('meu_modulo/save'), [ 'id' => 'form-meu-modulo', 'class' => 'form-horizontal', ]); // Com upload de ficheiros echo form_open_multipart(admin_url('meu_modulo/upload'), [ 'id' => 'form-upload', ]); // Fechar formulário echo form_close(); ``` --- ## Elementos de Formulário ### Input Text ```php
``` ### Textarea ```php
``` ### Select ```php
``` ### Select com AJAX (Clientes) ```php
``` ### Checkbox ```php
is_active == 1) ? 'checked' : ''; ?>>
``` ### Radio ```php
status == 'pending') ? 'checked' : ''; ?>>
status == 'active') ? 'checked' : ''; ?>>
``` ### Date Picker ```php
``` ### Date Time Picker ```php
``` ### File Upload ```php
``` ### Hidden ```php ``` --- ## Validação Client-Side O Perfex usa jQuery Validation. Usar `appValidateForm()`: ```php ``` ### Regras de Validação | Regra | Descrição | |-------|-----------| | `required: true` | Campo obrigatório | | `email: true` | Email válido | | `number: true` | Número | | `digits: true` | Apenas dígitos | | `minlength: N` | Mínimo N caracteres | | `maxlength: N` | Máximo N caracteres | | `min: N` | Valor mínimo | | `max: N` | Valor máximo | | `equalTo: '#field'` | Igual a outro campo | --- ## Validação Server-Side ```php public function save() { if (!$this->input->post()) { redirect(admin_url('meu_modulo')); } // Validação $this->load->library('form_validation'); $this->form_validation->set_rules('name', _l('name'), 'required|min_length[3]'); $this->form_validation->set_rules('email', _l('email'), 'required|valid_email'); $this->form_validation->set_rules('amount', _l('amount'), 'required|numeric'); if ($this->form_validation->run() === false) { // Erro de validação set_alert('danger', validation_errors()); redirect(admin_url('meu_modulo/create')); } // Dados válidos, processar $data = [ 'name' => $this->input->post('name'), 'email' => $this->input->post('email'), 'amount' => $this->input->post('amount'), ]; // ... guardar } ``` --- ## AJAX com jQuery ### POST Simples ```javascript $.post(admin_url + 'meu_modulo/ajax_save', { name: $('#name').val(), description: $('#description').val() }).done(function(response) { response = JSON.parse(response); if (response.success) { alert_float('success', response.message); } else { alert_float('danger', response.message); } }); ``` ### Com $.ajax() ```javascript $.ajax({ url: admin_url + 'meu_modulo/ajax_save', type: 'POST', data: $('#form-meu-modulo').serialize(), dataType: 'json', success: function(response) { if (response.success) { alert_float('success', response.message); // Redirecionar ou actualizar UI } else { alert_float('danger', response.message); } }, error: function() { alert_float('danger', 'Erro de comunicação'); } }); ``` ### Controller AJAX ```php public function ajax_save() { if (!$this->input->is_ajax_request()) { show_404(); } if (!staff_can('create', 'meu_modulo')) { echo json_encode(['success' => false, 'message' => _l('access_denied')]); return; } $data = [ 'name' => $this->input->post('name'), 'description' => $this->input->post('description'), ]; $id = $this->meu_modulo_model->add($data); echo json_encode([ 'success' => (bool) $id, 'id' => $id, 'message' => $id ? _l('added_successfully') : _l('error_occurred'), ]); } ``` --- ## Excluir CSRF para Webhooks Para endpoints que recebem callbacks externos: ```php // modules/meu_modulo/config/csrf_exclude_uris.php


id) : admin_url('meu_modulo/save'); echo form_open($action, ['id' => 'form-meu-modulo']); ?>
is_active == 1) ? 'checked' : ''; ?>>
``` --- ## Anti-Patterns (NUNCA FAZER) | Anti-Pattern | Risco | Alternativa | |--------------|-------|-------------| | `` HTML directo | CSRF bypass | `form_open()` | | Valores sem `html_escape()` | XSS | Escape sempre | | Validação só client-side | Bypass | Validar server também | | AJAX sem verificar `is_ajax_request()` | Acesso directo | Verificar sempre | --- ## Checklist Formulários ``` 1. [ ] form_open() para todos os formulários 2. [ ] html_escape() em todos os values 3. [ ] Validação client-side (appValidateForm) 4. [ ] Validação server-side (form_validation) 5. [ ] Permissões verificadas no controller 6. [ ] CSRF excluído apenas para webhooks 7. [ ] form_open_multipart() para uploads 8. [ ] is_ajax_request() em endpoints AJAX ``` --- **Versão:** 1.0.0 | **Autor:** Descomplicar® **Fonte:** help.perfexcrm.com/working-with-forms