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