Onde formatar?
Estamos usando o padrão MVC, mas onde é o melhor local para formatar um valor? No Model, no View, ou no Controller?
Model) Foi feita uma tentativa de formatar no Model, existem duas classes Model que deveriam receber a implementação: Modelo e Grid.
- Classe Modelo: os atributos desta classe seriam formatados automaticamente após rodar o método "encontrar" (que carrega os valores). Notou-se que se o valor de um atributo estivesse sempre formatado no Model, quando o Controller fosse utilizá-lo para efetuar cálculos (datas, monetários, etc) ele teria que "desformatar" o valor e depois formatar novamente. Sendo que o Controller fazer isso é algo bastante comum. Um outro problema registrado foi o fato de que nem sempre se deseja todos os atributos formatados, pois na página de consulta se necessita os valores de um jeito, mas na alteração de outro.
Uma solução para estes problemas foi criar um método que retornasse um array com os valores formatados, sendo que os valores dos atributos permaneciam originais.
- Classe Grid: a formatação via Model, para montantes de dados carregados em grid's, implicaria na construção de um método que percorreria todos os valores e formataria de acordo com o tipo de dado.
Problema de implementar formatação nesta camada: muitas vezes temos tipos de dados que tem uma
formatação própria (independe do tipo no BD). Exemplo: campos monetários
(no BD é numérico), CPF, CNPJ, telefone, etc. Nestes casos, se chegou a
implementar um método para formatação personalizada de atributo na classe Modelo, porém para a classe Grid se viu dificuldade em se ter a formatação em montantes de dados grandes e, principalmente, a identificação de campos com formatação personalizada.
View) Nesta camada a formatação ocorre somente no momento de exibir os dados para o usuário. Ou seja, todas as formatações que se deseja fazer devem ser explicitamente declaradas. Esta já era a maneira utilizada para formatação no phpNucleum 4.x, um diferencial que foi implementado no phpNucleum 5 é a utilização pelo Smarty dos mesmos métodos de formatação usados no PHP. Exemplo:
CPF: {$valoresTeste.cpf|escape|formatarCpf}
Valor: {$valoresTeste.valor|escape|formatarMonetario}
Os modificadores 'formatarCpf' e 'formatarMonetario' são os próprios métodos Auxilio::formatarCpf e Auxilio::formatarMonetario. Desta forma o código de formatação não fica redundante (pelo menos entre o PHP e o Smarty).
Os locais que possuem funções de formatação são:
- PHP (phpNucleum\Auxilio)
- jnGrid (e suas dependências)
- jnCalendar (e suas dependências)
- iReport
É fato que usando esta camada se perde a configuração única de localização, pois ao se desejar a alteração de uma configuração de formatação de data/valor, devem ser alteradas as configurações em todos os locais acima mencionados. Porém notou-se que usando a camada Model e Controller isto também aconteceria, pois a configuração de formatação do jnCalendar e do iReport seria necessária de qualquer maneira.
Controller) Não se percebeu muita diferença entre realizar a formatação nesta camada e na camada View. Porém o problema de formatar montantes grandes de dados se repetiria nesta camada (percorrer todos os registros e fazer formatação personalizada).
Conclusão
Todas as camadas tem seus prós e contras, as camadas Model e Controller têm problemas com desempenho, pois percorrer 18 mil registros para formatar valores de cpf, data, valores, etc é bastante custoso em termos de memória e processamento. Na camada View sofremos com a falta de um arquivo único de configuração, porém se percebeu que tal problema acontece também no Model e no Controller. Outra característica da View é que não existe formatação automática (tudo é explicitado). A característica de formatação automática pode ser visto como vantagem e também como desvantagem, ou seja, como tudo na informática, DEPENDE.
Em razão do exposto acima, levando-se em conta principalmente o fator desempenho, optou-se por utilizar a camada View na formatação dos dados.
segunda-feira, 25 de outubro de 2010
phpNucleum 5 - Formatação de datas
Mudanças na classe Auxilio:
- O método obterDataFormatada($dataiso,$formato) foi renomeado para formatarDataViaGetDate($dataiso,$formato)
- O método obterDataFormatadaPadraoStrftime($timestamp,$formato) foi renomeado para formatarDataViaStrftime($timestamp,$formato)
- Adicionalmente, foi criado o método formatarData($dataiso,$formato), que recebe uma data em formato ISO e converte para o formato especificado no padrão strftime ("%d/%m/%Y"). Internamente, o método formatarData converte a data ISO em timestamp e chama o método formatarDataViaStrftime. - O método formatarData utiliza o formato que está no XML da aplicação caso o parâmetro $formato não seja especificado.
Isto foi feito pois o comando utilizado pelo método que utiliza strtime permite obter dias da semana e nomes de mês em português.
Porém, o retorno do nome destes detalhes em português não funciona com períodos menores que 1970 e maiores que 2038.
Exemplos:
Caso de teste 1: OK, data 31/12/2010.
Caso de teste 2: ERRO, data 31/12/2010.
Para obter a data atual basta chamar: N::$objAuxilio->formatarData(false, "%d/%m/%Y");
- O método obterDataFormatada($dataiso,$formato) foi renomeado para formatarDataViaGetDate($dataiso,$formato)
- O método obterDataFormatadaPadraoStrftime($timestamp,$formato) foi renomeado para formatarDataViaStrftime($timestamp,$formato)
- Adicionalmente, foi criado o método formatarData($dataiso,$formato), que recebe uma data em formato ISO e converte para o formato especificado no padrão strftime ("%d/%m/%Y"). Internamente, o método formatarData converte a data ISO em timestamp e chama o método formatarDataViaStrftime. - O método formatarData utiliza o formato que está no XML da aplicação caso o parâmetro $formato não seja especificado.
Isto foi feito pois o comando utilizado pelo método que utiliza strtime permite obter dias da semana e nomes de mês em português.
Porém, o retorno do nome destes detalhes em português não funciona com períodos menores que 1970 e maiores que 2038.
Exemplos:
Caso de teste 1: OK, data 31/12/2010.
$data = "2010-12-31";
$dataF = N::$objAuxilio->formatarData($data, "%d/%m/%Y %A");
var_dump($dataF);
$dataF = N::$objAuxilio->formatarDataViaGetDate($data, "d/m/Y l");
var_dump($dataF);
/* Saída:
string '31/12/2010 sexta' (length=16)
string '31/12/2010 Friday' (length=17) */
Caso de teste 2: ERRO, data 31/12/2010.
$data = "1965-12-31";
$dataF = N::$objAuxilio->formatarData($data, "%d/%m/%Y %A");
var_dump($dataF);
$dataF = N::$objAuxilio->formatarDataViaGetDate($data, "d/m/Y l");
var_dump($dataF);
/* Saída:
string '31/12/1965 Friday' (length=17)
string '31/12/1965 Friday' (length=17) */
Para obter a data atual basta chamar: N::$objAuxilio->formatarData(false, "%d/%m/%Y");
Marcadores:
changelog,
datas,
formatação,
phpNucleum
sexta-feira, 24 de setembro de 2010
Como percorrer um array em PHP sem usar foreach
A função foreach utiliza muito espaço em memória e pode até dar estouro de memória se o array for muito grande. Este problema acontece quando alteramos valores do array dentro do foreach.
Uma alternativa para percorrer um array grande é movimentar o ponteiro interno do array.
$registro = reset($listaDeRegistros);
while ($registro !== false) { //foreach estoura memória
$i = key($listaDeRegistros);
//faça o que quiser.... var_dump($listaDeRegistros[$i]);
$registro = next($listaDeRegistros);
}
Uma alternativa para percorrer um array grande é movimentar o ponteiro interno do array.
$registro = reset($listaDeRegistros);
while ($registro !== false) { //foreach estoura memória
$i = key($listaDeRegistros);
//faça o que quiser.... var_dump($listaDeRegistros[$i]);
$registro = next($listaDeRegistros);
}
sexta-feira, 25 de junho de 2010
Instalação do Subversion (integrado com Apache)
Basta seguir este tutorial: http://ubuntuforums.org/showthread.php?t=51753&page=2
Algumas ressalvas:
Algumas ressalvas:
- O comando "apache2-ssl-certificate" não existe. Ao invés disso deve ser feito:
- sudo mkdir /etc/apache2/ssl
- sudo /usr/sbin/make-ssl-cert /usr/share/ssl-cert/ssleay.cnf /etc/apache2/ssl/apache.pem
- Ao editar o dav_svn.conf, adicione as seguintes linhas após o AuthUserFile
- Require valid-user
- SSLRequireSSL
Marcadores:
apache,
instalação,
subversion
sexta-feira, 4 de junho de 2010
quinta-feira, 20 de maio de 2010
Validação XML usando XSD
Visando padronizar o uso da validação XML utilizando arquivo XSD, publicarei aqui alguns problemas que passei e a respectiva solução.
- Para facilitar o trabalho de criar o XSD, é possível transformar um XML em XSD?
Sim, basta acessar http://www.flame-ware.com/Products/XML-2-XSD/
- Como validar uma lista enumerada no XSD?
- Como ter um elemento inteiro (ou qualquer outro tipo) que aceite vazio no XSD?
- Como validar e-mail no XSD?
quarta-feira, 28 de abril de 2010
Membro do NSA selecionado para projeto da Google
Leonardo Sápiras, membro do NSA e aluno do curso de Sistemas de Informação da FACCAT, concorrendo com estudantes graduandos, mestrandos, doutorandos e pós-doutorandos de universidades do mundo todo, foi um dos selecionados para trabalhar em projeto do Google Summer of Code (GSoC), programa da empresa Google que oferece bolsas a estudantes programadores de softwares. A lista dos selecionados foi divulgado no dia 26 de abril, no site específico do GSoC [http://socghop.appspot.com/].
Os alunos selecionados passam três meses trabalhando no desenvolvimento de algum dos projetos patrocinados pela Google. Especificamente, o Leonardo irá trabalhar em melhoramentos da ergonomia do software phpPgAdmin (famoso sistema Software Livre da área de Bancos de Dados). Esse projeto foi aceito pela Google, pela própria phpPgAdmin e pela organização mantenedora do PostgreSQL, um dos mais reconhecidos sistemas gerenciadores de banco de dados e que será a organização “mentora” da proposta do Leonardo.
Marcadores:
ergonomia,
google,
google summer of code,
gsoc,
phppgadmin
segunda-feira, 19 de abril de 2010
Guia definitivo da IDE Eclipse
Inclui SubVersion, Smarty, Debugger e Problemas
Guia Eclipse NSA
Guia Eclipse NSA
Marcadores:
debug,
eclipse,
problemas,
smarty,
smartypdt,
subversion,
subversive
sexta-feira, 16 de abril de 2010
Software a ser instalado após formatação
Pacotes a serem instalados
Atenção! Alguns pacotes não estão mais no repositório padrão do Ubuntu a partir da versão 10.04. Para eles estarem disponíveis siga estes passos:
Ferramentas NSA (encontrados no "docs/ferramentas")
Atenção! Alguns pacotes não estão mais no repositório padrão do Ubuntu a partir da versão 10.04. Para eles estarem disponíveis siga estes passos:
- Synaptic->Configuração->Repositórios->Outro software
- Selecione o repositório "partner" e clique em Fechar
- Clique em Recarregar. Agora o sun-java6-jdk irá aparecer.
- build-essentials
- rpl
- guake
- acroread
- openssh-server
- apache2
- php5
- php5-gd
- php5-cli
- php5-ldap
- php5-mysql
- php5-pgsql
- php5-xdebug
- php5-curl
- postgresql
- mysq-server
- sun-java6-jdk
- Rodar o comando "sudo update-alternatives --config java" para escolher o Java da SUN
- subversion
- vim
- alien
- Pacote opcional para instalar pacotes RPM (Red Hat). Para usar o alien faça: sudo alien -i pacote.rpm
Ferramentas NSA (encontrados no "docs/ferramentas")
- Billfish
- Astah
- DbDesigner Fork
- Eclipse PDT
- Plugin SubVersive (SvnKit connector)
- Plugin SmartyPDT
Marcadores:
instalação,
pacotes,
ubuntu
segunda-feira, 12 de abril de 2010
Instalação do PostgreSQL 8.2 no Ubuntu 9.04 ou superior
Para instalar o PostgreSQL 8.2.x no Ubuntu 9.04 ou superior, os seguintes passos devem ser seguidos:
1) Entrar no gerenciador de pacotes Synaptic;
2) Entrar em 'Configurações', e depois em 'Repositórios';
3) Na aba 'Programas de terceiros', clicar em 'Adicionar' e preencher com:
deb http://cz.archive.ubuntu.com/ubuntu hardy main universe
ou o mirror brasileiro
deb http://sft.if.usp.br hardy main universe
4) Confirmar inclusão do repositório;
5) Verificar se o repositório novo está selecionado na aba 'Programas de terceiros';
6) Na tela principal do Synaptic clicar em 'Recarregar';
7) Após os Synaptic recarregar as informações dos pacotes, pesquisa por PostgreSQL;
8) Selecione a opção 'postgresql-8.2';
9) Clique em 'Aplicar';
10) Após a instalação do ocorrer, entre novamente na tela de configuração de repositórios (Passo 2);
11) Desmarque o repositório do Ubuntu Hardy;
12) Recarregue os pacotes novamente;
13) Fim.
1) Entrar no gerenciador de pacotes Synaptic;
2) Entrar em 'Configurações', e depois em 'Repositórios';
3) Na aba 'Programas de terceiros', clicar em 'Adicionar' e preencher com:
deb http://cz.archive.ubuntu.com/ubuntu hardy main universe
ou o mirror brasileiro
deb http://sft.if.usp.br hardy main universe
4) Confirmar inclusão do repositório;
5) Verificar se o repositório novo está selecionado na aba 'Programas de terceiros';
6) Na tela principal do Synaptic clicar em 'Recarregar';
7) Após os Synaptic recarregar as informações dos pacotes, pesquisa por PostgreSQL;
8) Selecione a opção 'postgresql-8.2';
9) Clique em 'Aplicar';
10) Após a instalação do ocorrer, entre novamente na tela de configuração de repositórios (Passo 2);
11) Desmarque o repositório do Ubuntu Hardy;
12) Recarregue os pacotes novamente;
13) Fim.
Marcadores:
hardy,
postgresql,
synaptic,
tutorial,
ubuntu
Assinar:
Postagens (Atom)
.jpg)