Exemplo n.º 1
0
 /**
  * Construtor da excecao
  * 
  * @author Hugo Ferreira da Silva
  * @link http://www.hufersil.com.br/
  * @param string $msg   Mensagem a ser disparada
  * @param int    $code  Codigo de erro
  * @return Lumine_Exception
  */
 function __construct($msg, $code)
 {
     $debug = debug_backtrace();
     $bt = array_shift($debug);
     $file = $bt['file'];
     $line = $bt['line'];
     Lumine_log::log($code, $msg, $file, $line);
     parent::__construct($msg, $code);
 }
Exemplo n.º 2
0
 /**
  * Salva os objetos vinculados a este que dependem deste 
  *
  * @author Hugo Ferreira da Silva
  * @link http://www.hufersil.com.br/lumine
  * @return void
  */
 protected function saveDependentObjects()
 {
     $schema = $this->_getConfiguration()->getOption('schema_name');
     if (!empty($schema)) {
         $schema .= '.';
     }
     foreach ($this->metadata()->getRelations() as $name => $def) {
         switch ($def['type']) {
             case Lumine_Metadata::ONE_TO_MANY:
                 $list = $this->fieldValue($name);
                 if (!empty($list) && is_array($list)) {
                     foreach ($list as $val) {
                         if ($val instanceof Lumine_Base) {
                             $relname = $this->metadata()->getClassname();
                             try {
                                 $field = $val->metadata()->getRelation($relname, Lumine_Metadata::MANY_TO_ONE);
                                 $val->setFieldValue($field['name'], $this->{$field}['linkOn']);
                                 $val->save();
                             } catch (Lumine_Exception $e) {
                                 Lumine_log::warning('nao foi possivel encontrar o campo ' . $relname . ' em ' . $val->metadata()->getClassname());
                             }
                         }
                     }
                 }
                 break;
             case Lumine_Metadata::MANY_TO_MANY:
                 $list = $this->{$name};
                 if (!empty($list) && is_array($list)) {
                     foreach ($list as $val) {
                         // se for uma instancia de Lumine_Base
                         if ($val instanceof Lumine_Base) {
                             // pega o valor da chave primaria
                             $f1 = $this->metadata()->getField($def['linkOn']);
                             $v1 = $this->fieldValue($def['linkOn']);
                             // salva o objeto
                             $val->save();
                             // valor do outro objeto
                             $rel = $val->metadata()->getRelation($this->metadata()->getClassname(), Lumine_Metadata::MANY_TO_MANY);
                             $f2 = $val->metadata()->getField($rel['linkOn']);
                             $v2 = $val->fieldValue($f2['name']);
                             // se ambos nao forem nulos
                             if (!is_null($v1) && !is_null($v2)) {
                                 // verifica se ja existe
                                 $sv1 = Lumine_Parser::getParsedValue($this, $v1, $f1['type']);
                                 $sv2 = Lumine_Parser::getParsedValue($val, $v2, $f2['type']);
                                 $sql = "SELECT * FROM " . $schema . $def['table'] . " WHERE ";
                                 $sql .= $def['column'] . '=' . $sv1;
                                 $sql .= ' AND ';
                                 $sql .= $rel['column'] . '=' . $sv2;
                                 $ref = new ReflectionClass(get_class($this));
                                 $ponte = $ref->newInstance();
                                 Lumine_Log::debug('Verificando existencia da referencia do objeto no banco: ' . $sql);
                                 $ponte->query($sql);
                                 // se nao existir
                                 if ($ponte->numrows() == 0) {
                                     // insert
                                     $sql = "INSERT INTO " . $schema . $def['table'] . "(%s, %s) VALUES (%s, %s)";
                                     $sql = sprintf($sql, $def['column'], $rel['column'], $sv1, $sv2);
                                     $ponte->query($sql);
                                 }
                                 $ponte->destroy();
                             }
                         } else {
                             // pega o valor do campo desta classe
                             $campo = $this->metadata()->getField($def['linkOn']);
                             $valor_pk = $this->fieldValue($campo['name']);
                             // se este objeto tem um valor no campo indicado
                             if (!is_null($valor_pk)) {
                                 // primeiro vemos se este valor ja nao existe
                                 $sql = "SELECT * FROM " . $schema . $def['table'] . " WHERE ";
                                 // pega o valor do campo desta entidade
                                 $valor_objeto = Lumine_Parser::getParsedValue($this, $valor_pk, $campo['type']);
                                 // instanciamos a classe estrangeira
                                 $this->_getConfiguration()->import($def['class']);
                                 $obj = new $def['class']();
                                 // pega o relacionamento com esta entidade
                                 $rel = $obj->metadata()->getRelation($this->metadata()->getClassname(), Lumine_Metadata::MANY_TO_MANY);
                                 $rel_def = $obj->metadata()->getField($rel['linkOn']);
                                 // ajusta o valor
                                 $valor_estrangeiro = Lumine_Parser::getParsedValue($obj, $val, $rel_def['type']);
                                 // termina a SQL
                                 $sql .= $def['column'] . '=' . $valor_objeto;
                                 $sql .= " AND ";
                                 $sql .= $rel['column'] . '=' . $valor_estrangeiro;
                                 $obj->query($sql);
                                 $res = $obj->numrows();
                                 // se nao encontrou
                                 if ($res == 0) {
                                     // insere
                                     $sql = "INSERT INTO %s (%s,%s) VALUES (%s,%s)";
                                     $sql = sprintf($sql, $schema . $def['table'], $def['column'], $rel['column'], $valor_objeto, $valor_estrangeiro);
                                     Lumine_Log::debug("Inserindo valor Many-To-Many: " . $sql);
                                     $obj->query($sql);
                                 }
                                 $obj->destroy();
                             } else {
                                 Lumine_Log::warning('A o campo "' . $pks[0]['name'] . ' da classe "' . $this->metadata()->getClassname() . '" nao possui um valor');
                             }
                         }
                     }
                 }
                 break;
         }
     }
 }