Dificuldade em manter botões acima da grid Olá Pessoal, Criei uma pagina com template html, e nesta página alterno entre grid fisico e juridico, porém ao navegar entre as paginações das grids estou tendo dificuldades em manter os botões de alternância e os titulos .na grid. Alguém pode me ajudar ? Segue código abaixo : ...
RB
Dificuldade em manter botões acima da grid  
Olá Pessoal,

Criei uma pagina com template html, e nesta página alterno entre grid fisico e juridico, porém ao navegar entre as paginações das grids estou tendo dificuldades em manter os botões de alternância e os titulos .na grid.

Alguém pode me ajudar ?

Segue código abaixo :

<!--[main]-->
<link href="app/resources/styles.css" rel="stylesheet" type="text/css" media="screen" />

<table class="customform" style="width: 100%">
<!--[object]-->
<tr>
<td colspan="2">{$widget}</td>
</tr>
<!--[/object]-->
</table>
<!--[/main]-->

Classe cliente
 
  1. <?php
  2. class Cliente extends TPage
  3. {
  4. /**
  5. * Constructor method
  6. */
  7. protected $hbox_actions;
  8. protected $container;
  9. public function __construct()
  10. {
  11. parent::__construct();
  12. $link1 = new TActionLink('Físico', new TAction(array($this, 'onFisico')), 'green', 10, null, 'fa:search');
  13. $link2 = new TActionLink('Jurídico', new TAction(array($this, 'onJuridico')), 'blue', 10, null, 'fa:search');
  14. $link1->class = 'btn btn-default';
  15. $link2->class = 'btn btn-default';
  16. $this->hbox_actions = THBox::pack($link1,$link2);
  17. try
  18. {
  19. // create the HTML Renderer
  20. $this->html = new THtmlRenderer('app/view/clienteRender.html');
  21. $this->onFisico();
  22. // define replacements for the main section
  23. $replace = array();
  24. // replace the main section variables
  25. $this->html->enableSection('main', $replace);
  26. // Table wrapper (form and HTML)
  27. $this->container = new TVBox;
  28. $this->container->style = 'width:100%';
  29. $this->container->add(new TXMLBreadCrumb('menu.xml', __CLASS__));
  30. $this->container->add($this->hbox_actions);
  31. $this->container->add($this->html);
  32. parent::add($this->container);
  33. }
  34. catch (Exception $e)
  35. {
  36. new TMessage('error', $e->getMessage());
  37. }
  38. }
  39. /**
  40. * Executed when the user clicks at the action1 button
  41. */
  42. public function onFisico()
  43. {
  44. $datagrid = new DataGridClienteFisico;
  45. $str = get_class($datagrid);
  46. $replace = array();
  47. $replace['widget'] = $datagrid;
  48. $replace['class'] = get_class($datagrid);
  49. $replace['cliente'] = substr($str,15);
  50. //replace the object section variables
  51. $this->html->enableSection('object', $replace);
  52. }
  53. /**
  54. * Executed when the user clicks at the action2 button
  55. */
  56. public function onJuridico()
  57. {
  58. $datagrid = new DataGridClienteJuridico;
  59. $str = get_class($datagrid);
  60. $replace = array();
  61. $replace['widget'] = $datagrid;
  62. $replace['class'] = get_class($datagrid);
  63. $replace['cliente'] = substr($str,15);
  64. // replace the object section variables
  65. $this->html->enableSection('object', $replace);
  66. }
  67. }
  68. ?>


