segunda-feira, 27 de abril de 2009

A função que precisava!

Em seu trabalho, um dia você vai precisar transformar aquele dado 0/1 em ativo/inativo na visão.

A idéia seria a seguinte:
($variavel == 1) ? "ativo" : "inativo";

Respeitando MVC, não deveremos colocar esta lógica na view, de forma alguma.
A view tão somente deve exibir os dados setados a ela.
Para exibir esses dados devem ser modificados no controller. Sendo $variavel já enviada com "ativo" ou "inativo".

Em CAKEBAKER ele fala sobre a mesma idéia só que trabalhando do model para o banco.

Busquei tratar o valor de $variavel que seria impresso na view no controlador visto que ele é responsável por enviar os dados a mesma. Então que sejam enviados os dados de forma correta.

Já na hora de tratar com banco, a responsabilidade é do modelo.

Parei para pensar um pouco sobre como realizar isso com próprio sql.
Numa leitura superficial encontrei um artigo que falava sobre o uso CASE em SELECTS.
Vejam se a idéia não é parecida com o exemplo dado neste blog?

select
CASE month when "01" then "January"
when "02" then "February"
when "03" then "March"
END
from calendar where year = "2005" order by month

Fonte principal : http://dev.mysql.com/doc/refman/4.1/pt/control-flow-functions.html

2 comentários:

Joao Jose Pedrini disse...

Olá Angellica,

Minha opinião é que esta lógica é sim da visão. Uma verificação desta poderá definir se minha página vai ficar Vermelha ou Verde, eu poderei exibir um texto em Português ou Inglês, várias responsabilidades que a visão é responsável.

Lógica é sim utilizada em Visão tanto que temos os Helpers justamente para isso. Helper é uma outra classe mas o é totalmente voltado para a Visão.

O problema da implementação do CakePHP de Modelos é que ele não trabalha realmente com Objetos. Nossos Controllers buscam os dados nos Models e nos retornam Arrays. Infelizmente isto nos tira o poder de utilizarmos as abstrações dos objetos.

O ideal ai é que pudéssemos utilizar ter uma lista de objetos, que pudéssemos criar métodos públicos como isActive() e ele nos retornar true ou falso, mesmo que a lógica do isActive não seja um simple ($active)?true:false; Com este retorno, utilizamos os Helpers para fazer a exibição, ou mesmo um Element, caso seja algo simples.

Abraços

Daniel Golgher disse...

Olá Angelica!

No site do cake tem um pdf interessante para sua questão:

http://cakephp.org/files/Slides/OCPHP.pdf

La tem uma imagem com o bolo bem feito e o mal feito. No cake 1.1 a visão era um MVC com uma camada de controle maior. No Cake 1.2 a intenção é deixar o modelo maior.

Para este seu problema vc pode usar um callback no próprio modelo afterFind e tratar sua busca.

Caso vc tenha interesse de usar em vários modelos vc pode fazer um behavior.

Um behavior que tem uma lógica parecida com o que vc está querendo é o soft delete, vc pode encontra-lo aqui:

http://bakery.cakephp.org/articles/view/soft-delete-behavior

Abraços!
Daniel