/** * Método para recuperar um objeto do banco através do mapeamento * objeto relacional. A classe PHPDoc recupera os atributos da classe * * @param string $table * @param array $column * @param array $identificador ex: array(array( 'campo' => 'valor' ); */ protected function getObject($object) { $this->object =& $object; //debug(__FILE__, __LINE__, $object); $doc = new \core\orm\PHPDoc(get_class($object)); /* * Define */ $this->setTable(get_class($object)); //debug(__FILE__, __LINE__, $doc->getColumn()); $this->select()->column(array($this->table => $doc->getColumn())); if (!is_null($this->object->__get($doc->getPK()))) { $this->select()->where($doc->getPK(), "=", $this->object->__get($doc->getPK())); } $this->setAttributes($this->execute()); /* foreach ( $doc->getPK() as $pk ) if( !is_null( $this->object->__get( $pk ) ) ) $this->select()->where( $pk, "=", $this->object->__get( $pk ) ); */ }
/** * Método genérico para persistência. Deve ser utilizado sempre que as condições * permitirem a persistência padrão.Nos casos particulares o método de persistênia * deve ser personalizado. * @param string $classPrincipal Ex: \<namespace>\Classe * @param string $grupoPost * <li>padrão de identificação de dados no formulário html. Indica * que o grupo de dados pertence a um determinado objeto. */ protected function save($classPrincipal, $grupoPost) { # Instância do novo objeto $objPrincipal = new $classPrincipal(); # Documentação da classe $docObjPrincipal = new \core\orm\PHPDoc(get_class($objPrincipal)); # array de atributos da classe principal # Ex: array(idCliente, nome, data_nascimento, idSituacao) $atributos = $docObjPrincipal->getProperties()[get_class($objPrincipal)]; # Carga dos atributos da classe Principal (sem validação) foreach ($atributos as $atributo) { if (isset($_POST[$grupoPost][$atributo])) { $objPrincipal->__set($atributo, $_POST[$grupoPost][$atributo]); } } /** * @TODO como controlar falhas AQUI!!!!!!!!!!!!!!!!! */ $objPrincipal->save(); # ------------------------------------------------------------------ # CLASSES DERIVADAS # Array com atributos da classe principal e referência as classes derivadas $arrayClassesDerivadas = $docObjPrincipal->getProperties(); # Exclusão das propriedades da classe principal unset($arrayClassesDerivadas[get_class($objPrincipal)]); # grupo: contém referência ao nome da classe Ex: telefone (class Telefone) # classeDerivada: contém o nome qualificado da classe derivada Ex: namespace/Classe foreach ($arrayClassesDerivadas as $classeDerivada => $grupo) { # Array de dados oriundos do formulário html # Value: array atributo = valor da classe derivada foreach ($_POST[$grupo] as $key => $value) { # Cria uma instância da classe $objDerivado = new $classeDerivada(); # Recupera a documentação da classe $docObjDerivado = new \core\orm\PHPDoc($classeDerivada); # Recupera um array com os atributos da classe derivada $arrayAttrClasseDerivada = $docObjDerivado->getProperties()[$classeDerivada]; # Verificar se o objeto já existe # Se $key estiver no array $arrayAttrClasseDerivada, o objeto deverá ser criado. if (in_array($key, $arrayAttrClasseDerivada)) { # agrupar por características e alimentar a classe. /* * formato do array * telefone => Array( 1 => Array (idTelefone => 1, ddd => 84, telefone => 999263571), * 5 => Array (idTelefone => 1, ddd => 84, telefone => 981565525), * ddd => Array (0 => 55, 1 => 53), * telefone => Array (0 => 111111111, 1 => 2222222222 )); */ # Forma um array com os dados novos VER: TRATAMENTO DE ARRAY DE NOVOS DADOS foreach ($value as $kValue => $vValue) { $aDados[$grupo][$kValue][$key] = $vValue; } } else { # Se $key não estiver no array $arrayAttrClasseDerivada, o objeto já existe foreach ($arrayAttrClasseDerivada as $attrClasseDerivada) { # Se a clausula if for acionada, os dados já existem if (key_exists($attrClasseDerivada, $value)) { $objDerivado->__set($attrClasseDerivada, $value[$attrClasseDerivada]); } } $objDerivado->__set($docObjPrincipal->getPK(), $objPrincipal->__get($docObjPrincipal->getPK())); /** * @TODO como controlar falhas AQUI!!!!!!!!!!!!!!!!! */ $objDerivado->save(); } } } unset($nomeClasseSimples); # -------------------------------------------------------- # TRATAMENTO DO ARRAY DE NOVOS DADOS # -------------------------------------------------------- foreach ($arrayClassesDerivadas as $namespaceClass => $atributoReferenciado) { if (key_exists($atributoReferenciado, $aDados)) { foreach ($aDados[$atributoReferenciado] as $kDados => $vDados) { # debug( __FILE__, __LINE__, $namespaceClass ); # Cria uma instância da classe $objDerivado2 = new $namespaceClass(); # Recupera a documentação da classe $docObjDerivado2 = new \core\orm\PHPDoc($namespaceClass); # Recupera um array com os atributos da classe derivada $arrayAttrClasseDerivada2 = $docObjDerivado2->getProperties()[$namespaceClass]; foreach ($vDados as $kvDados => $vvDados) { if (in_array($kvDados, $arrayAttrClasseDerivada2)) { $objDerivado2->__set($kvDados, $vvDados); } } $objDerivado2->__set($docObjPrincipal->getPK(), $objPrincipal->__get($docObjPrincipal->getPK())); /** * @TODO como controlar falhas AQUI!!!!!!!!!!!!!!!!! */ $objDerivado2->save(); } } } return $objPrincipal->__get($docObjPrincipal->getPK()); }