CakePHP Brasil

27 abril 2010

Behavior Super Find veio ao mundo

Arquivado em: CakePHP — Tags:, , — Juan Basso @ 6:49 pm

Depois de ter criado o post sobre o Behavior para melhorar o find, cá está ele! Ontem a noite criei o projeto e enviei o código que tenho para o GitHub, no projeto entitulado de super_find.

Tinha dito que o nome seria power find, mas depois de ver alguns projetos na internet como o SuperAuth, SuperValidatable, etc., resolvi manter o nome de SuperFind.

Bem, vamos ao que interessa, o que faz e como funciona… Basicamente, ele serve para fazer um find podendo colocar condições de relacionamentos hasMany e HABTM. No CakePHP puro isto não é possível, pois ele joga estas condições na query direto e acaba causando um erro de SQL. Aí você dizer, mas e o Containable?! Bem, ele até faz alguns filtros, mas o filtro que ele faz é em cima do valor retornado da consulta principal. Vamos a um exemplo:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
$this->Usuario->find('all', array('contain' => array('Tarefa.nome = "Tarefa 1")));
/* Retorno:
    array(
        array(
            'Usuario' => array('id' => 1, 'nome' => 'Usuario 1'),
            'Tarefa' => array(
                array('id' => 1, 'nome' => 'Task 1', 'usuario_id' => 1)
            )
        ),
        array(
            'Usuario' => array('id' => 2, 'nome' => 'Usuario 2'),
            'Tarefa' => array(
            )
        ),
        array(
            'Usuario' => array('id' => 3, 'nome' => 'Usuario 3'),
            'Tarefa' => array(
            )
        ),
    )
*/
 
$this->Usuario->superFind('all', array('conditions' => array('Tarefa.nome' => 'Tarefa 1')));
/* Retorna:
    array(
        array(
            'Usuario' => array('id' => 1, 'nome' => 'Usuario 1'),
            'Tarefa' => array(
                array('id' => 1, 'nome' => 'Tarefa 1', 'usuario_id' => 1)
            )
        )
    )
*/

Em resumo, no Containable ele listou todos os usuários e no relacionamento Tarefa veio apenas os que tinham a ‘Tarefa 1′. Já no SuperFind ele mostrou apenas os usuários que tinham a ‘Tarefa 1′.

O mesmo funciona com relacionamentos HABTM. Para os relacionamentos hasOne e belongsTo não são necessários, pois isto já funciona nativamente.

Por enquanto é possível fazer isto apenas com um nível de filtro, ou seja, você não poderá colocar nas condições algo como Tarefa.Projeto.nome.

Bem, por enquanto é isso. Alguém tem mais sugestões do que poderia entrar? O que sente falta no find?

Abraços e bom uso.

31 março 2010

MeioUpload – refactory

Arquivado em: CakePHP — Tags:, — Juan Basso @ 7:47 pm

Depois de quase um ano, já vieram moscas, mas elas morreram, vieram aranhas, mas morreram também, só ficaram as teias aqui no blog. Depois da limpeza, volto com algumas novidades.

Pra voltar, gostaria de falar do último projeto que estou trabalhando, o MeioUpload. O MeioUpload foi um behavior iniciado pelo Vinícius Mendes no site Meio Código. O site do projeto era http://www.meiocodigo.com/projects/meioupload/

Como ele saiu do desenvolvimento do CakePHP e eu precisei incluir algumas validações, pedi a autorização e criei um projeto para ele no GitHub: http://github.com/jrbasso/MeioUpload

Com isso, alguns bugs foram surgindo, pedidos de novas features aqui e ali e sempre fui empurrando com a barriga. O grande Joze Gonzalez ajudou na documentação e algumas implementações também.

Como veio muita coisa nova e o código estava parecendo pinheirinho de natal, cheio de coisa pendurada, resolvi fazer um refactory geral nele. A versão com estas modificações é a 3.0, ainda em branch, liberei hoje a versão RC1 para download. Quem encontrar problemas ou ainda tiver alguma sugestão do que implementar, cria um ticket no github que irei dar uma analisada.

Ela não está 100% compatível com a versão anterior. Removi algumas configurações que eram possíveis e outras deixei automáticas (preenchidas através de algumas regras). Fiz isso para simplificar o código e evitar que tivessem várias configurações. Também atualizei a documentação e incluí (finalmente) testes automatizados no projeto. Os testes não cobrem 100% dos recursos, mas estamos caminhando para isso.

Quem tiver testado, por favor dê um feedback para saber para que lado andar com o projeto.

Abraços e obrigado a todos.

21 abril 2009

Behavior com métodos dos Correios

Arquivado em: CakePHP, Tutoriais — Tags:, — Juan Basso @ 7:35 pm

Após criar o plugin para validações de itens brasileiros, duas funçõezinhas para verificar itens dos Correios.

O código está junto do projeto Cake PT-BR, no GitHub.

Similar ao Behavior de Validação, as funções dos Correios foram colocadas dentro de um Behavior. O nome dele é Correios (sugestivo :-) ). Nesse behavior há dois métodos:

  • valorFrete: calcula o valor do frete. Parâmetros:
    • servico: define o tipo de serviço que será feito. Os valores válidos são através das constantes: CORREIOS_SEDEX, CORREIOS_SEDEX_A_COBRAR, CORREIOS_SEDEX_10, CORREIOS_SEDEX_HOJE, CORREIOS_E_SEDEX, CORREIOS_ENCOMENDA_NORMAL, CORREIOS_PAC.
    • cepOrigem: Cep de origem no formato XXXXX-XXX.
    • cepDestino: Cep de destino no formato XXXXX-XXX.
    • peso: Peso, em quilos, do item a ser transportado. O valor deve ser um número e não deve ultrapassar 30.
    • maoPropria:(opcional. Padrão falso) Valor boleano para indicar se o transporte é com mão prórpria.
    • valorDeclarado: (opcional. Padrão 0.00) Valor do item a ser transportado.
    • avisoRecebimento: (opcional. Padrão falso) Calculo com aviso de recebimento.

    O retorno será negativo em caso de erro, que podem ser as constantes:

    • ERRO_CORREIOS_PARAMETROS_INVALIDOS: Um ou mais parâmetros com formato ou conteúdo inválido.
    • ERRO_CORREIOS_EXCESSO_PESO: Peso acima do limite (30 Kg).
    • ERRO_CORREIOS_FALHA_COMUNICACAO: Problema de comunicação com o site dos Correios.
    • ERRO_CORREIOS_CONTEUDO_INVALIDO: O conteúdo retornado pelo Correios não é o esperado.

    Em caso de sucesso, será retornado um array com os seguintes indices:

    • ufOrigem: UF da Origem
    • ufDestino: UF do Destino
    • capitalOrigem: Valor booleano indicando se a origem é considerada capital
    • capitalDestino: Valor booleando indicando se o destino é considerado capital
    • valorMaoPropria: Valor, em reais, da mão própria
    • valorTarifaValorDeclarado: Valor da tarifa pelo valor declarado
    • valorFrete: Valor apenas do frente, sem incluir os valores de mão própria e tarifa do valor declarado
    • valorTotal: Soma de todos os valores anteriores
  • endereco: Informa o endereço baseado em algum CEP. O único parâmetro é o CEP no formato XXXXX-XXX. Os valores de retorno podem ser as constantes ERRO_CORREIOS_PARAMETROS_INVALIDOS, ERRO_CORREIOS_FALHA_COMUNICACAO ou ERRO_CORREIOS_CONTEUDO_INVALIDO em caso de erro. Em caso de sucesso, o retorno será um array com os indices logradouro, bairro, cidade e uf.

Bem, agora vamos aos códigos. Um exemplo usando o behavior:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
class Correios extends AppModel {
	var $name = 'Correios';
	var $useTable = false;
	var $actsAs = array('CakeBr.Correios');
 
	function frete($cepDestino) {
		// Supondo que é uma loja que transporta produtos pequenos (até 1Kg)
		return $this->valorFrete(CORREIOS_SEDEX, Configure::read('Loja.CEP'), $cepDestino, 1.0);
	}
}
 
// Outro caso
class Endereco extends AppModel {
	var $name = 'Endereco';
	var $actsAs = array('CakeBr.Correios');
 
	function beforeSave($options) {
		$endereco = $this->endereco($this->data['Endereco']['CEP']);
		if ($endereco < 0) {
			return false;
		}
		$this->data['Endereco'] = array_merge($this->data['Endereco'], $endereco); // Aqui serão incluídas as informações de logradouro, bairro, cidade e uf.
	}
}

Qualquer dúvida, estamos aí.

18 abril 2009

Validações brasileiras

Arquivado em: CakePHP, Tutoriais — Tags:, , , , , — Juan Basso @ 11:55 am

No CakePHP temos diversas validações que servem para os EUA, porém nenhuma para os padrões brasileiros.  Pensando nisso, resolvi fazer um behavior para fazer este tipo de validação. Por enquanto ele só valida CPF, CNPJ, telefone e CEP.

O código está junto do projeto CakePTBR no GitHub. Eu coloquei ele na forma de plugin, então basta copiar a pasta plugins para dentro do seu projeto (pasta app). Feito isto, ele já instalado e já pode ser usado nas models.

Nas models, deve ser incluído o behavior e usar a validação normalmente. Exemplo:

1
2
3
4
5
6
7
8
9
class Usuario extends AppModel {
	var $name = 'Usuario';
	var $actsAs = array('CakeBr.Validacao'); // Aqui inclui o behavior do plugin CakeBr
	var $validates = array(
		'cpf' => array(
			'rule' => 'cpf'
		)
	);
}

Este exemplo mostra como validar o campo cpf. Mais detalhes de como funciona a validação, veja no CookBook.

Bem, mas afinal, o que será validado?! Vamos detalhas um pouco mais cada uma das quatro funções de validação:

CPF

Se a regra for declarada apenas como cpf (idem exemplo acima), ele irá validar o CPF no formato XXX.XXX.XXX-XX e também fará o teste do dígito verificador (dois últimos números) para verificar se é um CPF válido.  Em determinadas situações, deseja-se enviar pro banco apenas os números, sem a formatação, pra isso, coloquei um parâmetro opcional que pode ser passado para fazer este teste. Na rule, deve ser colocado:

1
2
3
4
5
	var $validates = array(
		'cpf' => array(
			'rule' => array('cpf', true)
		)
	);

Deste modo ele irá validar apenas números.

CNPJ

Mesmo funcionamento do CPF, porém para CNPJ. A regra de apenas números também é válida. O formato do CPNJ é considerado XX.XXX.XXX/XXXX-XX.

CEP

O CEP, por padrão vai ser considerado nos formatos XXXXXXXX ou XXXXX-XXX. Caso queira alterar o separador, você pode definir da seguinte maneira:

1
2
3
4
5
	var $validates = array(
		'cep' => array(
			'rule' => array('cep', array('', '-', '.'))
		)
	);

No exemplo acima, ele vai validar os valores padrões e XXXXX.XXX.

Telefone

A validação do telefone se dará através das formatações:

  • XXXX-XXXX
  • (XX) XXXX-XXX (o espaço entre o fechamento de parênteses e o número é opcional, mas limitado a 1 espaço)
  • +XX (XX) XXXX-XXXX (idem anterior sobre o espaçamento)

Caso deseje validar apenas números, passar o parâmetro true na validação. Neste caso, ele validará números com 8 ou 10 caracteres.

Bem, são estas as validações que fiz por enquanto. Caso alguém tenha uma sugestão de nova validação ou dúvida sobre as apresentadas, fique a vontade de comentar.

Powered by WordPress