Lançado Adianti Framework 8.1!
Clique aqui para saber mais
Validação em formulário vetorial Eu configuro os componentes como num formulário TBootstrapFormBuilder normal, porém ao chamar o validate no onSave, os campos vetoriais são ignorados. Alguém tem alguma dica ?...
A
Validação em formulário vetorial  
Eu configuro os componentes como num formulário TBootstrapFormBuilder normal, porém ao chamar o validate no onSave, os campos vetoriais são ignorados.

Alguém tem alguma dica ?

Curso Dominando o Adianti Framework

O material mais completo de treinamento do Framework.
Curso em vídeo aulas + Livro completo + Códigos fontes do projeto ERPHouse.
Conteúdo Atualizado!


Dominando o Adianti Framework Quero me inscrever agora!

Comentários (6)


NR

Em alguns casos a função onSave é declarada com static para formulários vetoriais, e assim o $this->form->validate() não funciona. Qualquer coisa poste o código para que possamos analisar.
A

  1. <?php
  2. class CondominiumForm extends TPage
  3. {
  4.     protected $form;
  5.     private $table_contacts;
  6.     public function __construct()
  7.     {
  8.         parent::__construct();
  9.         // creates the form
  10.         $this->form = new BootstrapFormBuilder('form_condominium');
  11.         $this->form->setFormTitle('Condomínio');
  12.         // create the form fields
  13.         $id                     = new TEntry('id');
  14.         $social_name            = new TEntry('social_name');
  15.         $fantasy_name           = new TEntry('fantasy_name');
  16.         $cnpj                   = new TEntry('cnpj');
  17.         $fixed_line             = new TEntry('fixed_line');
  18.         $zip_code               = new TEntry('zip_code');
  19.         $address                = new TEntry('address');
  20.         $address_number         = new TEntry('address_number');
  21.         $address_complement     = new TEntry('address_complement');
  22.         $address_neighborhood   = new TEntry('address_neighborhood');
  23.         $city_id                = new TDBMultiSearch('city_id''database''City''id''name');
  24.         // adjustments
  25.         $id->setSize('20%');
  26.         $id->setEditable(false);
  27.         $social_name->setId('socialName');
  28.         $social_name->setSize('100%');
  29.         $fantasy_name->setSize('100%');
  30.         $cnpj->setSize('100%');
  31.         $cnpj->setMaxLength(14);
  32.         $fixed_line->setSize('100%');
  33.         $fixed_line->setMaxLength(10);
  34.         $zip_code->setMaxLength(8);
  35.         $zip_code->setSize('38%');
  36.         $address->setSize('100%');
  37.         $address_number->setSize('30%');
  38.         $address_complement->setSize('100%');
  39.         $address_neighborhood->setSize('100%');
  40.         $city_id->setSize('40%');
  41.         $city_id->setMinLength(2);
  42.         $city_id->setMaxSize(1);
  43.         $city_id->setMask('{name} / {state->abbreviation}');
  44.         // validations
  45.         $social_name->addValidation('Razão Social', new TRequiredValidator);
  46.         $fantasy_name->addValidation('Nome Fantasia', new TRequiredValidator);
  47.         $cnpj->addValidation('CNPJ', new TRequiredValidator);
  48.         $cnpj->addValidation('CNPJ', new TCNPJValidator);
  49.         $zip_code->addValidation('CEP', new TCEPValidator);
  50.         $this->form->appendPage('Cadastro');
  51.         $this->form->addFields( [new TLabel('ID')], [$id] );
  52.         $this->form->addFields( [new TLabel('Razão Social')], [$social_name] );
  53.         $this->form->addFields( [new TLabel('Nome Fantasia')], [$fantasy_name] );
  54.         $this->form->addFields( [new TLabel('CNPJ')], [$cnpj], [new TLabel('Telefone')], [$fixed_line] );
  55.         $this->form->addFields( [new TLabel('CEP')], [$zip_code] );
  56.         $this->form->addFields( [new TLabel('Endereço')], [$address], [new TLabel('Número')], [$address_number] );
  57.         $this->form->addFields( [new TLabel('Complemento')], [$address_complement], [new TLabel('Bairro')], [$address_neighborhood] );
  58.         $this->form->addFields( [new TLabel('Cidade')], [$city_id] );
  59.         $this->form->appendPage('Contatos');
  60.         $this->table_contacts = new TTable;
  61.         $this->table_contacts->width '100%';
  62.         $this->table_contacts->addSection('thead');
  63.         $this->table_contacts->addRowSet( new TLabel('Nome''#8082C3',10'b'), new TLabel('Email''#8082C3',10'b'), new TLabel('Celular''#8082C3',10'b'));
  64.         $this->form->addContent( [ $this->table_contacts ] );
  65.         
  66.         // define the form action
  67.         $this->form->addAction(_t('Save'), new TAction(array($this'onSave')), 'fa:save green');
  68.         $this->form->addAction(_t('New'), new TAction(array($this'onEdit')), 'fa:eraser red');
  69.         $this->form->addAction(_t('Back to the listing'),  new TAction(array('CondominiumList''onReload')), 'fa:table blue');
  70.         $container = new TVBox;
  71.         $container->style 'width: 100%';
  72.         $container->add(new TXMLBreadCrumb('menu.xml','CondominiumList'));
  73.         $container->add($this->form);
  74.         TScript::create('$( "#socialName" ).focus();');
  75.         parent::add($container);
  76.     }
  77.     public function onEdit($param)
  78.     {
  79.         try
  80.         {
  81.             if (isset($param['key']))
  82.             {
  83.                 TTransaction::open('database');
  84.                 $object = new Condominium($param['key']);
  85.                 // treats City
  86.                 $city = new City($object->city_id);
  87.                 $object->city_id = [ $city->id => $city->name.' / '.$city->state->abbreviation ];
  88.                 // load the contacts (composition)
  89.                 $contacts $object->getContacts();
  90.                 if ($contacts)
  91.                 {
  92.                     $this->table_contacts->addSection('tbody');
  93.                     foreach ($contacts as $contact)
  94.                     {
  95.                         $this->addContactRow($contact);
  96.                     }
  97.                     // create add button
  98.                     $add = new TButton('clone');
  99.                     $add->setLabel('Novo');
  100.                     $add->setImage('fa:plus-circle green');
  101.                     $add->addFunction('ttable_clone_previous_row(this)');
  102.                     // add buttons in table
  103.                     $this->table_contacts->addRowSet([$add]);
  104.                 }
  105.                 else
  106.                 {
  107.                     $this->onClear($param);
  108.                 }
  109.                 // fill the form with the active record data
  110.                 $this->form->setData($object);
  111.                 TTransaction::close();
  112.             }
  113.             else
  114.             {
  115.                 $this->onClear($param);
  116.             }
  117.         }
  118.         catch (Exception $e)
  119.         {
  120.             new TMessage('error'$e->getMessage());
  121.             TTransaction::rollback();
  122.         }
  123.     }
  124.     public function onSave($param)
  125.     {
  126.         try
  127.         {
  128.             TTransaction::open('database');
  129.             $this->form->validate();
  130.             $object $this->form->getData('Condominium');
  131.             // Contacts
  132.             if( !empty($param['contact_name']) AND is_array($param['contact_name']) )
  133.             {
  134.                 foreach( $param['contact_name'] as $row => $contact_name)
  135.                 {
  136.                     if ($contact_name)
  137.                     {
  138.                         $contact = new CondominiumContact();
  139.                         $contact->name          $contact_name;
  140.                         $contact->email         $param['contact_email'][$row];
  141.                         $contact->cell_phone    $param['contact_cell_phone'][$row];
  142.                         $object->addContact($contact);
  143.                     }
  144.                 }
  145.             }
  146.             // backup original data
  147.             $city_array $object->city_id;
  148.             // treats City
  149.             $city array_keys($object->city_id);
  150.             $object->city_id $city[0];
  151.             $object->store();
  152.             // restore original data
  153.             $object->city_id $city_array;
  154.             $this->form->setData($object);
  155.             TTransaction::close();
  156.             new TMessage('info'_t('Record saved'));
  157.         }
  158.         catch (Exception $e)
  159.         {
  160.             new TMessage('error'$e->getMessage());
  161.             TTransaction::rollback();
  162.         }
  163.     }
  164.     public function addContactRow($item)
  165.     {
  166.         $uniqid mt_rand(10000009999999);
  167.         $contact_name = new TEntry('contact_name[]');
  168.         $contact_name->{'data-row'} = $this->detail_row;
  169.         $contact_name->setId('contact_name_'.$uniqid);
  170.         $contact_name->setSize('100%');
  171.         
  172.         if (!empty($item->name))
  173.         {
  174.             $contact_name->setValue($item->name);
  175.         }
  176.         $contact_email = new TEntry('contact_email[]');
  177.         $contact_email->{'data-row'} = $this->detail_row;
  178.         $contact_email->setId('contact_email_'.$uniqid);
  179.         $contact_email->setSize('100%');
  180.         $contact_email->addValidation('E-mail do contato', new TEmailValidator);
  181.         if (!empty($item->email))
  182.         {
  183.             $contact_email->setValue($item->email);
  184.         }
  185.         $contact_cell_phone = new TEntry('contact_cell_phone[]');
  186.         $contact_cell_phone->{'data-row'} = $this->detail_row;
  187.         $contact_cell_phone->setId('contact_cell_phone_'.$uniqid);
  188.         $contact_cell_phone->setSize('100%');
  189.         $contact_cell_phone->setMaxLength(11);
  190.         $contact_cell_phone->setMask('99999999999');
  191.         $contact_cell_phone->addValidation('Celular do contato', new TPhoneValidator);
  192.         if (!empty($item->cell_phone))
  193.         {
  194.             $contact_cell_phone->setValue($item->cell_phone);
  195.         }
  196.         // create delete button
  197.         $del = new TImage('fa:trash-o red');
  198.         $del->onclick 'ttable_remove_row(this)';
  199.         $row $this->table_contacts->addRowSet$contact_name$contact_email$contact_cell_phone$del );
  200.         $row->{'data-row'} = $this->detail_row;
  201.         $this->form->addField($contact_name);
  202.         $this->form->addField($contact_email);
  203.         $this->form->addField($contact_cell_phone);
  204.         $this->detail_row ++;
  205.     }
  206.     public function onClear($param)
  207.     {
  208.         $this->form->clear();
  209.         $this->table_contacts->addSection('tbody');
  210.         $this->addContactRow( new stdClass );
  211.         // create add button
  212.         $add = new TButton('clone');
  213.         $add->setLabel('Novo');
  214.         $add->setImage('fa:plus-circle green');
  215.         $add->addFunction('ttable_clone_previous_row(this)');
  216.         $this->table_contacts->addRowSet([$add]);
  217.     }
  218. }
  219. ?>


A validação nos campos da primeira aba, funciona direitinho, porém na segunda aba, onde coloco os campos vetoriais, não funciona.

Estou colocando as validações no método addContactRow().
A

  1. <?php $city_id->setMask('Gledson Leonardo Pereira / {state->abbreviation}'); ?>


O forúm substituiu [name] (sendo chaves onde coloquei colchetes) pelo meu nome de usuário aqui.
NR

O addValidation não vai funcionar com os campos vetoriais. Você vai precisar controlar diretamente na onSave
A

Mais uma vez, muito obrigado Nataniel.

Só tenho mais uma dúvida, nesse modelo formulário, ao salvar, os campos vetoriais somem, mesmo o código estando igual ao do exemplo no Tutor, se puder me dar uma luz, agradeço imensamente.

Obrigado
NR

Ao clicar no salvar a classe é recarregada e o formulário regerado. Com isso, só vão aparecer no formulário os campos criados no método construtor.

Para evitar o carregamento de toda página você pode usar a função onSave como static, mas aí terá que fazer as validações manualmente pois a variável $this não pode ser acessada em uma função static.