/** * Monta o recorset para a visão * * @param ZendT_Db_Where $where * @param array $postData * @return ZendT_Grid_Data */ public function getDataGrid($where, $postData, $retrieve = false, $found = false) { /** * Através dos dados postados adquire as informações * para paginar os dados e ordená-los */ $pager = new ZendT_Grid_Paginator($postData); /** * Monta a base do SQL */ if ($found) { $cmdSelect = " SELECT 1 as found "; } else { $cmdSelect = " SELECT " . $this->getColumns($retrieve)->getColumnsSelect($retrieve, '*', $this->getModel()->getAdapter()); } $cmdFrom = " FROM " . $this->_getSqlBase(); /** * Trata a entrada do Where para ser um Grupo de Where */ if ($where instanceof ZendT_Db_Where_Group) { $whereGroup = $where; } else { if ($where instanceof ZendT_Db_Where) { $whereGroup = new ZendT_Db_Where_Group(); $whereGroup->addWhere($where); } else { $whereGroup = new ZendT_Db_Where_Group(); } } /** * Avalia se existe algum Where específico do MapperView * colocando o mesmo dentro do objeto que agrupa os wheres */ $_whereMapperView = $this->_getWhere($postData, $where); if ($_whereMapperView) { $whereGroup->addWhere($_whereMapperView); } /** * Monta o comando Where */ $binds = $whereGroup->getBinds(); $cmdWhere = " WHERE " . $whereGroup->getSqlWhere(); if ($found) { $cmdWhere .= " AND rownum = 1 "; } /** * Define a ordenação */ $orderBy = $this->_getOrderBy(); if ($orderBy) { $cmdOrderBy = " ORDER BY " . $orderBy; } else { $orderBy = str_replace("expression.", "", $pager->getOrderBy()); $cmdOrderBy = " ORDER BY " . $orderBy; } /** * Pega o número de registro para paginação */ if (!isset($postData['count'])) { $postData['count'] = true; } if (!isset($postData['page'])) { if (isset($postData['noPage'])) { $postData['page'] = false; } else { $postData['page'] = true; } } $numRows = 0; if ($postData['count']) { $sql = $this->getModel()->getAdapter()->sqlCount($cmdFrom, $cmdWhere, $pager->getLimitCount(), $pager->getLimitOffset()); $this->_prepareSql($sql, $binds, 'count'); $numRows = $this->getModel()->getAdapter()->fetchOne($sql, $binds); } /** * Configura o range de dados que será buscado */ if ($postData['page']) { $sql = $this->getModel()->getAdapter()->sqlLimit($cmdSelect, $cmdFrom, $cmdWhere, $cmdOrderBy, $pager->getLimitCount(), $pager->getLimitOffset()); $this->_prepareSql($sql, $binds, 'limit'); } else { $sql = $cmdSelect . $cmdFrom . $cmdWhere . $cmdOrderBy; $this->_prepareSql($sql, $binds, 'full'); } /** * Pega os dados */ $stmt = $this->getModel()->getAdapter()->query($sql, $binds); /** * Retorna os dados através do objeto Data * para facilar a codificação na action */ if ($found) { $mapper = new ZendT_Db_Column_Mapper(); $mapper->add('found', new ZendT_Type_Number()); $data = new ZendT_Grid_Data($stmt, $mapper, true); } else { $data = new ZendT_Grid_Data($stmt, $this->getColumns($retrieve)->getColumnsMapper(), true); } $replaceAlias = $this->getColumns($retrieve)->getReplaceAlias(); if (count($replaceAlias) > 0) { foreach ($replaceAlias as $alias => $newAlias) { $data->addReplaceAlias($newAlias, $alias); } } $data->setNumRows($numRows); $data->setNumPage($pager->getNumPage()); return $data; }