Trabalhando com Filtros com Zend_Filter
Deixe um Comentário
Filtros e validadores são comumente usados junto com formulários, mas essa prática já foi relatada no artigo sobre Formulários com Zend Framework, agora pretendo falar um pouco sobre como utilizar esses mesmos filtros em outras situações que não envolvam formulários.
O que são Filtros
A diferença básica entre filtros e validadores e que enquanto os validadores apenas verificam se um determinado valor condiz com aquilo que é requerido e retorna o resultado dessa validação sem alterar o valor fornecido no início os filtros tentam alterar esse valor para que ele se adeque ao necessário. Para exemplificar digamos que precisamos receber de alguma aplicação uma string no formato CamelCase (cada palavra da string começando com letras maiúsculas), mas o que acontece é que na verdade recebemos uma string no formato string_dash (palavras separadas por “_”), se submetermos o valor recebido a um validador ele irá apenas retornar a informação de que a String recebida não se adequa ao padrão necessário (false) enquanto se submetermos a mesma string a um filtro (DashToCamelCase() nesse exemplo) ele irá tentar alterar o valor para coincidir com o padrão e então irá retornar o valor já alterado.
Uso Básico dos Filtros
A Utilização de filtros com Zend_Filter é bastante simples, para sua execução basta criar um instância da classe do filtro desejado (Para um lista completa das classes suportadas consulte a documentação da classe Zend_Filter) e em seguida chamar o método filter() dessa classe passando como parâmetro o valor que deve ser filtrado, da seguinte forma.
$filter = new Zend_Filter_Digits();
echo $filter->filter('Valor com Números 123'); // 123
No exemplo acima foi usada a classe Zend_Filter_Digits que remove todos os caracteres que não são numéricos de uma string deixando apenas os números, nesse exemplo será impresso na tela o valor “123″.
Filtros em Cascata
Em alguns casos é preciso usar uma série de filtros na sequência para se conseguir o resultado desejado, esse processo é quase tão simples quanto a utilização de filtros individuais, para isso basta criar uma instância da classe Zend_Filter e através do método addfilter() adicionar os filtros desejados à sequência, por fim chamar o método filter dessa classe da mesma forma como anteriormente, o exemplo a segui ilustra o que foi dito:
$string = "&palavra&"; $cascata = new Zend_Filter(); $cascata->addFilter(new Zend_Filter_Alpha()) ->addFilter(new Zend_Filter_StringToUpper()); $stringFiltrada = $cascata->filter($string);
Nesse exemplo é preciso que sejam eliminados os caracteres não alphanumericos (Zend_Filter_Alpha) de uma string e em seguida é preciso transformar os caracteres dessa string em letras maiúsculas (Zend_Filter_StringToUpper), a saída desse exemplo será portanto o termo “PALAVRA”.
Criando Filtros Personalizados
Apesar de existir um grande números de filtros nativos no Zend Framework é possível que você precise realizar um filtro que não esteja presente nativamente, um exemplo bastante comum disso no Brasil é a formatação do CEP para o formato XXXXX-XXX a partir de uma entrada numérica. Para isso basta criar uma classe da seguinte forma:
class FiltraCep implements Zend_Filter_Interface
{
public function filter($cep)
{
$inicio = substr($cep, 0, 5);
$termino = substr($cep, 5);
$cepFiltrado = $inicio.'-'.$termino;
return $cepFiltrado;
}
}
E depois utilizar a classe da mesma forma que um filtro comum:
$filter = new FiltraCep();
echo $filter->filter('00000000'); // 00000-000
Nesse exemplo tudo que foi feito foi criar uma classe FiltraCep que implementa a classe Zend_Filter_Interface e nela criar um método filter() que recebe o cep não formatado como parâmetro, separa essa string em duas partes ($inicio e fim), concatena com um hífen (“-”) e depois retorna o valor formatado.
Nesse exemplo utilizamos “FiltraCep” como nome dessa classe, mas é interessante que você nomeia essa classe seguindo as boas práticas de nomenclatura do Zend Framework para que você possa usufruir das vantagens do Autoload, caso contrário você terá que incluir o arquivo da classe manualmente no seu Controller.
Conclusão
Através desses exemplos procurei demonstrar como utilizar os filtros presentes no Zend Framework fora do contexto do formulário, apesar de eles serem mais utilizados em conjunto também é muito comum necessitar desses filtros fora desse contexto, e é muito melhor utilizar as classes já existente do que criar novas classes para fazer a mesmo coisa e muito melhor ainda do que realizar iterações nos valores manualmente.