Exemple #1
0
 /**
  *
  * @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;
 }