Example #1
0
 /**
  *
  * @param array $data
  * @param array $columnsMapper 
  * @return \ZendT_Db_Where 
  */
 public static function fromAutoFilter($data, $columnsMapper, $notIn = null, $bind = false)
 {
     if ($columnsMapper instanceof ZendT_Db_Column_Mapper) {
         $columnsMapper = $columnsMapper->getColumnsMapper();
     }
     if ($data['raw']) {
         $tipoBusca = 'OR';
     } else {
         $tipoBusca = 'AND';
     }
     $where = new ZendT_Db_Where($tipoBusca);
     foreach ($data as $field => $value) {
         if (strpos($field, '-multiple') !== false) {
             continue;
         }
         $pos = strpos($field, '-');
         if ($pos !== false) {
             $value = trim($value);
             $columnName = substr($field, $pos + 1);
             $tableName = substr($field, 0, $pos);
             $list = "";
             if (isset($columnsMapper[$columnName . '_' . $tableName])) {
                 $mapperName = $columnsMapper[$columnName . '_' . $tableName]['mapper'];
                 $tableColumn = $columnsMapper[$columnName . '_' . $tableName]['column'];
                 $_operationDefault = $columnsMapper[$columnName . '_' . $tableName]['operation'];
             } else {
                 if (isset($columnsMapper[$columnName])) {
                     $mapperName = $columnsMapper[$columnName]['mapper'];
                     $tableColumn = $columnsMapper[$columnName]['column'];
                     $_operationDefault = $columnsMapper[$columnName]['operation'];
                     if (isset($columnsMapper[$columnName]['expression'])) {
                         $field = new Zend_Db_Expr($columnsMapper[$columnName]['expression']);
                         $mapper = $columnsMapper[$columnName]['mapper'];
                         if (is_object($mapper) && method_exists($mapper, 'getListOptions')) {
                             $list = $mapper->getListOptions();
                         }
                     }
                 } else {
                     $mapperName = $columnsMapper['default']['mapper'];
                     $tableColumn = $columnName;
                     $_operationDefault = $columnsMapper['default']['operation'];
                 }
             }
             if ($mapperName instanceof ZendT_Type) {
                 $type = $mapperName;
             } else {
                 if ($mapperName) {
                     $mapper = new $mapperName();
                     $type = $mapper->userToType('', $tableColumn);
                     $list = $mapper->getModel()->getListOptions($tableColumn);
                 }
             }
             $arrayNull = array('NULO', 'NULL', 'VAZIO');
             /* Alterar também em: library\ZendT\Db\Column\View.php */
             if (in_array(strtoupper($value), $arrayNull) || in_array(strtoupper(substr($value, 1)), $arrayNull) || in_array(strtoupper(substr($value, 2)), $arrayNull)) {
                 $myOper = substr($value, 0, 1);
                 if ($myOper != '!') {
                     $myOper = '';
                 } else {
                     $valueOper = '!=';
                 }
                 $value = $valueOper . "VAZIO";
                 //Exibe o filtro como "VAZIO" para melhor o entendimento do usuário
                 $operation = $myOper . 'NULL';
                 //Determina o filtro com (operação + NULL)
             } else {
                 $operationDefault = '=';
                 $oldValue = $value;
                 if ($type instanceof ZendT_Type_Date) {
                     $_formatType = $type->getType();
                     $valueData = str_replace(array('>', '=', '<', '!'), '', $value);
                     $sep = '';
                     if (strpos($valueData, ';') === false) {
                         $sep = ' ';
                         $arrValue = explode(' ', $valueData);
                     } else {
                         $arrValue = explode(';', $valueData);
                         $sep = ';';
                     }
                     #print_r($arrValue);
                     #exit;
                     $newValue = '';
                     foreach ($arrValue as $key => $data) {
                         list($data, $hora) = explode('-', $data);
                         if ($_formatType == 'DateTime' && $hora == '') {
                             if ($key == 0) {
                                 $hora = '00:00';
                             } else {
                                 $hora = '23:59';
                             }
                         }
                         if ($hora) {
                             $hora = trim(str_replace(':', '', $hora));
                             $hora = substr($hora, 0, 2) . ':' . substr($hora, 2);
                         }
                         $dataFormat = trim(str_replace('/', '', $data));
                         $ano = substr($dataFormat, 4);
                         if (strlen($ano) == 2) {
                             $ano = substr(date('Y'), 0, 2) . $ano;
                         }
                         $dataFormat = substr($dataFormat, 0, 2) . '/' . substr($dataFormat, 2, 2) . '/' . $ano;
                         #$value = str_replace($arrValue[$key], $dataFormat, $value);
                         $newValue .= $sep . $dataFormat;
                         if ($hora) {
                             $newValue .= '_' . $hora;
                         }
                     }
                     $value = substr($newValue, 1);
                 } else {
                     if ($type instanceof ZendT_Type_Number) {
                     } else {
                         if (is_array($list)) {
                             $value = str_replace(',', ';', $value);
                             $arrStr = explode(';', strtoupper($value));
                             $value = '';
                             foreach ($list as $_key => $_value) {
                                 foreach ($arrStr as $_vUpper) {
                                     if (strtoupper($_value) == $_vUpper || strtoupper($_key) == $_vUpper) {
                                         $value .= ';' . $_key;
                                     }
                                 }
                             }
                             $value = substr($value, 1);
                         }
                         $string = true;
                         if (strpos(trim($value), ' ') !== false) {
                             list($num0, $num1) = explode(' ', trim($value));
                             if (is_numeric($num0) && is_numeric($num1)) {
                                 $string = false;
                             }
                         }
                         if ($string) {
                             $value = str_replace(' ', '%', $value);
                             if ($_operationDefault) {
                                 $operationDefault = $_operationDefault;
                             } else {
                                 $operationDefault = '%?%';
                             }
                         }
                     }
                 }
                 $value = explode(' ', $value);
                 if (count($value) > 1) {
                     $operation = 'BETWEEN';
                 } else {
                     $operation1 = substr($oldValue, 0, 1);
                     $operation2 = substr($oldValue, 1, 1);
                     if (in_array($operation1, array('<', '>', '=', '!'))) {
                         if (in_array($operation2, array('='))) {
                             $operation = $operation1 . $operation2;
                             $value[0] = substr($oldValue, 2);
                         } else {
                             $operation = $operation1;
                             $value[0] = substr($oldValue, 1);
                             if (strpos($value[0], ';') > 0) {
                                 $value = explode(';', $value[0]);
                                 $operation = '!in';
                             }
                         }
                     } else {
                         $value = $value[0];
                         $value = explode(';', $value);
                         if (count($value) > 1) {
                             $value = str_replace('%', ' ', $value);
                             $operation = 'in';
                         } else {
                             $operation = $operationDefault;
                             if ($_operationDefault == '=') {
                                 $value = str_replace('%', ' ', $value);
                             }
                         }
                     }
                 }
             }
             if (isset($bind[$columnName]) && is_array($bind[$columnName])) {
                 foreach ($bind[$columnName] as $index => $bindName) {
                     if (!$value[$index] && $value[0]) {
                         $value[$index] = $value[0];
                     }
                     $valueAux = $value[$index];
                     $value[$index] = clone $type;
                     $value[$index]->set($valueAux);
                     if ($field instanceof Zend_Db_Expr) {
                         $where->addBind($bindName, $value[$index], $columnName);
                     } else {
                         $where->addBind($bindName, $value[$index], str_replace('-', '.', $field), $columnName);
                     }
                 }
             } else {
                 if ($field instanceof Zend_Db_Expr) {
                 } else {
                     if ($notIn[$field]) {
                         $operation = '!' . $operation;
                     }
                 }
                 if ($field instanceof Zend_Db_Expr) {
                     $field = $field->__toString();
                     $where->addFilter($field, $value, $operation, $mapperName, false, $columnName);
                     #$where->addFilter($field, $value, $operation, $mapperName, $nullable)
                 } else {
                     $where->addFilter(str_replace('-', '.', $field), $value, $operation, $mapperName, false, $columnName);
                 }
             }
         }
     }
     return $where;
 }