CodeGen e CRUD

DOWNLOAD Source : codeGen.phps / codeGenCRUD.php

Hoje em dia estava usando somente a classe codeGen para conseguir os getters e setters dos campos que eram not nulls entre outros, mas estava tendo a necessidade de fazer algo que me ajudasse em rendimento para o meu desenvolvimento, mais ainda.

Desenvolvi o codeGenCRUD onde ele faz o INSERT, UPDATE, SELECT e DELETE conforme é informado os campos e solicitado para executar o salvar, deletar ou consultar.

Ainda não tive tempo para documentar corretamente e também traduzir para o inglês, assim internacionalizando como fiz noutro, mas logo estarei fazendo isso e estarei atualizando o fonte.

Em relação ao codeGen somente acabei fazendo algumas melhorias, então já estamos com uma versão mais power agora!

Detalhes sobre o codeGenCRUD estarei disponibilizando assim que eu terminar a documentação e tradução.

changelog

CodeGenerator

28/08/06
* fixed :: ao buscar vários registros nos métodos get’s dos objetos pode ser informado o indice
23/08/2006
* fixed :: acrescentado a variavel _tablename para poder ser usado corretamenta no CRUD posteriormente
* fixed :: Verificado que nos campos numéricos quando não retorna nada tem que retornar 0

CodeGeneratorCRUD

28/08/06
* fixed :: deixado a critério a forma de select nas consultas (VIA ARRAY OU VIA OBJETO)
* bugfixed :: quando se faz uma consulta não estava chamando a função setter do objeto.
25/08/06
* fixed :: criado funções de controle para a função limit do MYSQL
* fixed :: alterado a função de mensagem agora não há necessidade de informar o nome da classe e tudo mais, se utiliza das variáveis do próprio PHP __CLASS__ e __FUNCTION__
* fixed :: criado função que retorna qtos registros há em uma tabela
* fixed :: criado função que retorna o status da execução da query

23/08/06
* bugfix :: correção dos campos para caixa correta a do banco de dados
* bugfix :: correção das tabelas com espaçamento com caracteres do tipo “_”
* bugfix :: correção ao criar os sql que atualização e inserem colocam na cláusula where os valores com ’string’ em vez de colocarem valor numérico para campos inteiros ou floats.
* fixed :: acrescentado a função rename para a correcao dos bug’s acima

DOWNLOAD Source : codeGen.phps / codeGenCRUD.php

Atualmente em meus trabalhos feitos em PHP utilizo alguns frameworks.

* smarty PHP (do grupo PHP.net)
* pear.php.net (do grupo PHP.net)
* package DB.pear.php.net
* package HTML_AJAX.pear.php.net
* E para desenvolvimento a ferramenta da Zend o ZendStudioClient 5.0

E desta forma tenho como controlar via ajax as entradas de dados e minhas templates, mas sempre há uma variável que é apresentada, a do javascript
desabilitado ou não carregado por completo.
E o controle fica somente na programação do meu php, onde tenho que ficar fazendo if e tals, mas para simplificar resolvi fazer essa classe que gera
classes e objetos que ao serem criados eles tem caracteristicas próprias onde eu ou qualquer programador teria que escrever. Como por exemplo:
O usuário, senha da tabela de usuários tem que ser informado, obrigatoriamente.
Ai pensei em fazer uma classe

class Usuario {
private $_idusuario;
private $_idpessoa;
private $_senha;
public function getIdusuario() {
return $this->_idusuario;
}
public function setIdusuario($intIdusuario) {
$this->_idusuario = $intIdusuario;
}
public function getIdpessoa() {
return $this->_idpessoa;
}
public function setIdpessoa($intIdpessoa) {
$this->_idpessoa = $intIdpessoa;
}
public function getSenha() {
return $this->_senha;
}
public function setSenha($strSenha) {
$this->_senha = $strSenha;
}

Mas mesmo assim tinha que ficar escrevendo muito para fazer uma coisa tão simples que controla oq ?
E detalhe como uso o ZendStudio ele não ajuda nisso, dai teria que ficar abrindo o eclipse para fazer isso e depois o zend novamente o trabalheira.
Observando a estrutura do banco vi que minha tabela USUARIO do banco tem toda essa estrutura e mais:

