The online documentation is produced by a web publishing technology created by us to read the documents origins in OpenOffice Writer (ODT) and Microsoft Word (docx) formats and produces native web and PDF versions. In this way we maintain Louder project documentation update and in sync on each of its formats.
El componente Filter proporciona un conjunto de filtros de datos y una interfase consistente para su aplicación a datos y entrada de usuario en un proceso de negocio.
Los filtros están diseñados para transformar datos, quitar partes indeseadas, eliminar espacios ó caracteres innecesarios y en resumen asegurarse que una variable contiene lo que se espera que contenga.
El aplicar los filtros adecuados a la entrada de usuario constituye el primer paso para cerciorarse que los procesos de negocio se ejecutaran utilizando datos que en cierta forma no dañen ni alteren el flujo y estado normal de una aplicación.
Estructura del Componente
El componente lo constituye la clase Filter y una serie de filtros base de uso general que incluye el framework para su aplicación al común de aplicaciones Web de negocios.
Los filtros base son los siguientes:
Tabla: Filtros base del componente Filter
Nombre
Nombre Corto
Uso/Descripción
Alnum
alnum
Filtra caracteres alfanuméricos (letras y números).
Alpha
alpha
Filtra letras del abecedario occidental incluyendo caracteres latinos como vocales con tilde y eñes.
AddSlaches
addslaches
Escapa las comillas simples y dobles para evitar inyección de SQL.
BaseName
basename
Filtra un path para obtener el nombre del archivo ó el último directorio.
Date
date
Filtra una cadena de caracteres devolviendo una fecha que coincida con la expresión regular '/(19|20)(\d{2})[-\/](\d{1,2})[-\/](\d{1,2})/' ó el formato YYYY-MM-DD.
Digits
digits
Filtra una cadena para que contenga solo dígitos (números del 0 al 9)
Double
double
Filtra un valor devolviendo un valor numérico de alta precisión.
Email
email
Filtra una cadena de caracteres devolviendo un correo electrónico valido.
Extraspaces
extraspaces
Filtra una cadena de caracteres eliminando espacios y saltos de línea al principio y final de la cadena.
Float
float
Filtra un valor devolviendo un valor numérico de alta precision
HtmlEntities
htmlentities
Convierte todos los caracteres aplicables de una cadena de caracteres a sus entidades HTML correspondientes.
HtmlDecode
htmldecode
Convierte entidades HTML a su carácter UTF-8 correspondiente.
Identifier
identifier
Filtra un valor dejando solo un identificador de variable valido.
Int
int
Filtra el valor recibido en un entero de 32bit ó 64 bit dependiendo de la plataforma.
Ipv4
ipv4
Filtra una cadena de caracteres devolviendo una dirección IP versión 4.
Ipv6
ipv6
Filtra una cadena de caracteres devolviendo una dirección IP versión 6.
Lower
lower
Filtra una cadena de caracteres devolviéndola en minúsculas. Este filtro respeta el charset de la aplicación.
Locale
locale
Filtra una cadena de definición de localización UNICODE.
Md5
md5
Convierte una cadena de caracteres a su resumen criptográfico md5
Numeric
numeric
Convierte el valor recibido en valor numérico.
Onechar
onechar
Filtra la cadena para obtener un solo carácter.
Stripspace
stripspace
Elimina los caracteres espacios en toda la cadena de caracteres recibida.
Striptags
striptags
Elimina las etiquetas HTML que contenga la cadena de caracteres recibida.
Stripslaches
stripslaches
Des-escapa una cadena de carácteres convirtiendolos a sus carácteres de comillas normales.
Upper
upper
Filtra una cadena de caracteres devolviéndola en mayúsculas. Este filtro respeta el charset de la aplicación.
Utf8
utf8
Convierte una cadena de caracteres en ISO-8859-1 a UTF-8
Usar filtros en forma directa
Para aplicar un filtro a un valor en forma directa es necesario instanciar la clase Filter e invocar el método applyFilters enviando como primer parámetro el valor a filtrar y como parámetros siguientes los nombres cortos de los filtros a aplicar:
Es necesario crear una instancia de filter por cada combinación de filtros que se requieran aplicar ya que cada objeto filter almacena en un buffer estos filtros:
El método estático Filter::load carga uno ó más filtros ya sean de usuario ó base luego se agregan los filtros y se aplican como es estándar. Los filtros también pueden agregarse por su nombre corto, agregar varios a la vez y mezclarlos. El orden en que se agregan indica el orden de aplicación:
Ejemplo: Aplicar múltiples filtros a un valor
<?php
Filter::load("striptags", "email", "lower", "special");
$filter = new Filter();
$filter->addFilter("striptags");
$filter->addFilter("email", new LowerFilter());
$filter->addFilter(new SpecialFilter());
echo $filter->applyFilter("<b>ANEWUSER@YAHOO.ES</b>")."<br>";
Usar filtros en Controladores
Los controladores son probablemente un punto donde los filtros tengan mayor participación ya que es aquí donde se requiere asegurar que los procesos de negocio se ejecuten con datos consistentes y confiables.
El método de Controller::filter actua como un Proxy al componente Filter permitiendo filtrar variables sin instanciar explícitamente alguna clase adicional:
Ejemplo: Aplicar un filtro desde un controlador
<?php
class InvoicesController extends ApplicationController {
public function listInvoicesAction(){
//Se obtiene un valor de la entrada y se filtra
$initialDate = $this->getPostParam("initialDate");
$initialDate = $this->filter($initialDate, "date");
//Resto del proceso…
}
}
Adicional a lo anterior los métodos de Controller getPostParam, getRequestParam y getQueryParam reciben como parámetros extra al valor requerido nombres cortos de filtros los cuales se aplican en este orden y se retornan al proceso:
Ejemplo: Aplicar un filtro a la entrada de usuario
<?php
class InvoicesController extends ApplicationController {
public function listByNameInvoicesAction(){
//Se obtiene un valor de la entrada y se filtra directamente
$name = $this->getPostParam("name", "striptags", "extraspaces");
//Resto del proceso…
}
}
Filtrar la entrada de usuario
El componente filter está integrado a los controladores permitiendo validar la entrada de usuario cuando es recibida desde un formulario ó una URL.
El siguiente ejemplo define una serie de reglas para validar los valores recibidos desde una entrada de usuario generando los mensajes correspondientes:
Ejemplo: Filtrar y validar la entrada de usuario desde un formulario
<?php
class UsersController extends ApplicationController {
public function doRegisterAction(){
$fields = array(
'username' => array(
'message' => 'Por favor indique su nombre de usuario',
'filter' => 'extraspaces|striptags'
),
'password' => array(
'message' => 'Por favor indique su contraseña'
),
'confirmPassword' => array(
'message' => 'Por favor indique la confirmación de la contraseña'
),
'email' => array(
'message' => 'Por favor indique su correo electrónico',
'filter' => 'email'
),
'confirmEmail' => array(
'message' => 'Por favor indique la confirmación de su correo electrónico',
'filter' => 'email'
),
'name' => array(
'message' => 'Por favor indique su nombre',
'filter' => 'extraspaces|striptags'
),
'lastName' => array(
'message' => 'Por favor indique sus apellidos',
'filter' => 'extraspaces|striptags'
),
'address' => array(
'message' => 'Por favor indique la dirección de su residencia',
'filter' => 'extraspaces|striptags'
),
'phone' => array(
'message' => 'Por favor indique su teléfono'
),
'city' => array(
'message' => 'Por favor indique la ciudad'
),
'company' => array(
'message' => 'Por favor indique la empresa'
)
);
if($this->validateRequired($rules)==false){
foreach($this->getValidationMessages() as $message){
$message->showErrorMessage();
}
$this->routeTo(array('action' => 'startSignIn'));
}
}
}
La propiedad de la regla 'filter' permite definir el filtro que debe ser aplicado a cada valor recibido antes de determinar si está presente, de esta forma se controla que el valor evaluado sea válido y se genere el mensaje correspondiente. Si se requiere que se aplique más de un filtro, se puede indicar una lista separada por | (pipes).
Consulte el componente Validator para obtener más información sobre filtrar la entrada de usuario.
Crear un filtro de usuario
El desarrollador puede crear sus propios filtros en la aplicación e integrarlo al componente filter para su posterior utilización.
Tanto los filtros base como los de usuario deben implementar la interface FilterInterface que tiene la siguiente estructura:
<?php
interface FilterInterface {
public function execute($value);
}
Requerimientos de un filtro de usuario
Al crear un filtro de usuario se debe tener en cuenta lo siguiente:
Se crea un archivo ubicado en el directorio filters/ de la aplicación ó donde la opción filtersDir del archivo de configuración config/config.ini indique.
El nombre del archivo es el nombre del filtro con la primera letra en mayúscula
El archivo debe contener una clase con el nombre del filtro y sufijo "Filter"
La clase debe implementar la interface FilterInterface
En el siguiente ejemplo se crea un filtro de usuario que apartir de una URL filtra el dominio que corresponde a ella:
Ejemplo: Filter de usuario que filtra dominios en una URL