Ejemplo n.º 1
0
 /**
  * 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];
 }
Ejemplo n.º 2
0
 /**
  * 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;
 }
Ejemplo n.º 3
0
 /**
  * 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;
 }
Ejemplo n.º 4
0
 /**
  * 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;
 }
Ejemplo n.º 5
0
 /**
  * 
  * @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
         }
     }
 }