Mover Scroll do Data Grid Pessoal estou tentando via JavaScript mover o scroll do data grid porém estou pecando em algo o código que estou usando é esse: ...
FC
Mover Scroll do Data Grid  
Fechado
Pessoal estou tentando via JavaScript mover o scroll do data grid porém estou pecando em algo o código que estou usando é esse:
 
  1. <?php
  2. TScript::create("
  3. $('#tdatagrid_table').attr({scrollTop: $('#tdatagrid_table').attr('scrollHeight')});
  4. ");
  5. ?>

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


FC

Consegui fica aqui para caso alguém precise.

TScript::create("

$('#tdatagrid_body').scrollTop(800);

");
RC

Valeu a dica
RC

Felipe. Em que parte do código deve ser colocado esse script? Seria no método construtor?
FC

No meu caso coloco no onSeach antes do onReload ele faz o scroll descer ainda falta eu descobrir uma forma de recuperar o valor do scrollTop para quando eu atualizar ele retornar o scroll para a posição que estava.

Tem que colocar o id na classe TDataGrid senão dá erro.
FC

Primeiro vamos entender minha necessidade tenho um data grid onde é feito lançamentos mensais e existe atualizações manual que é um saco ficar rolando o scroll dessa forma.

Vamos ao passos:

1 - Na classe TDataGrid incluido o id tdatagrid_body. //não recomendo mexer no core o ideal é criar outra classe.

2 - Criado o campo THilden na classe do DataGrid

3 - Criado o código java que vai pegar onde o scroll parou.
Pode ser incluído em qualquer parte dentro da classe


 
  1. <?php
  2. TScript::create('
  3. var TO = false;
  4. var scroll_static = true;
  5. $(\\'#tdatagrid_body\\').scroll(function(){
  6. if( scroll_static ){
  7. //console.log(\\'start scrolling\\');
  8. scroll_static = false;
  9. }
  10. if(TO !== false){ clearTimeout(TO); }
  11. TO = setTimeout(myfunction, 200);
  12. });
  13. function myfunction(){
  14. scroll_static = true;
  15. var x = $(\\'#tdatagrid_body\\').scrollTop();
  16. //console.log(x);
  17. $("input[name=\\'scroll\\']").val(x);
  18. }
  19. ');
  20. }
  21. ?>


Depois no onSearch
 
  1. <?php
  2. $data = $this->form->getData();
  3. TSession::setValue('varscroll',$data->scroll);
  4. ?>


Para Finalizar no onReload
 
  1. <?php
  2. $varscroll = TSession::getValue('varscroll');
  3. TScript::create("
  4. $('#tdatagrid_body').scrollTop({$varscroll});
  5. ");
  6. ?>


AM

Eu fiz e deu errado. Onde eu coloco esse código que vc postou acima?
 
  1. <?php
  2. TScript::create('
  3. ====================
  4. Outra coisa, nessa última postagem, pq vc não falou nada a respeito do código abaixo?
  5. TScript::create("
  6. $('#tdatagrid_body').scrollTop(800);
  7. ");
  8. Ainda usa-se o código acima?
  9. ==========================
  10. Outra coisa, o meu datagrid já mostra a numeração de páginas no rodapé, e eu gero com o assistente do adianti pro 2.0, é necessário mover esta barra scroll? E pq no meu datagrid não aparece esta barra?
AM

Ai está todo o meu código da consulta ou pesquisa, como eu uso este código para exibir a barra e mover o scroll do datagrid? Dá para postar o mesmo código acima com as alterações?

==================================
 
  1. <?php
  2. class SalarioList extends TPage
  3. {
  4. private $form; // formulário de registro
  5. private $datagrid; // listagem
  6. private $pageNavigation;
  7. private $loaded;
  8. public function __construct()
  9. {
  10. parent::__construct();
  11. // Executa um script que substitui o Tab pelo Enter.
  12. parent::include_js('app/lib/include/application.js');
  13. // Set focus no campo especificado
  14. TScript::create('setTimeout(function() { $("input[name=\'id\']").focus() }, 500);');
  15. // ccria o formulário
  16. $this->form = new TForm('form_search_Salario');
  17. $this->form->class = 'tform'; // CSS class
  18. // cria a tabela
  19. $table = new TTable;
  20. $table-> width = '100%';
  21. $this->form->add($table);
  22. // adicionar uma linha para o título do formulário
  23. $row = $table->addRow();
  24. $row->class = 'tformtitle'; // CSS class
  25. $row->addCell( new TLabel('Preencha um dos campos para pesquisa') )->colspan = 2;
  26. // criar os campos do formulário
  27. $id = new TEntry('id');
  28. $nome = new TEntry('nome');
  29. $empresa = new TEntry('empresa');
  30. // definir os tamanhos dos campos
  31. $id->setSize(50);
  32. $nome->setSize(540);
  33. $empresa->setSize(540);
  34. // Número de Caracteres permitidos dentro dos campos
  35. $id->setMaxLength(7);
  36. $nome->setMaxLength(60);
  37. $empresa->setMaxLength(60);
  38. // adiciona uma linha para cada campo de formulário
  39. $table->addRowSet( new TLabel('Código:'), $id );
  40. $table->addRowSet( new TLabel('Nome do Empregado:'), $nome );
  41. $table->addRowSet( new TLabel('Nome da Empresa:'), $empresa );
  42. $this->form->setFields(array($id,$nome,$empresa));
  43. // manter o formulário preenchido durante a navegação com dados da sessão
  44. $this->form->setData( TSession::getValue('Salario_filter_data') );
  45. // criar botões de ação para o formulário
  46. $find_button = TButton::create('find', array($this, 'onSearch'), _t('Find'), 'ico_find.png');
  47. // $new_button = TButton::create('new', array('SalarioForm', 'onEdit'), _t('New'), 'ico_new.png');
  48. $list_button = TButton::create('list', array('SalarioList', 'onReload'), ('Limpar Campos'), 'ico_ok.png');
  49. $tudo_button = TButton::create('tudo', array('SalarioList', 'onTudo'), ('Excluir Tudo'), 'ico_delete.png');
  50. $export_button = TButton::create('export', array('SalarioList', 'onExportCSV'), ('Exportar'), 'ico_print.png');
  51. $ajuda_button = TButton::create('ajuda', array('Ajuda', 'onShow'), ('Ajuda'), 'ico_question.png');
  52. $this->form->addField($find_button);
  53. // $this->form->addField($new_button);
  54. $this->form->addField($list_button);
  55. $this->form->addField($tudo_button);
  56. $this->form->addField($export_button);
  57. $this->form->addField($ajuda_button);
  58. $buttons_box = new THBox;
  59. $buttons_box->add($find_button);
  60. // $buttons_box->add($new_button);
  61. $buttons_box->add($list_button);
  62. $buttons_box->add($tudo_button);
  63. $buttons_box->add($export_button);
  64. $buttons_box->add($ajuda_button);
  65. // adicionar uma linha para a ação de formulário
  66. $row = $table->addRow();
  67. $row->class = 'tformaction'; // CSS class
  68. $row->addCell($buttons_box)->colspan = 2;
  69. // cria a datagrid
  70. $this->datagrid = new TDataGrid;
  71. $this->datagrid->setHeight(320);
  72. // cria as colunas datagrid
  73. $id = new TDataGridColumn('id', 'Código', 'center', 7);
  74. $nome = new TDataGridColumn('nome', 'Nome do Empregado', 'left', 250);
  75. $empresa = new TDataGridColumn('empresa', 'Nome da Empresa', 'left', 250);
  76. // adicionar as colunas para o DataGrid
  77. $this->datagrid->addColumn($id);
  78. $this->datagrid->addColumn($nome);
  79. $this->datagrid->addColumn($empresa);
  80. // cria as ações na colunas datagrid
  81. $order_id= new TAction(array($this, 'onReload'));
  82. $order_id->setParameter('order', 'id');
  83. $id->setAction($order_id);
  84. $order_nome= new TAction(array($this, 'onReload'));
  85. $order_nome->setParameter('order', 'nome');
  86. $nome->setAction($order_nome);
  87. $order_empresa= new TAction(array($this, 'onReload'));
  88. $order_empresa->setParameter('order', 'empresa');
  89. $empresa->setAction($order_empresa);
  90. // cria duas ações datagrid
  91. $action1 = new TDataGridAction(array('SalarioForm', 'onEdit'));
  92. $action1->setLabel(_t('Edit'));
  93. $action1->setImage('ico_edit.png');
  94. $action1->setField('id');
  95. $action2 = new TDataGridAction(array($this, 'Delete'));
  96. $action2->setLabel(_t('Delete'));
  97. $action2->setImage('ico_delete.png');
  98. $action2->setField('id');
  99. // adicionar as ações para o datagrid
  100. $this->datagrid->addAction($action1);
  101. $this->datagrid->addAction($action2);
  102. // criar o modelo datagrid
  103. $this->datagrid->createModel();
  104. // cria a navegação de página
  105. $this->pageNavigation = new TPageNavigation;
  106. $this->pageNavigation->setAction(new TAction(array($this, 'onReload')));
  107. $this->pageNavigation->setWidth($this->datagrid->getWidth());
  108. // criar o contêiner página
  109. $container = TVBox::pack( $this->form, $this->datagrid, $this->pageNavigation);
  110. parent::add($container);
  111. }
  112. function onSearch()
  113. {
  114. // obter os dados de formulário de pesquisa
  115. $data = $this->form->getData();
  116. // filtros de sessão clear
  117. TSession::setValue('SalarioList_filter_id', NULL);
  118. TSession::setValue('SalarioList_filter_nome', NULL);
  119. TSession::setValue('SalarioList_filter_empresa', NULL);
  120. if (isset($data->id) AND ($data->id)) {
  121. $filter = new TFilter('id', 'like', "%{$data->id}%"); // criar o filtro
  122. TSession::setValue('SalarioList_filter_id', $filter); // armazena o filtro na sessão
  123. }
  124. if (isset($data->nome) AND ($data->nome)) {
  125. $filter = new TFilter('nome', 'like', "%{$data->nome}%"); // criar o filtro
  126. TSession::setValue('SalarioList_filter_nome', $filter); // armazena o filtro na sessão
  127. }
  128. if (isset($data->empresa) AND ($data->empresa)) {
  129. $filter = new TFilter('empresa', 'like', "%{$data->empresa}%"); // criar o filtro
  130. TSession::setValue('SalarioList_filter_empresa', $filter); // armazena o filtro na sessão
  131. }
  132. // preencher o formulário com os dados novamente
  133. $this->form->setData($data);
  134. // manter os dados de pesquisa na sessão
  135. TSession::setValue('Salario_filter_data', $data);
  136. $param=array();
  137. $param['offset'] =0;
  138. $param['first_page']=1;
  139. $this->onReload($param);
  140. }
  141. function onReload($param = NULL)
  142. {
  143. try
  144. {
  145. // abrir uma transação com banco de dados 'dbsalario'
  146. TTransaction::open('dbsalario');
  147. // cria um repositório para Salario
  148. $repository = new TRepository('Salario');
  149. $limit = 10;
  150. // cria um critério
  151. $criteria = new TCriteria;
  152. // ordem padrão
  153. if (empty($param['order']))
  154. {
  155. $param['order'] = 'id';
  156. $param['direction'] = 'asc';
  157. }
  158. $criteria->setProperties($param); // ordem, offset
  159. $criteria->setProperty('limit', $limit);
  160. if (TSession::getValue('SalarioList_filter_id')) {
  161. $criteria->add(TSession::getValue('SalarioList_filter_id')); // adicionar o filtro da sessão
  162. }
  163. if (TSession::getValue('SalarioList_filter_nome')) {
  164. $criteria->add(TSession::getValue('SalarioList_filter_nome')); // adicionar o filtro da sessão
  165. }
  166. if (TSession::getValue('SalarioList_filter_empresa')) {
  167. $criteria->add(TSession::getValue('SalarioList_filter_empresa')); // adicionar o filtro da sessão
  168. }
  169. // carregar os objectos de acordo com critérios
  170. $objects = $repository->load($criteria, FALSE);
  171. $this->datagrid->clear();
  172. $this->form->clear();
  173. if ($objects)
  174. {
  175. // iterar a coleção de registros ativos
  176. foreach ($objects as $object)
  177. {
  178. // adicionar o objeto dentro do datagrid
  179. $this->datagrid->addItem($object);
  180. }
  181. }
  182. // redefinir os critérios para a contagem de registro
  183. $criteria->resetProperties();
  184. $count= $repository->count($criteria);
  185. $this->pageNavigation->setCount($count); // contagem de registros
  186. $this->pageNavigation->setProperties($param); // ordem, página
  187. $this->pageNavigation->setLimit($limit); // limite
  188. // fechar a transacção
  189. TTransaction::close();
  190. $this->loaded = true;
  191. }
  192. catch (Exception $e) // em caso de excepção
  193. {
  194. // mostra a mensagem de erro de exceção
  195. new TMessage('error', '<b>Error</b> ' . $e->getMessage());
  196. // desfazer todas as operações pendentes
  197. TTransaction::rollback();
  198. }
  199. }
  200. function onExportCSV()
  201. {
  202. $this->onSearch();
  203. try
  204. {
  205. // open a transaction with database 'dbsalario'
  206. TTransaction::open('dbsalario');
  207. // creates a repository for Salario
  208. $repository = new TRepository('Salario');
  209. // creates a criteria
  210. $criteria = new TCriteria;
  211. if (TSession::getValue('salario_filter1'))
  212. {
  213. // add the filter stored in the session to the criteria
  214. $criteria->add(TSession::getValue('salario_filter1'));
  215. }
  216. if (TSession::getValue('salario_filter2'))
  217. {
  218. // add the filter stored in the session to the criteria
  219. $criteria->add(TSession::getValue('salario_filter2'));
  220. }
  221. $csv = '';
  222. // load the objects according to criteria
  223. $salarios = $repository->load($criteria);
  224. if ($salarios)
  225. {
  226. $csv .= utf8_decode('Código').';'.
  227. utf8_decode('Empregado').';'.
  228. utf8_decode('Empresa')."\n";
  229. foreach ($salarios as $salario)
  230. {
  231. $csv .= $salario->id.';'.
  232. utf8_decode($salario->nome).';'.
  233. utf8_decode($salario->empresa)."\n";
  234. }
  235. file_put_contents('app/output/salarios.csv', $csv);
  236. TPage::openFile('app/output/salarios.csv');
  237. }
  238. // close the transaction
  239. TTransaction::close();
  240. }
  241. catch (Exception $e) // in case of exception
  242. {
  243. // shows the exception error message
  244. new TMessage('error', '<b>Error</b> ' . $e->getMessage());
  245. // undo all pending operations
  246. TTransaction::rollback();
  247. }
  248. }
  249. /*
  250. Se for incluir pergunta antes de excluir um registro,
  251. então, acione esta função abaixo, e depois lá em cima,
  252. nos botões de ações, substitua: (delete) por (ondelete).
  253. function onDelete($param)
  254. {
  255. // definir a ação de exclusão
  256. $action = new TAction(array($this, 'Delete'));
  257. $action->setParameters($param); // pass the key parameter ahead
  258. // mostra uma caixa de diálogo para o usuário
  259. new TQuestion(TAdiantiCoreTranslator::translate('Do you really want to delete ?'), $action);
  260. }
  261. */
  262. function Delete($param)
  263. {
  264. try
  265. {
  266. $key=$param['key']; // obter o parâmetro $key
  267. TTransaction::open('dbsalario'); // abrir uma transação com banco de dados
  268. $object = new Salario($key, FALSE); // instancia o Active Record
  269. $object->delete(); //exclui o objeto do banco de dados
  270. TTransaction::close(); // fechar a transacção
  271. $this->onReload( $param ); // recarregar a listagem
  272. // new TMessage('info', TAdiantiCoreTranslator::translate('Registro Excluído')); // mensagem de sucesso
  273. }
  274. catch (Exception $e) // em caso de excepção
  275. {
  276. new TMessage('error', '<b>Error</b> ' . $e->getMessage()); // mostra a mensagem de erro de exceção
  277. TTransaction::rollback(); // desfazer todas as operações pendentes
  278. }
  279. }
  280. function onTudo($param)
  281. {
  282. $action = new TAction(array($this, 'Tudo'));
  283. $action->setParameters($param);
  284. new TQuestion('Deseja Excluir Todos os Registros?', $action);
  285. }
  286. public function Tudo( $param )
  287. {
  288. try
  289. {
  290. TTransaction::open('dbsalario');
  291. $repository = new TRepository('Salario');
  292. $repository->delete();
  293. // new TMessage('info', 'Todos os Registros foram Excluidos.');
  294. TTransaction::close();
  295. $this->onReload();
  296. }
  297. catch (Exception $e)
  298. {
  299. new TMessage('error', '<b>Error</b> ' . $e->getMessage());
  300. TTransaction::rollback();
  301. }
  302. }
  303. function show()
  304. {
  305. // verificar se o datagrid já está carregado
  306. if (!$this->loaded AND (!isset($_GET['method']) OR $_GET['method'] !== 'onReload') )
  307. {
  308. $this->onReload( func_get_arg(0) );
  309. }
  310. parent::show();
  311. }
  312. }
PD

No layout.html do tutor tem um código que faz a rolagem ir para o topo sempre que uma página é trocada.
Como a carga das páginas é por Ajax, às vezes a rolagem fica na parte de baixo da página, então isso ajuda:

Adianti.onBeforeLoad = function(url)
{
$("html, body").animate({ scrollTop: 0 }, "fast");
};