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.

23 abril 2010

Nova release do CakePHP

Arquivado em: CakePHP — Tags:, — Juan Basso @ 8:22 am

Hoje foi liberada a release 1.2.7 do CakePHP, corrigindo 36 bugs, sendo um uma questão de segurança.

Uma pequena correção de segurança também foi feita nesta versão. Este problema de segurança afeta apenas os sistemas que utilizam o modo debug em produção. Caso deseja apenas corrigir o problema de segurança, sem atualizar o core inteiro, você pode aplicar o patch disponibilzado por eles em http://bin.cakephp.org/view/1459556460.

A nova versão (1.2.7) está disponível no GitHub. A lista completa das alterações pode ser vista no Changelog.

Lembro também que está previsto para domingo o lançamento da versão 1.3.0-RC5! Vamos aguardar pra ver.

22 abril 2010

Behavior para melhorar o find

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

Hola!

Estava aqui implementando alguns projetos e vi o quão chato é ter que implementar os models no cake sempre pensando nas queries que ele irá gerar.

As vezes vou fazer um find em models que tenham hasMany e quero fazer um filtro pelo model do hasMany e não consigo. Se eu coloco no conditions ele diz que a tabela do hasMany não existe. Se eu uso Containable ele mostra todos os registros do model que fiz o find com alguns tendo associações vazias. Ou seja, ele não faz JOIN com as tabelas hasMany nesses casos, sempre gerar queries diferentes e não sabe tratar direito.

Pensei em implementar isto no core do cake e propor para eles, mas a release 1.3 está fechada para enhancements, então ficaria para a versão 1.4/2.0 que sabe-se lá quando vem… Pensei então em um plugin para implementar isto, mas aí entra meu maior problema em computação: qual o nome?! :P

Alguém tem alguma sugestão? Como será um projeto a nível internacional, pensei em “SuperFind”, “FindPlusPlus”, “xFind”… Alguém tem alguma melhor?

No começo será mais para melhorar os relacionamentos de joins e afins, mas futuramente trabalhar melhor um pouco os casos de limit nos relacionamentos e outras coisitas a mais do find.

4 abril 2010

Plugin CakePtbr

Arquivado em: CakePHP — Tags:, , — Juan Basso @ 5:15 pm

Como alguns já devem conhecer, dou continuidade ao trabalho iniciado pelo Gabriel Gilini no GitHub. Ele iniciou colocando as inflections geradas pelo Sadjow, depois algumas atualizações que fiz, e assim foi… Depois de um tempo fiz um fork do projeto dele no GitHub e fui incluindo novas features, como validações (cpf, cnpj, etc.), behaviors, helpers, etc. Além disso, inclui testes automatizados para todos os itens existentes no plugin. No link do projeto você pode ver todos recursos que foram feitos: http://github.com/jrbasso/cake_ptbr

Agora, com as releases candidates do CakePHP 1.3, criei um branch (chamado 1.3) para fazer os devidos ajustes. Ou seja, se você já está usando o CakePHP 1.3, use a versão do branch 1.3 do cake_ptbr.

Neste branch da versão 1.3 entraram e sairam algumas coisas, dentre elas:

  • Validação de CPF/CNPJ: Foram removidas. O código delas foi transferido para o plugin oficial do Cake (localized) que trata só de internacionalização;
  • Geração de bolos em português: Quando você gerar models, views ou controllers via bake, eles já sairam do forno falando português!

Os demais recursos existentes na versão 1.2 continuarão valendo para a versão 1.3. Novos recursos estão na lista para serem implementados (falta um pouco de tempo): integração com PagSeguro, geração de boletos bancários e ajuste de número.

Quem tiver novas idéias de itens para implementar neste plugin, responda este post ou então crie uma issue no GitHub.

Abraços e bom uso para todos.

Powered by WordPress