-
Notifications
You must be signed in to change notification settings - Fork 0
Home
É necessária uma instalação do Zend Framework 1.11 funcionando.
Copie o diretório Troll e seus conteúdos para o diretório library do seu projeto.
Configure o autoloader no bootstrap:
// Usando apenas "ClassName" ao invés de "Model_ClassName"
$autoloader->removeResourceType('model');
$autoloader->addResourceType('model', 'models', '');
// Usando apenas "DbTable_ClassName" ao invés de "Model_DbTable_ClassName"
$autoloader->removeResourceType('DbTable');
$autoloader->addResourceType('DbTable', 'models/DbTable', 'DbTable');
// Carrega "namespace" Troll_ (no futuro, vamos usar namespaces mesmo.. que venha o Zend 2)
$autoloader->setFallbackAutoloader(true);
$autoloader->registerNamespace(Troll_');
No exemplo, estamos definindo duas classes relacionadas. Troll_Database_Table é apenas uma especialização da Zend_Db_Table_Abstract, e se comporta como tal.
class DbTable_Servico extends Troll_Database_Table
{
protected $_name = 'servico';
}
class Servico extends Troll_Model { }
class DbTable_Protocolo extends Troll_Database_Table
{
protected $_name = 'protocolo';
}
class Protocolo extends Troll_Model {}
Para definir os relacionamentos, basta indicá-los na classe da tabela, com um atributo adicional refClass, indicando qual o nome da Classe da tabela a qual se refere.
class DbTable_Servico extends Troll_Database_Table
{
protected $_name = 'servico';
protected $_dependentTables = array('DbTable_Protocolo');
}
class DbTable_Protocolo extends Troll_Database_Table
{
protected $_name = 'protocolo';
protected $_referenceMap = array(
'servico' => array( // "servico" será usado como nome de atributo
'columns' => 'id_servico', // Colunas da tabela local
'refClass' => 'Servico', // Classe ao qual o relacionamento se refere
'refTableClass' => 'DbTable_Servico', // Classe da tabela do relacionamento
'refColumns' => 'id', // Colunas-chave na tabela-alvo
),
);
}
Para buscar um registro qualquer, use o método find():
$protocolo = Protocolo::find(12); // Busca o protocolo de ID 12
Você poderá incluir subconsultas na sua busca (desta forma, sem ocorrer o problema N+1):
$protocolos = Protocolo:all(
':cols' => array('id', 'nome'), // Somente atributos ID e Nome
':include' => array('servico' => array(':cols' => array('id', 'nome'))), // Inclui subtabela "servico", buscando apenas o ID e o Nome
'id > ?' => 5, // Onde o ID é maior que 5
);
Por padrão, as consultas são feitas passando-se uma coluna e um argumento, ou uma expressão e um argumento:
$protocolos = Protocolo::all(array('id_usuario' =>$usuario->id, 'data > ?' => new Zend_Date()));
No entanto, você poderá simular as consultas do método fetchAll() da seguinte forma:
$protocolos = Protocolo::all(array(':where' =>'id_usuario is not null', ':order' =>'nome desc')); // O mesmo com :limit, :offset
Criando um novo registro:
$protocolo = new Protocolo(array('nome' => 'Teste'));
$protocolo->servico = $servico;
// Ops! Não salvou!
if (!$protocolo->save()) {
// Mostre-me os erros
$protocolo->setFormErrors($form, 'subform_protocolo'); // segundo par. opcional
}
else {
// Exibir ID do objeto
echo $protocolo->id;
}
Editando um registro:
$protocolo = Protocolo::find(12); // poderia ser find(array('id' => 12))), mas ele identifica que só há uma coluna PK chamada "id"
$protocolo->nome = 'Outro teste';
Mandando pro espaço!
$protocolo->delete();
Por padrão, a classe identificará validações padrão, como por exemplo os tipos data, número, etc., as larguras máximas de strings e campos do tipo “not null”.
Para validações personalizadas, reescreva o método protegido _customValidations().
////
protected function _customValidations()
{
// Faça suas validações como bem entender, e retorne setando o valor para false.
if (false !== strpos($usuario->nome, 'palavrão')) {
$this->__addError('nome', 'O nome não pode ter palavrão!');
}
// Se não quiser gerar uma mensagem de erro, apenas sete o isValid para falso
# $this->__isValid = false;
}
////
Caso você não queira que o objeto use o setter ou getter padrão, basta re-implementá-lo nos seguintes formatos:
class Protocolo extends Troll_Model
{
public function setNomeDaColuna($value)
{
$this->_attributesData['nome_da_coluna'] = $value; // Ou seja lá o que você precisar
}
public function getNomeDaColuna()
{
return $this->_attributesData['nome_da_coluna'];
}
}
Caso você precise que a classe execute determinadas operações antes/depois de salvar (ou inserir, ou atualizar) ou excluir, sobrescreva os seguintes métodos protegidos:
beforeSave(); // Antes de salvar, não importa se insere ou atualiza
afterSave(); // Após salvar
beforeInsert(); // Antes de inserir um NOVO registro
afterInsert(); // Depois de inserir
beforeUpdate(); // Antes de atualizar um registro EXISTENTE
afterUpdate(); // Depois de atualizar
beforeDelete(); // Antes de excluir
afterDelete(); // Depois de excluir
Em alguns casos você terá uma tabela com determinadas colunas, e os atributos com nomes completamente diferentes. Para resolver isto, veja o seguinte caso:
// Tabela no SGDB Oracle
class DbTable_Pessoa extends Troll_Database_Table
{
protected $_name = 'PESSOA';
protected $_attributesMapping = array(
'id' => 'CODPES', // Pro objeto, é id, pro banco de dados, é CODPES
'nome' => 'NOMPES', // Pro objeto é nome, pro banco de dados, é NOMPES
);
}
Basta realizar esta configuração e o sistema detectará as colunas certas quando você chamar os atributos.
Você também tem a opção de definir determinadas funções que serão aplicadas em uma coluna ao consultá-la.
class DbTable_Pessoa extends Troll_Database_Table
{
protected $_name = 'PESSOA';
protected $_selectFilters = array(
'NOMPES' => 'F_NOME_PROPRIO(?)'
);
protected $_attributesMapping = array(
'id' => 'CODPES',
'nome' => 'NOMPES',
);
}