Estrutura grid
 
  1. <?php
  2. class DataGridClienteJuridico extends TPage
  3. {
  4. private $datagrid, $pageNavigation, $loaded;
  5. private static $db = 'db';
  6. public function __construct()
  7. {
  8. parent::__construct();
  9. // creates one datagrid
  10. $this->datagrid = new BootstrapDatagridWrapper(new TDataGrid);
  11. $this->datagrid->width = '100%';
  12. // add the columns
  13. $this->datagrid->addColumn(new TDataGridColumn('pessoa_id','#','center',''));
  14. $cnpj = $this->datagrid->addColumn(new TDataGridColumn('pessoa->juridica->cnpj','CNPJ','left',''));
  15. $data_cadastro = $this->datagrid->addColumn(new TDataGridColumn('pessoa->juridica->razao_social','Razão Social','left',''));
  16. $nome_fantasia = $this->datagrid->addColumn(new TDataGridColumn('pessoa->juridica->nome_fantasia','Nome Fantasia','left',''));
  17. $unidade = $this->datagrid->addColumn(new TDataGridColumn('pessoa->juridica->tipo->nome',_t('Unit'),'left',''));
  18. $atividade_principal = $this->datagrid->addColumn(new TDataGridColumn('pessoa->juridica->atividade_principal','Atividade Principal','left',''));
  19. $email = $this->datagrid->addColumn(new TDataGridColumn('pessoa->juridica->email','Email','left',''));
  20. $cidade = $this->datagrid->addColumn(new TDataGridColumn('pessoa_endereco->endereco->estado->nome','Cidade','left',''));
  21. $uf = $this->datagrid->addColumn(new TDataGridColumn('pessoa_endereco->endereco->estado->uf','UF','left',''));
  22. $editar = $this->datagrid->addColumn(new TDataGridColumn('editar','','center'));
  23. $deletar = $this->datagrid->addColumn(new TDataGridColumn('deletar','','center'));
  24. $data_cadastro->enableAutoHide(500);
  25. $nome_fantasia->enableAutoHide(600);
  26. //$unidade->enableAutoHide(700);
  27. $atividade_principal->enableAutoHide(800);
  28. $email->enableAutoHide(900);
  29. $uf->enableAutoHide(1000);
  30. $cidade->enableAutoHide(1000);
  31. $uf->setDataProperty('style','font-weight: bold');
  32. // creates the datagrid model
  33. $this->datagrid->createModel();
  34. // creates the page navigation
  35. $this->pageNavigation = new TPageNavigation;
  36. $this->pageNavigation->setAction(new TAction([$this, 'onReload']));
  37. $this->pageNavigation->setWidth($this->datagrid->getWidth());
  38. $this->pageNavigation->enableCounters();
  39. // search box
  40. $input_search = new TEntry('input_search');
  41. $input_search->placeholder = _t('Search');
  42. $input_search->setSize('100%');
  43. // enable fuse search by column name
  44. $this->datagrid->enableSearch($input_search,'pessoa_id,pessoa->juridica->cnpj,pessoa->juridica->razao_social,pessoa->juridica->atividade_principal,pessoa->juridica->email,pessoa_endereco->endereco->estado->nome,pessoa_endereco->endereco->estado->uf');
  45. $panel = new TPanelGroup('{$cliente}');
  46. $panel->addHeaderWidget($input_search);
  47. $panel->add($this->datagrid)->style = 'overflow-x:auto';
  48. $panel->addFooter($this->pageNavigation);
  49. $link = new TActionLink('Incluir', new TAction(array('JuridicaForm', 'onClear')), 'white', 12, null, 'fa:plus-circle');
  50. $link->class = 'btn btn-default';
  51. $link->style .= ';margin: 10px 45% 0 45%;padding:3px 10px 5px 10px;heigth:25px;background:#112a47;color:#fff;text-shadow: 1px 1px #333;';
  52. // wrap the page content using vertical box
  53. $vbox = new TVBox;
  54. $vbox->style = 'width: 100%';
  55. //$vbox->add(new TXMLBreadCrumb('menu.xml',__CLASS__));
  56. $vbox->add($panel);
  57. $vbox->add($link);
  58. parent::add($vbox);
  59. }
  60. /**
  61. * method onReload()
  62. * Load the datagrid with the database objects
  63. */
  64. function onReload($param = NULL)
  65. {
  66. try
  67. {
  68. // open a transaction with database self::$db
  69. TTransaction::open(self::$db);
  70. // creates a repository for PessoaVinculo
  71. $repository = new TRepository('PessoaVinculo');
  72. $limit = 3;
  73. // creates a criteria
  74. $criteria = new TCriteria;$criteria->add(new TFilter('tipo_pessoa_id','=', 2));
  75. //$criteria->add(new TFilter('tipo_vinculo_id','=', 2));
  76. //$criteria->add(new TFilter('system_unit_id','=', TSession::getValue('userunitid')));
  77. $criteria->add(new TFilter('situacao_id', '=', 1));
  78. // default order
  79. if (empty($param['order']))
  80. {
  81. $param['order'] = 'pessoa_id';
  82. $param['direction'] = 'asc';
  83. }
  84. $criteria->setProperties($param); // order, offset
  85. $criteria->setProperty('limit', $limit);
  86. // load the objects according to criteria
  87. $objects = $repository->load($criteria);
  88. $this->datagrid->clear();
  89. if ($objects)
  90. {
  91. // iterate the collection of active records
  92. foreach ($objects as $object)
  93. {
  94. //cria os botões de ação e adiciona a datagrid
  95. $edit = new TElement('i');
  96. $edit->class="fa fa-search blue";
  97. $action = new TAction(['JuridicaForm','onEdit'],['pessoa_id'=>"$object->pessoa_id"]);
  98. $action->setParameter('key',$object->pessoa_id);
  99. $object->editar = $edit;
  100. $a = new TActionLink($edit, $action);
  101. $a->class = 'btn_transparent';
  102. $del = new TElement('i');
  103. $del->class ="fa fa-trash-alt red";
  104. $action1 = new TAction(array($this, 'onDelete'));
  105. $action1->setParameter('key',$object->pessoa_id);
  106. $object->deletar = $del;
  107. $b = new TActionLink($del, $action1);
  108. $b->class = 'btn_transparent';
  109. $object->editar = $a;
  110. $object->deletar = $b;
  111. $object->pessoa->juridica->cnpj = FuncoesUteis::formataString('cnpj',$object->pessoa->juridica->cnpj);
  112. // add the object inside the datagrid
  113. $this->datagrid->addItem($object);
  114. }
  115. }
  116. // reset the criteria for record count
  117. $criteria->resetProperties();
  118. $count = $repository->count($criteria);
  119. $this->pageNavigation->setCount($count); // count of records
  120. $this->pageNavigation->setProperties($param); // order, page
  121. $this->pageNavigation->setLimit($limit); // limit
  122. // close the transaction
  123. TTransaction::close();
  124. $this->loaded = true;
  125. }
  126. catch (Exception $e) // in case of exception
  127. {
  128. new TMessage('error', $e->getMessage()); // shows the exception error message
  129. TTransaction::rollback(); // undo all pending operations
  130. }
  131. }
  132. /**
  133. * Executed when the user clicks at the view button
  134. */
  135. public static function onView($param)
  136. {
  137. // get the parameter and shows the message
  138. $code = $param['pessoa_id'];
  139. $name = $param['pessoa->juridica->nome'];
  140. new TMessage('info', "The code is: <b>$code</b> <br> The name is : <b>$name</b>");
  141. }
  142. /**
  143. * Ask before deletion
  144. */
  145. public static function onDelete($param)
  146. {
  147. // define the delete action
  148. $action = new TAction(array(__CLASS__, 'Delete'));
  149. $action->setParameters($param); // pass the key parameter ahead
  150. // shows a dialog to the user
  151. new TQuestion(AdiantiCoreTranslator::translate('Do you really want to delete ?'), $action);
  152. }
  153. /**
  154. * Delete a record
  155. */
  156. public static function Delete($param)
  157. {
  158. try
  159. {
  160. $key = $param['key']; // get the parameter $key
  161. $system_unit_id = TSession::getValue('userunitid');
  162. TTransaction::open(self::$db); // open a transaction with database
  163. $cliente = PessoaVinculo::where('pessoa_id','=', $key)
  164. ->where('system_unit_id','=',$system_unit_id)
  165. ->set('situacao_id', 10)
  166. ->update();
  167. TTransaction::close(); // close the transaction
  168. $pos_action = new TAction([__CLASS__, 'onReload']);
  169. new TMessage('info', AdiantiCoreTranslator::translate('Record deleted'), $pos_action); // success message
  170. }
  171. catch (Exception $e) // in case of exception
  172. {
  173. new TMessage('error', $e->getMessage()); // shows the exception error message
  174. TTransaction::rollback(); // undo all pending operations
  175. }
  176. }
  177. /**
  178. * shows the page
  179. */
  180. function show()
  181. {
  182. $this->onReload();
  183. parent::show();
  184. }
  185. }

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


AC

Bom dia.

Costumo criar um form e adicionar pelo menos um THidden e os botões que preciso.
Ao incluir no container, no final do código do constructor, tenha a atenção de colocar os componentes (form e grid) na ordem em que deseja que apareçam.
Se o espaço referente ao form ficar ocupando mais espaço do que deveria: css nele.
Contudo, creio ter visto um exemplo desse mesmo estilo que necessita no Tutor. Dê uma olhada lá.
Espero ter ajudado.
NR

Quem adiciona os botões na parte superior é a classe Cliente, mas ao usar a paginação é chamada diretamente a classe da grid, desse modo a tela é recarregada somente com a renderização da grid.

Você pode usar a função setTargetContainer pra fazer com que somente uma parte da tela seja recarregada. Veja o exemplo do tutor:
adianti.com.br/framework_files/tutor/index.php?class=InboxView