/** * Recupera o dialeto para o objeto * * @author Hugo Ferreira da Silva * @link http://www.hufersil.com.br/ * @param Lumine_Base $obj * @return ILumine_Dialect */ public static function get(Lumine_Base $obj) { $dialect = $obj->_getConfiguration()->getProperty('dialect'); $id = $obj->_getObjectPart('_objectID'); if (!array_key_exists($dialect, self::$createdItems)) { Lumine::load('Lumine_Dialect_' . $dialect); $ref = new ReflectionClass('Lumine_Dialect_' . $dialect); self::$createdItems[$dialect] = $ref->newInstance(); } self::$createdItems[$dialect]->setConnection($obj->_getConnection()); self::$createdItems[$dialect]->setObjectId($id); self::$createdItems[$dialect]->setTablename($obj->tablename()); return self::$createdItems[$dialect]; }
/** * Insere o registro enviado no banco de dados * * @author Hugo Ferreira da Silva * @link http://www.hufersil.com.br/ * @param array $values valores do formulario * @return array resultado da validacao */ private function insert($values) { $def = $this->obj->_getObjectPart('_definition'); foreach ($def as $name => $prop) { if (!empty($prop['options']['foreign']) && empty($values[$name])) { $this->obj->setFieldValue($name, null); } else { if ($this->strip_slashes) { $this->obj->setFieldValue($name, stripslashes(@$values[$name])); } else { $this->obj->setFieldValue($name, @$values[$name]); } } } // limpamos as pk's que sao auto-incrementaveis $obj =& $this->obj; $pks = $obj->_getPrimaryKeys(); foreach ($pks as $name => $item) { if (!empty($item['options']['autoincrement'])) { $obj->{$item}['name'] = null; } } // atualiza as referencias MTM $def = $obj->_getObjectPart('_foreign'); foreach ($def as $name => $prop) { if ($prop['type'] == Lumine_Base::MANY_TO_MANY) { $obj->removeAll($name); if (!empty($values[$name])) { foreach ($values[$name] as $id) { $obj->{$name}[] = $id; } } } } // $this->obj->setFrom($values); $res = $this->obj->validate(); if ($res === true) { $this->obj->insert(); return true; } return $res; }
/** * Permite adicionar um JOIN com uma expressao livre. * * @param Lumine_Base $obj Objeto que sera unido * @param string $expression Expressao que sera utilizada no join * @param string $alias Apelido para a classe que esta sendo unida * @author Hugo Ferreira da Silva * @return Lumine_Base o proprio objeto */ public function joinExpression($obj, $type, $expression, $alias = null) { $type = trim(strtoupper($type)); if (!preg_match('@^(LEFT|LEFT OUTER|INNER|RIGHT|RIGHT OUTER|CROSS)$@', $type)) { throw new Lumine_Exception('Tipo nao suportado: ' . $type, Lumine_Exception::ERROR); } // se indicar o alias if (!is_null($alias)) { $obj->alias($alias); } else { $alias = $obj->alias(); if (empty($alias)) { $alias = $obj->metadata()->getTablename(); } } // pega a lista de join's do objeto que esta sendo unido $list = $obj->_getObjectPart('_join_list'); // reinicia a lista de join's deste objeto reset($this->_join_list); // argumentos extras $args = func_get_args(); array_splice($args, 0, 4); $expression = trim($expression); // remove espacos em branco try { $expression = Lumine_Parser::parsePart($obj, $expression, $args); // faz o parser para certificacao que os campos existem certinho $expression = Lumine_Parser::parseEntityNames($obj, $expression); } catch (Exception $e) { try { $expression = Lumine_Parser::parsePart($this, $expression, $args); // faz o parser para certificacao que os campos existem certinho $expression = Lumine_Parser::parseEntityNames($this, $expression); } catch (Exception $e) { Lumine_Log::warning('Houve um erro na analise da condicao extra'); } } // adiciona a expressao $this->_join[] = sprintf('%s JOIN %s %s ON %s', $type, $obj->metadata()->getTablename(), $alias, $expression); // para cada item na lista do objeto alvo foreach ($list as $ent) { // indica que pode adicionar $add = true; // para cada item na lista deste objeto foreach ($this->_join_list as $this_ent) { // se for a mesma classe e tiver o mesmo alias if ($ent->metadata()->getClassname() == $this_ent->metadata()->getClassname() && $ent->alias() == $this_ent->alias()) { // nao pode fazer o join $add = false; break; } } // se nao puder fazer o join if (!$add) { // pula para o proximo item continue; } // ok pode adicionar $this->_join_list[] = $ent; $this->_join = array_merge($this->_join, $ent->_getStrJoinList()); // faz o where $where = $ent->_makeWhereFromFields(); // se teve condicoes if (!empty($where)) { // inclui neste objeto $this->where($where); } } // deixa a lista unica $this->_join = array_unique($this->_join); return $this; }
/** * Faz o parse de nomes de colunas e tabelas de uma string * * @author Hugo Ferreira da Silva * @link http://www.hufersil.com.br/ * @param Lumine_Base $obj * @param string $str * @return string */ public static function parseEntityNames(Lumine_Base $obj, $str) { // fazer parse de u.nome (alias + . + nome_do_campo) de cada entidade $list = $obj->_getObjectPart('_join_list'); foreach ($list as $ent) { $a = $ent->alias(); $name = $ent->metadata()->getClassname(); if (!empty($a)) { preg_match_all('@\\b' . $a . '\\b\\.(\\w+)\\b@', $str, $reg); $total = count($reg[0]); for ($i = 0; $i < $total; $i++) { $field = $ent->metadata()->getField($reg[1][$i]); $exp = '@\\b' . $a . '\\b\\.(' . $reg[1][$i] . ')\\b@'; $str = preg_replace($exp, $a . '.' . $field['column'], $str); } } preg_match_all('@\\{' . $name . '\\.(\\w+)\\}@', $str, $reg); $total = count($reg[0]); for ($i = 0; $i < $total; $i++) { $field = $ent->metadata()->getField($reg[1][$i]); if (!empty($a)) { $str = str_replace($reg[0][$i], $a . '.' . $field['column'], $str); } else { $str = str_replace($reg[0][$i], $ent->metadata()->getTablename() . '.' . $field['column'], $str); } } } // encontra por {propriedade} // quando nao especificado, significa que pertence a mesma entidade // chamadora da funcao, por isso nao fazemos loop preg_match_all('@\\{(\\w+)\\}@', $str, $reg); $total = count($reg[0]); for ($i = 0; $i < $total; $i++) { $f = $obj->metadata()->getField($reg[1][$i]); $a = $obj->alias(); if ($a == '') { $a = $obj->metadata()->getTablename(); } $str = str_replace($reg[0][$i], $a . '.' . $f['column'], $str); } return $str; }
/** * * @link http://www.hufersil.com.br * @author Hugo Ferreira da Silva * @param array $filters Filtros que serao aplicados * @return void */ protected function setFilters(array $filters, array $where = array()) { foreach ($filters as $key => $value) { // iremos ignorar valores vazios if ($value === '') { continue; } try { $target = $this->obj; $alias = $this->obj->_getAlias(); // se indicou o alias if (preg_match('@^(\\w+)\\.(\\w+)$@', $key, $reg)) { $list = $this->obj->_getObjectPart('_join_list'); // para cada item de classes unidas foreach ($list as $class) { // se encontrar o alias if ($class->_getAlias() == $reg[1]) { $target = $class; $alias = $class->_getAlias(); $key = $reg[2]; break; } } } $field = $target->_getField($key); // se o valor for nulo if (is_null($value)) { // colocamos um IS NULL como condicao $this->obj->where($alias . '.' . $key . ' IS NULL'); continue; } // se o usuario informou uma forma de filtro if (array_key_exists($alias . '.' . $key, $where)) { // assim o usuario pode personalizar o filtro $this->obj->where($alias . '.' . $key . ' ' . $where[$alias . '.' . $key], $value); continue; } // se o valor for array if (is_array($value)) { $this->obj->where($alias . '.' . $key . ' IN (?)', $value); continue; } switch ($field['type']) { case 'char': case 'varchar': case 'text': case 'enum': case 'blob': case 'longblob': case 'tinyblob': $this->obj->where($alias . '.' . $key . ' like ?', $value); break; // se nao for texto, nao fazemos por like // fazemos uma comparacao direta // se nao for texto, nao fazemos por like // fazemos uma comparacao direta default: $this->obj->where($alias . '.' . $key . ' = ?', $value); } } catch (Exception $e) { // quando o campo que a pessoa tentou pegar nao existe // eh disparada uma excecao, mas neste caso nao eh um erro // por isso capturamos a excecao para que nao de problemas para o usuario } } }