LS
Paginação Mongodb com adianti
Estou desenvolvendo um código com o mongodb. E eu não estou conseguindo fazer a paginação. Já tentei algumas pesquisas, mas não deu muito certo.
Segue abaixo meu código:
Mongodb versão 5
- <?php
- /**
- * TelaCPFNomeList Listing
- * @author <your name here>
- */
- class TelaCPFNomeList extends TPage
- {
- protected $form; // registration form
- protected $datagrid; // listing
- protected $pageNavigation;
- protected $formgrid;
- protected $deleteButton;
- protected $transformCallback;
- private $properties;
- /**
- * Class constructor
- * Creates the page, the form and the listing
- */
- public function __construct()
- {
- parent::__construct();
- try
- {
- // creates the form
- $this->form = new BootstrapFormBuilder('form_search_TelaCPFNome');
- $this->form->setFormTitle('Lista CPF E Nome MongoDB');
- // create the form fields
- $nome = new TEntry('nome');
- $nome->forceUpperCase();
- $nome->setMaxLength(100);
- $cpf = new TEntry('cpf');
- $cpf->setMask('999.999.999-99');
- $cpf->addValidation(('Regex Format'), new TRequiredValidator);
- $inativa = new TCombo('inativa');
- $inativa->addItems(array( 'f' => ('Ativo'), 't' => ('Inativo')));
- $nome->setSize('100%');
- $cpf->setSize('100%');
- $inativa->setSize('100%');
- // add the fields
- $row = $this->form->addFields( [new TLabel('CPF', '', '14px', 'b', '100%'), $cpf] );
- $row->layout = ['col-sm-4','col-sm-4','col-sm-4'];
- $row = $this->form->addFields( [new TLabel('Nome', '', '14px', 'b', '100%'),$nome] );
- $row->layout = ['col-sm-8', 'col-sm-4'];
- $row = $this->form->addFields( [new TLabel('Situação', '', '14px', 'b', '100%'),$inativa] );
- $row->layout = ['col-sm-4', 'col-sm-4', 'col-sm-4'];
- // keep the form filled during navigation with session data
- $this->form->setData( TSession::getValue(__CLASS__.'_filter_data') );
- // add the search form actions
- $this->form->addAction(_t('New'), new TAction(array('TelaCPFNomeForm', 'onEdit')), 'fa:plus')->class = 'btn btn-sm btn-success';
- $this->form->addAction(_t('Find'), new TAction(array($this, 'onSearch')), 'fa:search')->class = 'btn btn-sm btn-primary';
- $this->form->addAction(_t('Clear'), new TAction(array($this, 'onClear')), 'fa:eraser')->class = 'btn btn-sm btn-warning';
- // creates a Datagrid
- $this->datagrid = new BootstrapDatagridWrapper(new TDataGrid);
- $this->datagrid->datatable = 'true';
- $this->datagrid->style = 'width: 100%';
- $this->datagrid->setHeight(320);
- // creates the datagrid columns
- //$column_id = new TDataGridColumn('id', 'ID', 'center');
- $column_cpf = new TDataGridColumn('cpf', 'CPF', 'center');
- $column_nome = new TDataGridColumn('nome', 'Nome', 'center');
- $column_inativa = new TDataGridColumn('inativa', _t('Status'), 'center');
- $column_inativa->setTransformer(function($value, $object, $row) {
- $class = ($value==false) ? 'success' : 'danger';
- $label = ($value==false) ? 'Ativo' : 'Inativo';
- $div = new TElement('span');
- $div->class="label label-{$class}";
- $div->style="text-shadow:none; font-size:12px; font-weight:lighter";
- $div->add($label);
- return $div;
- });
- // add the columns to the DataGrid
- //$this->datagrid->addColumn($column_id);
- $this->datagrid->addColumn($column_cpf);
- $this->datagrid->addColumn($column_nome);
- $this->datagrid->addColumn($column_inativa);
- $this->datagrid->disableDefaultClick();
- // create EDIT action
- $action_edit = new TDataGridAction(array('TelaCPFNomeForm', 'onEdit'));
- $action_edit->setButtonClass('btn btn-default');
- $action_edit->setLabel(_t('Edit'));
- $action_edit->setImage('far:edit blue fa-lg');
- $action_edit->setField('id');
- $this->datagrid->addAction($action_edit);
- // create DELETE action
- $action_del = new TDataGridAction(array($this, 'onDelete'));
- $action_del->setButtonClass('btn btn-default');
- $action_del->setLabel(_t('Delete'));
- $action_del->setImage('fa:trash red fa-lg');
- $action_del->setField('id');
- $this->datagrid->addAction($action_del);
- // create the datagrid model
- $this->datagrid->createModel();
- // create the page navigation
- $this->pageNavigation = new TPageNavigation;
- $this->pageNavigation->enableCounters();
- $this->pageNavigation->setAction(new TAction(array($this, 'onReload')));
- $this->pageNavigation->setWidth($this->datagrid->getWidth());
- $panel = new TPanelGroup;
- $panel->add($this->datagrid);
- $panel->addFooter($this->pageNavigation);
- // vertical box container
- $container = new TVBox;
- $container->style = 'width: 100%';
- $container->add(new TXMLBreadCrumb('menu.xml', 'TelaCPFNomeList'));
- $container->add($this->form);
- $container->add($panel);
- parent::add($container);
- }
- catch (Exception $e)
- {
- new TMessage('error', $e->getMessage());
- }
- }
- function onClear()
- {
- // get the search form data
- $data = $this->form->getData();
- TSession::setValue(__CLASS__.'_filter_data', NULL);
- TSession::setValue(__CLASS__.'_filters', NULL);
- $data->cpf = '';
- $data->nome = '';
- $data->inativa = '';
- // fill the form with data again
- $this->form->setData($data);
- $param = array();
- $param['offset'] = 0;
- $param['first_page'] = 1;
- $this->onReload($param);
- }
- /**
- * Register the filter in the session
- */
- public function onSearch($param = NULL)
- {
- // get the search form data
- $data = $this->form->getData();
- // clear session filters
- TSession::setValue(__CLASS__.'_filter_data', NULL);
- TSession::setValue(__CLASS__.'_filters', NULL);
- $filters = array();
- if ((isset($data->cpf) AND ($data->cpf != NULL)) ||
- (isset($data->nome) AND ($data->nome != NULL)) ||
- (isset($data->inativa) AND ($data->inativa != NULL)))
- {
- $data->nome = mb_strtoupper($data->nome, 'UTF-8');
- $cpf = json_decode(json_encode($data->cpf, true), true);
- $nome = json_decode(json_encode($data->nome, true), true);
- $inativa = json_decode(json_encode($data->inativa, true), true);
- $cpf = new MongoDB\BSON\Regex("^$cpf.*$", 'i');
- $nome = new MongoDB\BSON\Regex("^$nome.*$", 'i');
- $filters = array("cpf" => $cpf, "nome" => $nome, "inativa" => boolval($inativa));
- }
- // fill the form with data again
- $this->form->setData($data);
- TSession::setValue(__CLASS__.'_filter_data', $data);
- TSession::setValue(__CLASS__.'_filters', $filters);
- // keep the search data in the session
- TSession::setValue('TelaCPFNome_filter_data', $data);
- $param=array();
- $param['offset'] =0;
- $param['first_page']=1;
- $this->onReload($param);
- }
- /**
- * Load the datagrid with data
- */
- public function onReload($param = NULL)
- {
- try
- {
- // This path should point to Composer's autoloader
- require '../../../../vendor/autoload.php';
- // default order
- $limit = 10;
- $offset = 0;
- // default order
- if (empty($param['order']))
- {
- $param['order'] = '_id';
- $param['direction'] = 'desc';
- }
- $param['limit'] = isset($limit) ? $limit : NULL;
- $limit = $param['limit'];
- if (isset($param['offset']) AND $param['offset'])
- {
- $offset = (int) $param['offset'];
- }
- /*
- if ($param['page']=="" || $param['page']=="1")
- {
- $param['first_page']=1;
- }
- else
- {
- $param['first_page']=($param['page']*10)-10;
- }
- $options=[
- 'limit' => $limit,
- 'skip' => $param['first_page'],
- 'sort' => ["_id" => -1],
- ];
- */
- $options = [
- 'skip'=> $offset,
- 'limit'=> $limit,
- 'sort' => ["_id" => -1],
- ];
- $filters = [];
- if(TSession::getValue(__CLASS__.'_filters'))
- {
- $filters = json_decode(json_encode(TSession::getValue(__CLASS__.'_filters'), true), true);
- }
- echo "<pre>";
- print_r($param);
- echo "</pre>";
- $this->datagrid->clear();
- $manager = new MongoDB\Driver\Manager('mongodb://localhost:27017');
- $readPreference = new MongoDB\Driver\ReadPreference(MongoDB\Driver\ReadPreference::RP_PRIMARY);
- $query = new MongoDB\Driver\Query($filters, $options);
- $cursor = $manager->executeQuery('bancoTeste.cadastro_cpf_nome', $query, $readPreference);
- $objects = json_decode(json_encode($cursor->toArray(),true), true);
- if ($objects)
- {
- foreach ($objects as $key => $object)
- {
- $newObject = new stdClass;
- $newObject->id = $object['_id']['$oid'];
- $newObject->cpf = $object['cpf'];
- $newObject->nome = $object['nome'];
- $newObject->inativa = $object['inativa'];
- // add the object inside the datagrid
- $this->datagrid->addItem($newObject);
- }
- }
- if (is_callable($this->transformCallback))
- {
- call_user_func($this->transformCallback, $objects, $param);
- }
- $param['limit'] = NULL;
- $param['order'] = NULL;
- $param['offset'] = NULL;
- $param['group'] = NULL;
- $count = count($objects);
- $this->pageNavigation->setCount($count); // count of records
- $this->pageNavigation->setProperties($param); // order, page
- $this->pageNavigation->setLimit($limit); // limit
- $this->loaded = true;
- }
- catch (Exception $e) // in case of exception
- {
- // shows the exception error message
- new TMessage('error', $e->getMessage());
- // undo all pending operations
- TTransaction::rollback();
- }
- }
- /**
- * Ask before deletion
- */
- public function onDelete($param)
- {
- // define the delete action
- $action = new TAction(array($this, 'Delete'));
- $action->setParameters($param); // pass the key parameter ahead
- // shows a dialog to the user
- new TQuestion(AdiantiCoreTranslator::translate('Do you really want to delete ?'), $action);
- }
- /**
- * Delete a record
- */
- public function Delete($param)
- {
- try
- {
- $id = $param['id']; // get the parameter $key
- // This path should point to Composer's autoloader
- require '../../../../vendor/autoload.php';
- //connect to mongodb
- $conexaoMongo = new MongoDB\Client('mongodb://localhost:27017');
- $banco = $conexaoMongo->bancoTeste;
- $cadastro = $banco->cadastro_cpf_nome;
- $cadastro->deleteOne( array( '_id' => new MongoDB\BSON\ObjectId ($id)) );
- $this->onReload( $param ); // reload the listing
- new TMessage('info', AdiantiCoreTranslator::translate('Record deleted')); // success message
- TApplication::loadPage('TelaCPFNomeList', '');
- }
- catch (Exception $e) // in case of exception
- {
- new TMessage('error', $e->getMessage()); // shows the exception error message
- TTransaction::rollback(); // undo all pending operations
- }
- }
- public function show()
- {
- // check if the datagrid is already loaded
- if (!$this->loaded AND (!isset($_GET['method']) OR !(in_array($_GET['method'], array('onReload', 'onSearch', 'onClear')))) )
- {
- if (func_num_args() > 0)
- {
- $this->onReload( func_get_arg(0) );
- }
- else
- {
- $this->onReload();
- }
- }
- parent::show();
- }
- function showMessage()
- {
- new TMessage('info', AdiantiCoreTranslator::translate('Record saved'));
- $this->onReload();
- }
- }
- ?>
- <?php
- /**
- * TelaCPFNomeForm Form
- * @author <your name here>
- */
- class TelaCPFNomeForm extends TPage
- {
- protected $form; // form
- /**
- * Form constructor
- * @param $param Request
- */
- public function __construct()
- {
- parent::__construct();
- try
- {
- // creates the form
- $this->form = new BootstrapFormBuilder('form_TelaCPFNome');
- // define the form title
- $this->form->setFormTitle('Cadastro CPF E Nome MongoDB');
- // create the form fields
- $id = new THidden('id');
- $id->setEditable(false);
- $this->form->addFields( [$id]);
- $nome = new TEntry('nome');
- $nome->forceUpperCase();
- $nome->setMaxLength(100);
- $nome->addValidation(('Name'), new TRequiredValidator);
- $cpf = new TEntry('cpf');
- $cpf->setMask('999.999.999-99');
- $cpf->addValidation(('Regex Format'), new TRequiredValidator);
- //descrever o local físico do arquivo
- $inativa = new TRadioGroup('inativa');
- $inativa->setLayout('horizontal');
- $inativa->setUseButton();
- $inativa->addItems(['f' => 'Ativo', 't' => 'Inativo']);
- $nome->setSize('100%');
- $cpf->setSize('100%');
- $inativa->setSize('100%');
- // add the fields
- $row = $this->form->addFields( [new TLabel('CPF', '', '14px', 'b', '100%'), $cpf] );
- $row->layout = ['col-sm-4','col-sm-4','col-sm-4'];
- $row = $this->form->addFields( [new TLabel('Nome', '', '14px', 'b', '100%'), $nome] );
- $row->layout = ['col-sm-9','col-sm-3'];
- $row = $this->form->addFields( [new TLabel('Situação', '', '14px', 'b', '100%'), $inativa] );
- $row->layout = ['col-sm-4','col-sm-4','col-sm-4'];
- // create the form actions
- $this->form->addAction(_t('Save'), new TAction(array($this, 'onSave')), 'fa:save')->class = 'btn btn-sm btn-success';
- $this->form->addAction(_t('Back'),new TAction(array('TelaCPFNomeList', 'onReload')),'fa:arrow-circle-left')->class = 'btn btn-sm btn-info';
- // vertical box container
- $container = new TVBox;
- $container->style = 'width: 100%';
- $container->add(new TXMLBreadCrumb('menu.xml', 'TelaCPFNomeList'));
- $container->add($this->form);
- parent::add($container);
- }
- catch (Exception $e)
- {
- new TMessage('error', $e->getMessage());
- }
- }
- /**
- * Save form data
- * @param $param Request
- */
- public function onSave()
- {
- require '../../../../vendor/autoload.php';
- try
- {
- //connect to mongodb
- $conexaoMongo = new MongoDB\Client('mongodb://localhost:27017');
- $data = $this->form->getData(); // get form data as array
- $this->form->validate(); // validate form data
- $banco = $conexaoMongo->bancoTeste;
- $cadastro = $banco->cadastro_cpf_nome;
- if ($cadastro instanceof \MongoDB\Collection)
- {
- $valorInativa = $data->inativa == 'f' ? FALSE : TRUE;
- $nome = mb_strtoupper($data->nome, 'UTF-8');
- $documento = ['_id' => new MongoDB\BSON\ObjectId(), "cpf" => $data->cpf, "nome" => $nome, "inativa" => $valorInativa, "data_cadastro" => new MongoDB\BSON\UTCDateTime()];
- if (strlen(trim(TSession::getValue('mongoID')))>0)
- {
- //require('mongodb://localhost:27017').MongoDB\BSON\ObjectId;
- $id = new MongoDB\BSON\ObjectId(TSession::getValue('mongoID'));
- $cadastro->replaceOne(['_id' => $id], ['_id' => $id, "cpf" => $data->cpf, "nome" => $nome, "inativa" => $valorInativa, "data_cadastro" => new MongoDB\BSON\UTCDateTime()], ['upsert' => true]);
- }
- else
- {
- $cadastro->insertOne($documento);
- }
- TApplication::loadPage('TelaCPFNomeList', 'showMessage');
- }
- }
- catch (Exception $e)
- {
- new TMessage('error', $e->getMessage()); // shows the exception error message
- TTransaction::rollback(); // undo all pending operations
- }
- }
- /**
- * Load object to form data
- * @param $param Request
- */
- public function onEdit( $param )
- {
- TSession::setValue('mongoID', NULL);
- try
- {
- if (isset($param['id']))
- {
- // This path should point to Composer's autoloader
- require '../../../../vendor/autoload.php';
- //connect to mongodb
- $conexaoMongo = new MongoDB\Client('mongodb://localhost:27017');
- $id = $param['id'];
- TSession::setValue('mongoID', $id);
- $banco = $conexaoMongo->bancoTeste;
- $cadastro = $banco->cadastro_cpf_nome;
- $data = $cadastro->findOne(array('_id' => new MongoDB\BSON\ObjectID($id)));
- $data->inativa = !$data->inativa ? 'f' : 't';
- $this->form->setData($data); // fill the form
- }
- }
- catch (Exception $e) // in case of exception
- {
- new TMessage('error', $e->getMessage()); // shows the exception error message
- TTransaction::rollback(); // undo all pending operations
- }
- }
- }
- ?>
Eu ainda não juntei o Adianti com MongoDB, porém já fiz alguns trabalhos com FormDin (um framework primo do Adianti) com MongoDB. O que vou te falar é apenas da paginação do MongoBD, depois vc terá juntar com o grid do Adianti para pegar o numero da pagina
Vc vai usar o parâmetros skip e limit
https://www.mongodb.com/docs/php-library/v1.12/reference/method/MongoDBCollectio
Eu já estou usando o limit e o skip meu caro. Vou olhar o seu link
Você viu meu código? pode postar algum seu com esse outro framework?
Lucas,
Dê um var_dump no $options, pra ver se ele está montando do jeito certo antes de ser passado para a API.
Outra dica, não deixe os dados de conexão direto no código ('mongodb://localhost:27017')
Prefira manter em arquivo de configuração em app/config, seja em .INI ou .PHP (melhor)
Ex...:
app/config/mongo.php
E no código (controller):
Att,
certo Pablo.
aqui o print da variável $param
Array
(
[class] => TelaCPFNomeList
[method] => onReload
[offset] => 0
[limit] => 10
[direction] => desc
[page] => 1
[first_page] => 1
[order] => _id
)
eu comparei com outros exemplos com o banco sendo relacional e retornam a mesma coisa.
Bom dia alguém encontrou uma solução para o problema? Ainda não consegui resolver.
Bom dia pessoal.
Estava sem tempo para postar. Mas já consegui resolver o problema.
No onReload eu chamei eu rodo uma segunda query para contar os registros. Fiz algumas poucas alterações também.
</your></document></document></boolean></replacement></filter></your>