示例#1
0
 /**
  * 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());
 }