    IDUSUARIO INT(11) NOT NULL PRIMARY KEY
    USUARIO   TEXT    NOT NULL
    SENHA     TEXT    NOT NULL
    ATIVO     CHAR(1) NOT NULL

Então poderia fazer melhor na minha classe:

class Usuario {
private $_idusuario;
private $_idgrupo;
private $_idpessoa;
private $_senha;
private $_fieldsRequired = array();

public function getIdusuario() {
return $this->_idusuario;
}
public function setIdusuario($intIdusuario,$require = "T") {
$this->_idusuario = $intIdusuario;
$this->setFieldRequire("idusuario",$require);
}
public function getIdgrupo() {
return $this->_idgrupo;
}
public function setIdpessoa($intIdpessoa,$require = "T") {
$this->_idpessoa = $intIdpessoa;
$this->setFieldRequire("idpessoa",$require);
}
public function getSenha() {
return $this->_senha;
}

public function setSenha($strSenha,$require = "T") {
$this->_senha = $strSenha;
$this->setFieldRequire("senha",$require);
}
private Function setFieldRequire($strField,$boolRequired = "F") {
if ( (strtoupper($boolRequired) == "T") || ($boolRequired === 1) ) {
$ma = $this->_fieldsRequired;
$c = count($ma);
$achou = false;
for ($i = 0; $i < $c; $i++ ) {
if ($ma[$i] == trim($strField)) {
$achou = true;
break;
}
}
if (!$achou) {
$ma[++$c] = trim($strField);
}
$this->_fieldsRequired = $ma;
}
}

E agora estaria controlando os meus objetos antes deles serem inseridos no banco, ai pensei.. tenho que saber se o objeto foi informado ou não
entao fiz mais alguns métodos.

Continuação do código anterior

protected Function isRequired($strField) {
$ma = $this->_fieldsRequired;
$c = count($ma);
$achou = false;
if ($c > 0) {
foreach ($ma as $value) {
if ($strField == $value) {
$achou = true;
break;
}
}
}
return $achou;
}
public Function haveErrors() {
$ma = $this->_fieldsRequired;
$c = count($ma);
if ($c > 0) {
foreach ($ma as $value) {
$var = call_user_method("get".$value, $this, "") ;
if (empty($var)) {
return true;
break;
}
}
}
return false;
}
public Function haveError($strField = "",$res1 = true,$res2 = false) {
$ma = $this->_fieldsRequired;
$c = count($ma);
if ($c > 0) {
foreach ($ma as $value) {
$var = call_user_method("get".$value, $this, "");
if (strtoupper(trim($strField)) == strtoupper($value) && (empty($var))) {
return $res1;
break;
}
}
return $res2;
} else {
return $res2;
}
}
public Function arrayErrors() {
$retorno = "";
$c = 0;
if ($this->haveErrors()) {
$ma = $this->_fieldsRequired;
foreach ($ma as $value) {
$var = call_user_method("get".$value, $this, "") ;
if (empty($var)) {
$retorno[$c++] = $value;
}
}
return $retorno;
} else { return false; }
}

Legal teria que dar Ctrl+C e Ctrl+V em todas as minhas classes, mas o essencial e erros de digitação eu estaria vulnerável.

NECESSIDADE
1. Algo mais automatizado para geração de classes dos meus objetos do banco que são os mesmos que vão aparecer nos meus programas PHP.

OBJETIVO
1. Gerar as classes automaticamente;
2. Controlar se o objeto é obrigatório ou não
3. A classe seja gerado dentro de um arquivo em formato php
4. Que esta classe gerada seja compativel com a versao PHP 5 ou superior
5. E esta classe possa ser alterada caso seja necessário ou extendida.

SOLUÇÃO
1. Code Generator
Source : codeGen.phps

REQUISITOS
1. Conhecer OOP para PHP
2. Ambiente para usar essa classe codeGen.php deve conter a packageDB da pear.php.net e obviamente a package principal da PEAR.php.net
3. Bando de dados MySQL com a estrutura que desejas transformar em classes

COMO USAR


// Package DB.pear.php
include_once('DB.php');

// Criação do objeto já estabelecendo a conexão com o banco de dados
// deve-se observar o ultimo parametro true, ele já vem como default false,
eh o indicador do debug, mostra o que está fazendo
$codeGen = new CodeGenerator('localhost','database','root','123456','mysql',true);
// Para a documentação da classe e dizer quem fez a classe
$codeGen->setAuthor("Rafael Stoever");
// Serve para rodar e gerar o script da tabela pessoa
$codeGen->run("pessoa");
// Serve para rodar e gerar o script da tabela usuario
$codeGen->run("usuario");


DETALHES INDISPENSÁVEIS
Deve ser observado que ao usar a classe da DB.pear.php.net podemos gerar scripts para vários bancos de dados, como oracle, pgsql e outros, mas como estou fazendo em minha casa onde só tenho MySQL instalado nao tive como fazer o processo em outros bancos. E assim que for feito em outro banco deve ser observado as classes do codeGenerator

          + getTableStructure()
          + CodeGenConnect()
          + abrTypes()
          + addFieldType()

Pois estes metodos tratam propriedades que vem do banco de dados, como tipagem de campos.
E do getTableStructure() deve ser visto como vem as flags do banco, no mysql vem como not_null para not null e em branco para null, e para as chaves
primárias aparece ao lado primary key, em outros bancos podem conter informacoes diferente ou em maiusculas. Se ativar o debug naquele momento irá aparecer a descrição que deve ser tratada e inserida.
(getTableStruture) Campos de controle do campo[idUsuario] flags->not null primary key
Esse foi o meu debug com o mysql da minha maquina.

E para mais detalhamento pode ficar a vontade de me questionar via comentário