/** * * @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; }