/** * * @param string $value * @param string $column * @return \ZendT_Grid_Data */ public function suggest($value, $columnAlias, $profileId = '') { if ($profileId) { $_profile = new Profile_Model_ObjectView_Mapper(); $_profile->setId($profileId)->retrieve(); $config = unserialize($_profile->getConfig()); $this->parseExprProfile($config); } $configColumns = $this->getColumns()->toArray(); $mappers = $this->getColumns()->getColumnsMapper()->getColumnsMapper(); $listOptions = $configColumns[$columnAlias]['listOptions']; if (!$listOptions && $mappers[$columnAlias]['mapper'] instanceof ZendT_Type_String && $mappers[$columnAlias]['mapper']->getListOptions() !== false) { $listOptions = $mappers[$columnAlias]['mapper']->getListOptions(); } /** * @todo melhorar essa implementação */ if ($listOptions) { foreach ($listOptions as $key => $value) { $rows[] = array($key => $value); } return $rows; } $filters = Zend_Controller_Front::getInstance()->getRequest()->getParam('filters'); $paramValid = array(); $paramsAutoFilter = array(); $notIn = array(); $binds = array(); if ($filters) { $filters = explode('&', $filters); foreach ($filters as $data) { $data = str_replace('!=', '<>', $data); list($columnName, $valueFilter) = explode('=', $data); $valueFilter = str_replace('<>', '!=', $valueFilter); $columnName = str_replace('-multiple', '', $columnName); if (!$valueFilter && $columnName != $columnAlias) { continue; } if ($mappers[$columnName]) { if ($mappers[$columnName]['expression']) { $fieldSearch = 'expression-' . $columnName; } else { $fieldSearch = str_replace('.', '-', $configColumns[$columnName]['column']); } if ($columnName == $columnAlias) { if ($valueFilter) { $notIn[$fieldSearch] = true; } else { continue; } } $paramsAutoFilter[$fieldSearch] = $valueFilter; $paramValid[$columnName] = true; if (is_array($configColumns[$columnName]['bind'])) { $binds[$columnName] = $configColumns[$columnName]['bind']; } } } } foreach ($configColumns as $columnName => $column) { if ($column['required'] && !$paramValid[$columnName]) { throw new ZendT_Exception_Alert($column['required']); } } $_whereAutoFilter = ZendT_Db_Where::fromAutoFilter($paramsAutoFilter, $mappers, $notIn, $binds); if (method_exists($this, 'setWhere')) { $this->setWhere($_whereAutoFilter); } $rows = array(); if ($listOptions) { foreach ($listOptions as $key => $value) { $rows[] = array($key => $value); } } else { if ($configColumns[$columnAlias]['expression']) { $column = "(" . $configColumns[$columnAlias]['expression'] . ")"; } else { $column = $configColumns[$columnAlias]['aliasTable'] . '.' . $configColumns[$columnAlias]['columnName']; } $autoCompleteFilter = $configColumns[$columnAlias]['autocomplete-filter']; if ($autoCompleteFilter) { $field = explode(".", $autoCompleteFilter); $cmdSelect = "SELECT " . $field[1] . " as " . $columnAlias . " FROM " . $field[0] . " filtro WHERE EXISTS ( SELECT 1 "; $cmdFrom = " FROM " . $this->_getSqlBase(); $cmdWhereFilter = " AND " . $column . " = filtro." . $field[1] . ")"; $cmdRownum = " AND ROWNUM = 1 "; $cmdLimit = " LIMIT 1 "; } else { $cmdSelect = "SELECT DISTINCT " . $column . " as " . $columnAlias; $cmdFrom = " FROM " . $this->_getSqlBase(); $cmdRownum = " AND ROWNUM <= 30000 "; $cmdLimit = " LIMIT 30000 "; } $whereGroup = new ZendT_Db_Where_Group(); if ($_whereAutoFilter) { $whereGroup->addWhere($_whereAutoFilter); } /** * Avalia se existe algum Where específico do MapperView * colocando o mesmo dentro do objeto que agrupa os wheres */ $_whereMapperView = $this->_getWhere($postData, $_whereAutoFilter); if ($_whereMapperView) { $whereGroup->addWhere($_whereMapperView); } $where = new ZendT_Db_Where(); if ($configColumns[$columnAlias]['expression']) { $columnFilter = new Zend_Db_Expr($column); } else { $columnFilter = $column; } if ($value) { $where->addFilter($columnFilter, $value, '?%', $mappers[$columnAlias]['mapper']); $whereGroup->addWhere($where); } /** * Monta o comando Where */ $binds = $whereGroup->getBinds(); $cmdWhere = " WHERE " . $whereGroup->getSqlWhere(); $cmdOrderBy = " ORDER BY 1 "; $oracle = false; if ($oracle) { $sql = $cmdSelect . $cmdFrom . $cmdWhere . $cmdRownum . $cmdWhereFilter . $cmdGroupBy . $cmdOrderBy; } else { $sql = $cmdSelect . $cmdFrom . $cmdWhere . $cmdWhereFilter . $cmdGroupBy . $cmdOrderBy . $cmdLimit; } $this->_prepareSql($sql, $binds, 'full'); /** * Pega os dados */ $stmt = $this->getModel()->getAdapter()->query($sql, $binds); $data = new ZendT_Grid_Data($stmt, $mappers, true); $rows = $data->getRows(); } return $rows; }