PageNagation + dataGrid com campos input Galera, tenho uma pagina de listagem com campos de filtro e uma dataGrid com campos input (TEntry e TCombo), o problema é seguinte, a pagina só é carregada sem erros quando entro na pagina, se eu tentar filtrar os dados ou navegar nas paginas da datagrid da erro de elementos duplicados no form. espero que alguem tem a solução. ...
BI
PageNagation + dataGrid com campos input  
Galera, tenho uma pagina de listagem com campos de filtro e uma dataGrid com campos input (TEntry e TCombo), o problema é seguinte,
a pagina só é carregada sem erros quando entro na pagina, se eu tentar filtrar os dados ou navegar nas paginas da datagrid da erro de elementos duplicados no form.

espero que alguem tem a solução.

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 (3)


FV

Olá Betuel, poderia postar seu código? pois ficaria mais fácil de te ajudar ;)

Recomendo que siga esse exemplo: www.adianti.com.br/framework_files/tutor/index.php?class=ProductSele
BI

Fiz algo que resolve parcialmente o problema, retirei o onSearch e as sessões, assim é possível filtrar os dados, porem o pageNavigation retira os filtros se mudar de pagina na datagrid.

 
  1. <?php
  2. class ValCoig extends TPage
  3. {
  4. private $form; // registration form
  5. private $datagrid; // listing
  6. private $pageNavigation;
  7. private $loaded;
  8. /**
  9. * Class constructor
  10. * Creates the page, the form and the listing
  11. */
  12. public function __construct()
  13. {
  14. parent::__construct();
  15. // creates the form
  16. $this->form = new TForm('form_search_ValCoig');
  17. $this->form->class = 'tform'; // CSS class
  18. // creates a table
  19. $table = new TTable;
  20. $table-> width = '1000px';
  21. $this->form->add($table);
  22. // add a row for the form title
  23. $row = $table->addRow();
  24. $row->class = 'tformtitle'; // CSS class
  25. $row->addCell( new TLabel('Valida Ocorrências') )->colspan = 10;
  26. // create the form fields
  27. $id = new TEntry('id');
  28. $data_coig = new TDate('data_coig');
  29. $empreendimento_id = new TDBCombo('empreendimento_id','sqlserver','Empreendimento','id','sigla');
  30. $aplicacao_id = new TCombo('aplicacao_id');
  31. $evento_aplicacao_id = new TCombo('evento_aplicacao_id');
  32. $nivel_montante = new TEntry('nivel_montante');
  33. $obs = new TEntry('obs');
  34. $systemuser_id = new TDBCombo('systemuser_id','sqlserver','SystemUser','id','name');
  35. $relevancia = new TDBCombo('relevancia_id','sqlserver','relevancia','id','descricao');
  36. $indicadorCoig = new TCombo('indicadorCoig');
  37. $tipousina = new TCombo('tipousina');
  38. $items = array();
  39. $items[1] ='COIG';
  40. $items[0] ='Geral';
  41. $indicadorCoig->addItems($items);
  42. $items = array();
  43. $items['P'] ="PCH's";
  44. $items['C'] ="CGH's";
  45. $tipousina->addItems($items);
  46. // set change action for empreendimento
  47. $change_action = new TAction(array($this, 'onChange'));
  48. $empreendimento_id->setChangeAction($change_action);
  49. $change_action2 = new TAction(array($this, 'onChange2'));
  50. $aplicacao_id->setChangeAction($change_action2);
  51. // define the sizes
  52. $id->setSize(90);
  53. $id->setMask('9999');
  54. $id->placeholder = 'Código';
  55. $data_coig->setSize(120);
  56. $data_coig->placeholder = 'Data';
  57. $empreendimento_id->setSize(120);
  58. $empreendimento_id->title = 'Empreendimento';
  59. $aplicacao_id->setSize(100);
  60. $aplicacao_id->title = 'Equipamento';
  61. $evento_aplicacao_id->setSize(350);
  62. $evento_aplicacao_id->title = 'Evento';
  63. $nivel_montante->setSize(70);
  64. $nivel_montante->setMask('999.99');
  65. $obs->setSize(450);
  66. $obs->placeholder = 'Observação';
  67. $systemuser_id->setSize(350);
  68. $systemuser_id->title = 'Responsável';
  69. $relevancia->setSize(100);
  70. $relevancia->title = 'Relevância';
  71. $indicadorCoig->setSize(90);
  72. $indicadorCoig->title = 'Indicador';
  73. $tipousina->setSize(120);
  74. $tipousina->title = 'Tipo de Usina';
  75. $row = $table->addRow();
  76. $row->addCell($indicadorCoig)->colspan = 1;
  77. $row->addCell($tipousina)->colspan = 1;
  78. $row = $table->addRow();
  79. //$row->addCell(new TLabel('ID:'));
  80. $row->addCell($id);
  81. //$row->addCell(new TLabel('Data:'));
  82. $row->addCell($data_coig);
  83. //$row->addCell(new TLabel('Usina:'));
  84. $row->addCell($empreendimento_id);
  85. //$row->addCell(new TLabel('Aplicação:'));
  86. $row->addCell($aplicacao_id);
  87. //$row->addCell(new TLabel('Ocorrência:'));
  88. $row->addCell($evento_aplicacao_id);
  89. $row = $table->addRow();
  90. //$row->addCell(new TLabel('Obs:'));
  91. $row->addCell($obs)->colspan = 3;
  92. //$row->addCell(new TLabel('Relev:'));
  93. $row->addCell(($relevancia) , ($indicadorCoig))->colspan = 1;
  94. //$row->addCell(new TLabel('Responsavel:'));
  95. $row->addCell($systemuser_id)->colspan = 1;
  96. $row = $table->addRow();
  97. $this->form->setFields(array($id,$data_coig,$empreendimento_id,$aplicacao_id,$evento_aplicacao_id,$obs,$systemuser_id, $relevancia, $indicadorCoig, $tipousina));//$nivel_montante,
  98. // keep the form filled during navigation with session data
  99. $this->form->setData( TSession::getValue('Coig_filter_data') );
  100. // create two action buttons to the form
  101. $find_button = TButton::create('find', array($this, 'onReload'), _t('Find'), 'ico_find.png');
  102. $this->form->addField($find_button);
  103. $buttons_box = new THBox;
  104. $buttons_box->add($find_button);
  105. // add a row for the form action
  106. $row = $table->addRow();
  107. $row->class = 'tformaction'; // CSS class
  108. $row->addCell($buttons_box)->colspan = 10;
  109. // creates a Datagrid
  110. $this->datagrid = new TDataGrid;
  111. //$this->datagrid->makeScrollable();
  112. $this->datagrid->disableDefaultClick(); // important!
  113. $this->datagrid->setHeight(420);
  114. $row = $table->addRow();
  115. $row->addCell($this->datagrid)->colspan = 10;
  116. // creates the datagrid columns
  117. $id = new TDataGridColumn('id', 'ID', 'center', 20);
  118. $data_coig = new TDataGridColumn('data_coig', 'Data', 'left', 50);
  119. $data_coig->setTransformer(array($this, 'formatDate'));//chama a função de transformar data
  120. $hora = new TDataGridColumn('hora', 'Hora', 'left', 50);
  121. $hora->setTransformer(array($this, 'formatHora'));//chama a função de transformar hora
  122. $empreendimento_id = new TDataGridColumn('sigla_emp', 'Usina', 'center', 50);
  123. $aplicacao_id = new TDataGridColumn('sigla_apl', 'Aplicação', 'center', 50);
  124. $evento_aplicacao_id = new TDataGridColumn('evento', 'Ocorrência', 'left', 350);
  125. $obs = new TDataGridColumn('obs', 'Obs', 'left', 350);
  126. $evento_real_id = new TDataGridColumn('evento_real_id', 'Evento Real', 'left', 100);
  127. $validador = new TDataGridColumn('validador', 'Ok', 'center', 20);
  128. $id->setTransformer(array($this, 'formatRelevancia'));
  129. // add the columns to the DataGrid
  130. $this->datagrid->addColumn($id);
  131. $this->datagrid->addColumn($data_coig);
  132. $this->datagrid->addColumn($hora);
  133. $this->datagrid->addColumn($empreendimento_id);
  134. $this->datagrid->addColumn($aplicacao_id);
  135. $this->datagrid->addColumn($evento_aplicacao_id);
  136. $this->datagrid->addColumn($obs);
  137. $this->datagrid->addColumn($evento_real_id);
  138. $this->datagrid->addColumn($validador);
  139. // creates the datagrid column actions
  140. $order_id= new TAction(array($this, 'onReload'));
  141. $order_id->setParameter('order', 'id');
  142. $id->setAction($order_id);
  143. $order_data= new TAction(array($this, 'onReload'));
  144. $order_data->setParameter('order', 'data_coig');
  145. $data_coig->setAction($order_data);
  146. $order_usina= new TAction(array($this, 'onReload'));
  147. $order_usina->setParameter('order', 'sigla_emp');
  148. $empreendimento_id->setAction($order_usina);
  149. $order_evento= new TAction(array($this, 'onReload'));
  150. $order_evento->setParameter('order', 'evento');
  151. $evento_aplicacao_id->setAction($order_evento);
  152. // create the datagrid model
  153. $this->datagrid->createModel();
  154. // creates the page navigation
  155. $this->pageNavigation = new TPageNavigation;
  156. $this->pageNavigation->setAction(new TAction(array($this, 'onReload')));
  157. $this->pageNavigation->setWidth($this->datagrid->getWidth());
  158. $table = new TTable;
  159. $table->style = 'width: 800px';
  160. $table->addRow()->addCell(new TXMLBreadCrumb('menu.xml', __CLASS__));
  161. $table->addRow()->addCell($this->form);
  162. //$table->addRow()->addCell($this->datagrid);
  163. //----botão salvar----------
  164. $save_button = TButton::create('save', array($this, 'onSave'), ('Salvar'), 'ico_save.png');
  165. $this->form->addField($save_button);
  166. $buttons_box1 = new THBox;
  167. $buttons_box1->add($save_button);
  168. $row = $table->addRow()->addCell($buttons_box1);
  169. $row->class = 'tformaction'; // CSS class
  170. //navegador de paginas
  171. $row = $table->addRow()->addCell($this->pageNavigation);
  172. parent::add($table);
  173. }
  174. //funções para formatar data e formatar hora
  175. public function formatDate($data_ocorrencia, $object)
  176. {
  177. $dt = new DateTime($data_ocorrencia);
  178. return $dt->format('d/m/y');
  179. }
  180. public function formatHora($hora, $object)
  181. {
  182. $dt = new DateTime($hora);
  183. return $dt->format('H:i:s');
  184. }
  185. //transformar a linha "colorir as mais relevantes"
  186. public function formatRelevancia($id, $object, $row)
  187. {
  188. if (PHP_SAPI !== 'cli') // just in the web version
  189. {
  190. if ($object->relevancia_id == 2)
  191. {
  192. $row->style = "color: blue";//relevancia media
  193. //return $relevancia_id;
  194. }
  195. elseif($object->relevancia_id == 3)
  196. {
  197. $row->style = "color: red";//relevancia alta
  198. //return $relevancia_id;
  199. }
  200. else
  201. {
  202. $row->style = "color: black";//relevancia normal 'background'
  203. }
  204. return $id;
  205. }
  206. }
  207. //função para salvar
  208. public function onSave($param)
  209. {
  210. try{
  211. // get the form data into an active record Coig
  212. $dados = $this->form->getData();
  213. $this->form->setData($dados);
  214. $mensagem = '';
  215. $checkbox = new stdClass();
  216. foreach($this->form->getFields() as $name => $field){
  217. TTransaction::open('sqlserver'); // open a transaction
  218. $objeto = new ViewOcorrenciasGerais();
  219. if ($field instanceof TCheckButton){
  220. $mensagem .= "<br>$name: " . $field->getValue();
  221. $valor = $field->getValue();
  222. $id = explode("r_", $name);
  223. if ($valor == 'on'){
  224. $checkbox->id = $id[1];
  225. $checkbox->validador = 1;
  226. }else{
  227. $checkbox->id = $id[1];
  228. $checkbox->validador = null;
  229. }
  230. }
  231. if ($field instanceof TDBCombo){
  232. $id = explode("d_", $name);
  233. if (! empty($id[1])){
  234. $mensagem .= "<br>$name: " . $field->getValue();
  235. $valor = $field->getValue();
  236. $id = explode("d_", $name);
  237. $objeto->id = $id[1];
  238. $objeto->evento_real_id = $valor;
  239. if ($checkbox->id == $objeto->id){
  240. $coig = new ViewOcorrenciasGerais($objeto->id);
  241. if ($coig->indicadorCoig == 1 and (empty($valor) xor empty($checkbox->validador))){
  242. throw new Exception("O campo 'EVENTO REAL' é obrigatorio para a ocorrêcnia, <b><span style='color:red'> Nº: $objeto->id </span></b>!");
  243. } else {
  244. $objeto->validador = $checkbox->validador;
  245. $objeto->store();
  246. TTransaction::close();
  247. }
  248. }
  249. }
  250. }
  251. }
  252. // show the message
  253. new TMessage('info', 'Dados gravados com sucesso!');
  254. //TApplication::loadPage('ValCoig');
  255. }
  256. catch (Exception $e) // in case of exception
  257. {
  258. new TMessage('error', '<b>Error</b> ' . $e->getMessage());
  259. TTransaction::rollback();
  260. }
  261. }
  262. function onReload($param = NULL)
  263. {
  264. try
  265. {
  266. // open a transaction with database 'sqlserver'
  267. TTransaction::open('sqlserver');
  268. $data = $this->form->getData();
  269. $form = new stdClass();
  270. $form->id = $data->id;
  271. $form->data_coig = $data->data_coig;
  272. $form->empreendimento_id = $data->empreendimento_id;
  273. $form->aplicacao_id = $data->aplicacao_id;
  274. $form->evento_aplicacao_id = $data->evento_aplicacao_id;
  275. $form->tipousina = $data->tipousina;
  276. $form->indicadorCoig = $data->indicadorCoig;
  277. $form->obs = $data->obs;
  278. $form->relevancia_id = $data->relevancia_id;
  279. $form->systemuser_id = $data->systemuser_id;
  280. $this->form->setData($form);
  281. TForm::sendData('form_search_ValCoig', $form);
  282. // creates a repository for Coig
  283. $repository = new TRepository('ViewOcorrenciasGerais');
  284. $limit = 30;
  285. // creates a criteria
  286. $criteria = new TCriteria;
  287. // default order
  288. if (! empty($param['order']))
  289. {
  290. $param['order'] = 'id';
  291. }
  292. $criteria->setProperties($param); // order, offset
  293. $criteria->setProperty('limit', $limit);
  294. if (isset($data->tipousina) AND ($data->tipousina)) {
  295. $criteria->add( new TFilter( 'sigla_emp', 'like', "{$data->tipousina}%" ));
  296. }
  297. if (isset($data->id) AND ($data->id)) {
  298. $criteria->add( new TFilter( 'id', '=', $data->id ));
  299. }
  300. if (isset($data->data_coig) AND ($data->data_coig)) {
  301. $criteria->add( new TFilter( 'data_coig', 'like', "%{$data->data_coig}%" ));
  302. }
  303. if (isset($data->empreendimento_id) AND ($data->empreendimento_id)) {
  304. $criteria->add( new TFilter( 'empreendimento_id', '=', $data->empreendimento_id ));
  305. }
  306. if (isset($data->aplicacao_id) AND ($data->aplicacao_id)) {
  307. $criteria->add( new TFilter( 'aplicacao_id', '=', $data->aplicacao_id ));
  308. }
  309. if (isset($data->evento_aplicacao_id) AND ($data->evento_aplicacao_id)) {
  310. $criteria->add( new TFilter( 'evento_aplicacao_id', '=', $data->evento_aplicacao_id ));
  311. }
  312. if (isset($data->nivel_montante) AND ($data->nivel_montante)) {
  313. $criteria->add( new TFilter( 'nivel_montante', 'like', "%{$data->nivel_montante}%" ));
  314. }
  315. if (isset($data->obs) AND ($data->obs)) {
  316. $criteria->add( new TFilter( 'obs', 'like', "%{$data->obs}%"));
  317. }
  318. if (isset($data->systemuser_id) AND ($data->systemuser_id)) {
  319. $criteria->add( new TFilter( 'systemuser_id', '=', "$data->systemuser_id" ));
  320. }
  321. if (isset($data->relevancia_id) AND ($data->relevancia_id)) {
  322. $criteria->add( new TFilter( 'relevancia_id', '=', "$data->relevancia_id" ));
  323. }
  324. if (isset($data->indicadorCoig) AND ($data->indicadorCoig)) {
  325. $criteria->add( new TFilter( 'indicadorCoig', '=', $data->indicadorCoig ));
  326. }
  327. if (empty($param['order'])){
  328. $param['order'] = 'horario_coig';
  329. $param['direction'] = 'desc';
  330. $criteria->setProperties($param);
  331. }
  332. // load the objects according to criteria
  333. $objects = $repository->load($criteria, FALSE);
  334. $this->datagrid->clear();
  335. if ($objects)
  336. {
  337. // iterate the collection of active records
  338. foreach ($objects as $object)
  339. {
  340. $eventoID = $object->evento_real_id;
  341. $valido = $object->validador;
  342. //var_dump($eventoID);
  343. $object->validador = new TCheckButton("validador_".$object->id);
  344. $object->validador->setIndexValue('on');
  345. if ($valido == 1){
  346. $object->validador->setProperty('checked', 1);
  347. }
  348. $object->evento_real_id = new TDBCombo('evento_real_id_'.$object->id,'sqlserver','EventoReal','id','evento');
  349. $object->evento_real_id->setValue($eventoID);
  350. // add the object inside the datagrid
  351. $row = $this->datagrid->addItem($object);
  352. //formata os horarios de postagem e edição
  353. $object->agora = date("d/m/y H:i:s", strtotime($object->agora));
  354. $object->data_edicao = date("d/m/y H:i:s", strtotime($object->data_edicao));
  355. //coloca os itens em popover
  356. $tabela = "<table class='popover-table'>";
  357. if ($object->potencia or $object->nivel_montante){
  358. $tabela .= "<tr><td><b>Potência Ativa:</b> {$object->potencia}</td><td><b>Nível montante:</b> {$object->nivel_montante}</td></tr>";
  359. }
  360. $tabela .= "<tr><td><b>Postado por:</b> {$object->user_post}</td><td> {$object->agora}</td></tr>";
  361. if ($object->editor){
  362. $tabela .= "<tr><td><b>Editado por:</b> {$object->editor}</td><td> {$object->data_edicao}</td></tr>";
  363. }
  364. $tabela .= "</table>";
  365. //coloca os itens em popover
  366. $row->popover = 'true';
  367. $row->popcontent = $tabela;
  368. $row->poptitle = 'Detalhes';
  369. $row = $this->form->addField($object->validador);
  370. $row = $this->form->addField($object->evento_real_id);
  371. }
  372. }
  373. // reset the criteria for record count
  374. $criteria->resetProperties();
  375. $count= $repository->count($criteria);
  376. $this->pageNavigation->setCount($count); // count of records
  377. $this->pageNavigation->setProperties($param); // order, page
  378. $this->pageNavigation->setLimit($limit); // limit
  379. // close the transaction
  380. TTransaction::close();
  381. $this->loaded = true;
  382. }
  383. catch (Exception $e) // in case of exception
  384. {
  385. // shows the exception error message
  386. new TMessage('error', '<b>Error</b> ' . $e->getMessage());
  387. // undo all pending operations
  388. TTransaction::rollback();
  389. }
  390. }
  391. function show()
  392. {
  393. // check if the datagrid is already loaded
  394. if (!$this->loaded AND (!isset($_GET['method']) OR $_GET['method'] !== 'onReload') )
  395. {
  396. $this->onReload( func_get_arg(0) );
  397. }
  398. parent::show();
  399. }
  400. //função para carregar as aplicações 'equipamentos'
  401. public static function onChange($param)
  402. {
  403. TTransaction::open('sqlserver');
  404. $criteria = new TCriteria;
  405. $criteria->add(new TFilter('empreendimento_id', '=', $param['empreendimento_id']));
  406. //$criteria->add(new TFilter('aplicacao', 'like', '%gerador%'));
  407. $repository = new TRepository('ViewEmpreendimentos');
  408. $aplicacaos = $repository->load($criteria);
  409. $options = array();
  410. $options[] = '' ;
  411. foreach ($aplicacaos as $aplicacao){
  412. $options[$aplicacao->id] = $aplicacao->sigla;
  413. }
  414. //TForm::sendData('form_Vertedouro', $objeto);
  415. TCombo::reload('form_search_ValCoig', 'aplicacao_id', $options);
  416. }
  417. //função para carregar as ocorrencias dos geradores
  418. public static function onChange2($param)
  419. {
  420. TTransaction::open('sqlserver');
  421. $criteria = new TCriteria;
  422. @$criteria->add(new TFilter('aplicacao_id', '=', $param['aplicacao_id']));
  423. $repository = new TRepository('ViewAplicacao');
  424. $eventos = $repository->load($criteria);
  425. $options = array();
  426. $options[] = '' ;
  427. foreach ($eventos as $evento){
  428. $options[$evento->id] = $evento->evento;
  429. }
  430. //TForm::sendData('form_Vertedouro', $objeto);
  431. TCombo::reload('form_search_ValCoig', 'evento_aplicacao_id', $options);
  432. }
  433. }
  434. ?>
EB

Olá Betuel.

Vi que nesse seu código você utiliza combos dinâmicas! Estou enfrentando um problema com a utilização de combos dinâmicas, onde já bati pra todo lado e nunca consegui pra funcionar.

É possível você me dar uma força? Eu já postei o problema aqui no fórum, onde inclusive você fez um comentário lá, mas ainda assim não obtive sucesso...

Este é o link do meu post onde anexei o meu código: www.adianti.com.br/forum/pt/view_1829?tcombo-dinamica

Qualquer coisa pode entrar em contato comigo por email também
email: edilanebzrra@gmail.com