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. // define the form action
  66. $this->form->addAction(_t('Save'), new TAction(array($this, 'onSave')), 'fa:save green');
  67. $this->form->addAction(_t('New'), new TAction(array($this, 'onEdit')), 'fa:eraser red');
  68. $this->form->addAction(_t('Back to the listing'), new TAction(array('CondominiumList', 'onReload')), 'fa:table blue');
  69. $container = new TVBox;
  70. $container->style = 'width: 100%';
  71. $container->add(new TXMLBreadCrumb('menu.xml','CondominiumList'));
  72. $container->add($this->form);
  73. TScript::create('$( "#socialName" ).focus();');
  74. parent::add($container);
  75. }
  76. public function onEdit($param)
  77. {
  78. try
  79. {
  80. if (isset($param['key']))
  81. {
  82. TTransaction::open('database');
  83. $object = new Condominium($param['key']);
  84. // treats City
  85. $city = new City($object->city_id);
  86. $object->city_id = [ $city->id => $city->name.' / '.$city->state->abbreviation ];
  87. // load the contacts (composition)
  88. $contacts = $object->getContacts();
  89. if ($contacts)
  90. {
  91. $this->table_contacts->addSection('tbody');
  92. foreach ($contacts as $contact)
  93. {
  94. $this->addContactRow($contact);
  95. }
  96. // create add button
  97. $add = new TButton('clone');
  98. $add->setLabel('Novo');
  99. $add->setImage('fa:plus-circle green');
  100. $add->addFunction('ttable_clone_previous_row(this)');
  101. // add buttons in table
  102. $this->table_contacts->addRowSet([$add]);
  103. }
  104. else
  105. {
  106. $this->onClear($param);
  107. }
  108. // fill the form with the active record data
  109. $this->form->setData($object);
  110. TTransaction::close();
  111. }
  112. else
  113. {
  114. $this->onClear($param);
  115. }
  116. }
  117. catch (Exception $e)
  118. {
  119. new TMessage('error', $e->getMessage());
  120. TTransaction::rollback();
  121. }
  122. }
  123. public function onSave($param)
  124. {
  125. try
  126. {
  127. TTransaction::open('database');
  128. $this->form->validate();
  129. $object = $this->form->getData('Condominium');
  130. // Contacts
  131. if( !empty($param['contact_name']) AND is_array($param['contact_name']) )
  132. {
  133. foreach( $param['contact_name'] as $row => $contact_name)
  134. {
  135. if ($contact_name)
  136. {
  137. $contact = new CondominiumContact();
  138. $contact->name = $contact_name;
  139. $contact->email = $param['contact_email'][$row];
  140. $contact->cell_phone = $param['contact_cell_phone'][$row];
  141. $object->addContact($contact);
  142. }
  143. }
  144. }
  145. // backup original data
  146. $city_array = $object->city_id;
  147. // treats City
  148. $city = array_keys($object->city_id);
  149. $object->city_id = $city[0];
  150. $object->store();
  151. // restore original data
  152. $object->city_id = $city_array;
  153. $this->form->setData($object);
  154. TTransaction::close();
  155. new TMessage('info', _t('Record saved'));
  156. }
  157. catch (Exception $e)
  158. {
  159. new TMessage('error', $e->getMessage());
  160. TTransaction::rollback();
  161. }
  162. }
  163. public function addContactRow($item)
  164. {
  165. $uniqid = mt_rand(1000000, 9999999);
  166. $contact_name = new TEntry('contact_name[]');
  167. $contact_name->{'data-row'} = $this->detail_row;
  168. $contact_name->setId('contact_name_'.$uniqid);
  169. $contact_name->setSize('100%');
  170. if (!empty($item->name))
  171. {
  172. $contact_name->setValue($item->name);
  173. }
  174. $contact_email = new TEntry('contact_email[]');
  175. $contact_email->{'data-row'} = $this->detail_row;
  176. $contact_email->setId('contact_email_'.$uniqid);
  177. $contact_email->setSize('100%');
  178. $contact_email->addValidation('E-mail do contato', new TEmailValidator);
  179. if (!empty($item->email))
  180. {
  181. $contact_email->setValue($item->email);
  182. }
  183. $contact_cell_phone = new TEntry('contact_cell_phone[]');
  184. $contact_cell_phone->{'data-row'} = $this->detail_row;
  185. $contact_cell_phone->setId('contact_cell_phone_'.$uniqid);
  186. $contact_cell_phone->setSize('100%');
  187. $contact_cell_phone->setMaxLength(11);
  188. $contact_cell_phone->setMask('99999999999');
  189. $contact_cell_phone->addValidation('Celular do contato', new TPhoneValidator);
  190. if (!empty($item->cell_phone))
  191. {
  192. $contact_cell_phone->setValue($item->cell_phone);
  193. }
  194. // create delete button
  195. $del = new TImage('fa:trash-o red');
  196. $del->onclick = 'ttable_remove_row(this)';
  197. $row = $this->table_contacts->addRowSet( $contact_name, $contact_email, $contact_cell_phone, $del );
  198. $row->{'data-row'} = $this->detail_row;
  199. $this->form->addField($contact_name);
  200. $this->form->addField($contact_email);
  201. $this->form->addField($contact_cell_phone);
  202. $this->detail_row ++;
  203. }
  204. public function onClear($param)
  205. {
  206. $this->form->clear();
  207. $this->table_contacts->addSection('tbody');
  208. $this->addContactRow( new stdClass );
  209. // create add button
  210. $add = new TButton('clone');
  211. $add->setLabel('Novo');
  212. $add->setImage('fa:plus-circle green');
  213. $add->addFunction('ttable_clone_previous_row(this)');
  214. $this->table_contacts->addRowSet([$add]);
  215. }
  216. }
  217. ?>


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.