Note

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.
Select a Language:
Componente Filter
Introducción
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 CortoUso/Descripción
AlnumalnumFiltra caracteres alfanuméricos (letras y números).
AlphaalphaFiltra letras del abecedario occidental incluyendo caracteres latinos como vocales con tilde y eñes.
AddSlachesaddslachesEscapa las comillas simples y dobles para evitar inyección de SQL.
BaseNamebasenameFiltra un path para obtener el nombre del archivo ó el último directorio.
DatedateFiltra 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.
DigitsdigitsFiltra una cadena para que contenga solo dígitos (números del 0 al 9)
DoubledoubleFiltra un valor devolviendo un valor numérico de alta precisión.
EmailemailFiltra una cadena de caracteres devolviendo un correo electrónico valido.
ExtraspacesextraspacesFiltra una cadena de caracteres eliminando espacios y saltos de línea al principio y final de la cadena.
FloatfloatFiltra un valor devolviendo un valor numérico de alta precision
HtmlEntitieshtmlentitiesConvierte todos los caracteres aplicables de una cadena de caracteres a sus entidades HTML correspondientes.
HtmlDecodehtmldecodeConvierte entidades HTML a su carácter UTF-8 correspondiente.
IdentifieridentifierFiltra un valor dejando solo un identificador de variable valido.
IntintFiltra el valor recibido en un entero de 32bit ó 64 bit dependiendo de la plataforma.
Ipv4ipv4Filtra una cadena de caracteres devolviendo una dirección IP versión 4.
Ipv6ipv6Filtra una cadena de caracteres devolviendo una dirección IP versión 6.
LowerlowerFiltra una cadena de caracteres devolviéndola en minúsculas. Este filtro respeta el charset de la aplicación.
LocalelocaleFiltra una cadena de definición de localización UNICODE.
Md5md5Convierte una cadena de caracteres a su resumen criptográfico md5
NumericnumericConvierte el valor recibido en valor numérico.
OnecharonecharFiltra la cadena para obtener un solo carácter.
StripspacestripspaceElimina los caracteres espacios en toda la cadena de caracteres recibida.
StriptagsstriptagsElimina las etiquetas HTML que contenga la cadena de caracteres recibida.
StripslachesstripslachesDes-escapa una cadena de carácteres convirtiendolos a sus carácteres de comillas normales.
UpperupperFiltra una cadena de caracteres devolviéndola en mayúsculas. Este filtro respeta el charset de la aplicación.
Utf8utf8Convierte 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:
Ejemplo: Crear filtros en forma directa
<?php

$filter = new Filter();
echo $filter->applyFilter("a1b2c3d4e5", "digits"); // Imprime 12345

$filter = new Filter();
echo $filter->applyFilter("<h1>Hola</h1>", "striptags", "upper"); // Imprime HOLA

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:
Ejemplo: Usar el buffer de los filtros
<?php

$filter = new Filter();
echo $filter->applyFilter("a1b2c3d4e5", "digits"); // Imprime 12345
echo $filter->applyFilter("www.radiobox77.com"); // Imprime 77
Crear chains de Filtros
Es posible crear chains para la aplicación de filtros base y de usuario a un mismo valor de la siguiente manera:
Ejemplo: Implementar Chains de Filtros
<?php

Filter::load("striptags", "email", "lower", "special");

$filter = new Filter();
$filter->addFilter(new StriptagsFilter());
$filter->addFilter(new EmailFilter());
$filter->addFilter(new LowerFilter());
$filter->addFilter(new LowerFilter());
$filter->addFilter(new SpecialFilter());

echo $filter->applyFilter("<b>ANEWUSER1978@YAHOO.ES</b>")."<br>";

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&ntilde;a'
               ),
               'confirmPassword' => array(
                    'message' => 'Por favor indique la confirmaci&oacute;n de la contrase&ntilde;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
<?php

class DomainFilter implements FilterInterface {

     public function execute($url){
          $protocol = strpos($url, "//");
          if($protocol!==false){
               $url = substr($url, $protocol+2);
          }
          $fisrtSlash = strpos($url, "/");
          if($fisrtSlash!==false){
               $url = substr($url, 0, $fisrtSlash);
          }
          return $url;
     }

}

En cualquier parte de la aplicación se puede utilizar usando su nombre corto ó cargandolo mediante Filter::load:
Ejemplo: Aplicar un filtro de usuario
<?php

$filter = new Filter();
$url = "http://www.google.com/?q=kumbia%20framework";
echo $filter->applyFilter($url, "domain"); // www.google.com