Ahora vamos a ver el uso de los más importantes filtros estándares. Describimos los métodos (y opciones) que un filtro tiene y damos código de ejemplo que muestra como instanciar el filtro y colocarle datos de entrada. Si necesitas usar un filtro que no está explicado en esta sección, puedes revisar la sección Standard Filters del Zend Framework Reference Manual.
En esta sección revisaremos varios filtros de un grupo de filtros relacionados con la transformación de los datos de entrada a un tipo específico y damos un ejemplo de su uso.
El filtro ToInt
es un filtro muy simple que está diseñado para convertir datos
escalares a un entero. Este filtro puede ser útil cuando agregamos reglas de validación
para campos de formulario que deben contener un valor numérico entero
(por ejemplo, un menú desplegable o un campo de texto que contiene una cantidad
de algo).
La clase ToInt
tiene un único método filter()
.
El filtro
ToInt
no convierte valores no escalares. Si le pasamos un arreglo el filtro regresará el arreglo sin modificaciones.
Abajo, encontraremos un ejemplo que ilustra el uso del filtro ToInt
.
<?php
// Create ToInt filter.
$filter = new \Zend\Filter\ToInt();
// Filter a value casting it to an integer number.
$filteredValue = $filter->filter('10'); // Returns (int) 10.
$filteredValue2 = $filter->filter(['10', '20']); // Returns array as is.
En el código de arriba pasamos la cadena de caracteres "10" al filtro (línea 6). El valor que se espera que regrese es el entero 10.
En la línea 7 pasamos un arreglo al filtro. Como el filtro Int
solo trabaja
con valores escalares regresará el arreglo sin cambios y generará una advertencia
de PHP.
La clase Boolean
es una filtro que está diseñado para convertir datos a un
valor booleano (true
o false
). Este filtro puede ser usado para revisar
campos del formulario que son casillas de verificación.
Sus métodos públicos son listados en la tabla 8.3.
Nombre del método | Descripción |
---|---|
filter($value) |
Regresa la representación booleana del $value . |
setCasting($flag) |
Coloca la bandera de conversión. |
getCasting() |
Regresa la bandera de conversión. |
setType($type) |
Coloca los tipos de dato desde donde hacer la conversión. |
getType() |
Regresa los tipos de datos. |
setTranslations($translations) |
Coloca la traducción. |
getTranslations() |
Regresa la traducción. |
Los filtros provee varios métodos que permiten colocar las opciones del filtro
(setCasting()
, setType()
y setTranslations()
).
El método setCasting
permite elegir uno de los dos modos en que el filtro puede
operar. Si la bandera es true
el filtro se comportará como el operador de
conversión (boolean)
de PHP. Si la bandera se coloca en false
solo se
convertirá con tipos de datos definidos por el método setType()
y todos
los otros valores se regresarán sin cambios.
El método de filtro setType()
permite definir a que tipos de datos hacer la
conversión. Este método acepta un solo argumento $type
, que puede ser una
combinación OR de constantes TYPE_
- o un arreglo que contiene el equivalente
literal de las constantes. Las posibles constantes aceptadas por el método
setType()
y sus equivalentes literales se listan en la tabla 8.4:
Constante | Valor numérico | Equivalente literal | Descripción |
---|---|---|---|
TYPE_BOOLEAN |
1 | "boolean" | Regresa un valor booleano. |
TYPE_INTEGER |
2 | "integer" | Convierte el valor entero 0 en false |
TYPE_FLOAT |
4 | "float" | Convierte un valor flotante 0.0 en false |
TYPE_STRING |
8 | "string" | Convierte un carácter vacío '' en false |
TYPE_ZERO_STRING |
16 | "zero" | Convierte una cadena de caracteres que contiene un solo carácter cero ('0') en falso . |
TYPE_EMPTY_ARRAY |
32 | "array" | Convierte un arreglo vacío en false . |
TYPE_NULL |
64 | "null" | Convierte un valor null en false . |
TYPE_PHP |
127 | "php" | Convierte valores del mismo modo que PHP hace la conversión a booleano. (este es el comportamiento por defecto) |
TYPE_FALSE_STRING |
128 | "false" | Convierte una cadena de caracteres que contiene la palabra "false" en el booleano false . |
TYPE_LOCALIZED |
256 | "localized" | Convierte una cadena de caracteres, que identifica una Configuración Regional, que contiene una palabra determinada en booleano. |
TYPE_ALL |
511 | "all" | Convierte todo los tipos anteriores en booleanos. |
El código siguiente muestra dos maneras equivalentes de llamar al método setType()
:
<?php
use Zend\Filter\Boolean;
// Call the setType() and pass it a combination of constants.
$filter->setType(Boolean::TYPE_BOOLEAN|
Boolean::TYPE_INTEGER|
Boolean::TYPE_STRING);
// Call the setType() and pass it an array with literal equivalents.
$filter->setType(['boolean', 'integer', 'string']);
El método setTranslations()
permite definir el equivalente de la Configuración
Regional de un booleano true
o false
. Este método acepta un solo parámetro
que debe ser un arreglo con la forma de un par llave=>valor, donde la llave
es la cadena de caracteres que identifica la Configuración Regional y el valor
es su representación booleana. El siguiente ejemplo muestra como usar el método
setTranlsations()
:
<?php
$filter->setTranslations([
'yes' => true, // English 'yes'
'no' => false, // English 'no'
'ja' => true, // German 'yes'
'nicht' => false, // German 'no'
'да' => true, // Russian 'yes'
'нет' => false // Russian 'no'
]);
Abajo, mostramos un ejemplo que ilustra el uso del filtro Boolean
.
<?php
// Create ToBoolean filter.
$filter = new \Zend\Filter\Boolean();
// Optionally configure the filter.
$filter->setCasting(true);
$filter->setType(\Zend\Filter\Boolean::TYPE_ALL);
$filter->setTranslations(['yes'=>true, 'no'=>false]);
// Filter a value casting it to a boolean number.
$filteredValue = $filter->filter('false'); // Returns boolean false.
$filteredValue2 = $filter->filter('1'); // Returns boolean true.
$filteredValue3 = $filter->filter('false'); // Returns boolean false.
$filteredValue4 = $filter->filter('yes'); // Returns boolean true.
El filtro ToNull
está diseñado para convertir datos arbitrarios a un valor null
cuando los datos cumplen con un criterio específico. Esto puede ser útil cuando trabajamos
con bases de datos y queremos tener un valor null
en lugar de cualquier otro tipo.
Si el valor no puede ser tratado como null
el filtro regresará el valor sin modificarlo.
Los métodos públicos del filtro ToNull
se muestran en la tabla 8.5.
Nombre del método | Descripción |
---|---|
filter($value) |
Si es posible convierte el $value a null de lo contrario regresa el valor sin cambios. |
setType($type) |
Define los tipos de datos desde los que se hace la conversión. |
getType() |
Regresa los tipos de dato definidos. |
Por defecto, el filtro ToNull
se comporta como la función empty()
de PHP: si
la función empty()
regresa el booleano true
a partir de los datos de entrada
entonces con los mismos datos el filtro regresará el valor null
.
El método setType()
se puede usar para colocar el tipo de dato desde el que se
convertirá a null
. Este método toma un solo parámetro que puede ser una combinación
de las constantes TYPE_
- que se muestran en la tabla 8.6 o un arreglo con sus
equivalentes literales.
Constante | Valor numérico | Equivalente literal | Descripción |
---|---|---|---|
TYPE_BOOLEAN |
1 | "boolean" | Convierte un valor falso booleano en null . |
TYPE_INTEGER |
2 | "integer" | Convierte un valor entero 0 en null . |
TYPE_EMPTY_ARRAY |
4 | "array" | Convierte un arreglo vacío en null . |
TYPE_STRING |
8 | "string" | Convierte una cadena vacía '' en null . |
TYPE_ZERO_STRING |
16 | "zero" | Convierte una cadena que solo tiene el carácter zero ('0') en null . |
TYPE_FLOAT |
32 | "float" | Convierte un valor flotante 0.0 en null . |
TYPE_ALL |
63 | "all" | Convierte todos los tipos de arriba en null . Este es el comportamiento por defecto. |
El siguiente ejemplo ilustra dos maneras equivalentes de llamar al método setType()
:
<?php
use Zend\Filter\ToNull;
// Call the setType() and pass it a combination of constants.
$filter->setType(ToNull::TYPE_ZERO_STRING|ToNull::TYPE_STRING);
// Call the setType() and pass it an array with literal equivalents.
$filter->setType(['zero', 'string']);
Abajo, mostramos un ejemplo de como usar el filtro ToNull
:
<?php
// Create ToNull filter.
$filter = new \Zend\Filter\ToNull();
// Optionally configure the filter.
$filter->setType(\Zend\Filter\ToNull::TYPE_ALL);
$filteredValue = $filter->filter('0'); // Returns null.
$filteredValue2 = $filter->filter('1'); // Returns string '1'.
$filteredValue3 = $filter->filter(false); // Returns null.
El filtro DateTimeFormatter
acepta una fecha en un formato arbitrario y lo
convierte al formato deseado.
Este filtro puede aceptar una cadena de caracteres (por ejemplo, '2014-03-22 15:36'), una marca de tiempo de tipo entero (como la que regresa la función
time()
de PHP) o una instancia de la claseDateTime
de PHP. El filtroDateTimeFormatter
puede producir una excepciónZend\Filter\Exception\InvalidArgumentException
si le pasamos una fecha en un formato incorrecto.
Los métodos públicos del filtro se muestran en la tabla 8.7.
Nombre del método | Descripción |
---|---|
__construct($options) |
Construye el filtro. |
filter($value) |
Transforma la fecha al formato deseado. |
setFormat($format) |
Define el formato de la fecha. |
En el ejemplo de abajo mostramos como crear un filtro, pasarle una cadena de caracteres con una fecha y convertirla al formato deseado:
<?php
// Create DateTimeFormatter filter.
$filter = new \Zend\Filter\DateTimeFormatter();
// Set filter's format (optional).
$filter->setFormat('F j, Y g:i A');
// Transform the date to the specified format.
$filteredValue = $filter->filter('2014-03-22 15:36');
// The expected output is 'March 22, 2014 3:36 PM'.
Internamente el filtro
DateTimeFormatter
usa la claseDateTime
de la biblioteca estándar de PHP para convertir y formatear las fechas. Para conocer los formatos de fecha disponibles podemos revisar la documentación de PHP para la claseDateTime
.
En este sección consideraremos el uso de los filtros del grupo encargado de manipular la ruta de los archivos.
La clase filtro BaseName
es solo una envoltura sobre la función de PHP basename()
.
La función toma una cadena de caracteres que contiene la ruta a un archivo o
carpeta y regresa el último nombre del que está compuesto.
Abajo, podemos encontrar un ejemplo del uso del filtro BaseName
:
<?php
// Create BaseName filter.
$filter = new \Zend\Filter\BaseName();
// Filter a file path and return its last part.
$filteredValue = $filter->filter('/var/log/httpd/error.log');
// The expected filter's output is the 'error.log'.
La filtro
BaseName
no procesará valores no escalares. Si pasamos un arreglo el filtro regresará el arreglo sin modificaciones y producirá una advertencia de PHP.
La clase filtro Dir
es solo una envoltura de la función de PHP dirname()
.
Esta toma una cadena de caracteres que contiene la ruta a un archivo o carpeta
y regresa la carpeta padre de la ruta.
El filtro
Dir
no procesa valores no escalares. Si pasamos un arreglo el filtro regresará el arreglo sin modificaciones.
Abajo mostramos un ejemplo que demuestra el uso del filtro Dir
.
<?php
// Create Dir filter.
$filter = new \Zend\Filter\Dir();
// Filter a file path and return its directory name part.
$filteredValue = $filter->filter('/var/log/httpd/error.log');
// The expected filter's output is the '/var/log/httpd'.
El filtro RealPath
toma como argumento de entrada una ruta relativa o absoluta
a un archivo. Este filtro expande todos los enlaces simbólicos y resuelve las
referencias a '/./', '/../' y los caracteres extra '/' de la ruta de entrada
y regresa la ruta absoluta del nombre canónico.
El filtro
RealPath
es un envoltorio sobre la función de PHPrealpath()
.
Los métodos públicos del filtro se muestran en la tabla 8.8.
Nombre del método | Descripción |
---|---|
__construct($options) |
Construye el filtro. |
filter($value) |
Regresa el nombre de la ruta canónica. |
setExists($flag) |
Especifica si la ruta debe existir para que el filtro se ejecute. El valor true significa que la ruta debe existir; el valor false significa que se puede dar una ruta que no existe. |
getExists() |
Regresa true si la ruta filtrada debe existir. |
El filtro RealPath
regresa un booleano false
en caso de falla, por ejemplo,
cuando el archivo no existe. Si se permiten los archivos inexistentes podemos
llamar al método setExists()
con el parámetro false
.
Abajo mostramos un ejemplo que demuestra el uso del filtro RealPath
.
<?php
// Create RealPath filter.
$filter = new \Zend\Filter\RealPath();
// Filter a file path (it is assumed that the current
// working directory is /var/log/httpd and that it contains
// the error.log file).
$filteredValue = $filter->filter('./error.log');
// The expected filter's output is the '/var/log/httpd/error.log'.
El filtro
RealPath
no procesa valores no escalares. Si le pasamos un arreglo lo regresará sin hacer modificaciones.
En esta sección consideraremos varios filtros del grupo de filtros que comprimen y codifican los datos de entrada. Estos filtros no son muy útiles para filtrar datos del formulario pero se pueden usar fuera de los formularios con buenos resultados.
El filtro Compress
está diseñado para comprimir los datos de entrada con algún
algoritmo de compresión. Por ejemplo, podemos usar este filtro para comprimir los
datos y guardarlos en un paquete de archivos.
Los métodos públicos del filtro se muestran en la tabla 8.9.
Nombre del método | Descripción |
---|---|
__construct($options) |
Construye el filtro. |
filter($value) |
Ejecuta la compresión de los datos usando el algoritmo especificado. |
getAdapter() |
Regresa el adaptador actual, instanciandolo si es necesario. |
getAdapterName() |
Recupera el nombre del adaptador. |
setAdapter($adapter) |
Coloca el adaptador de compresión. |
getAdapterOptions() |
Recupera las opciones del adaptador. |
setAdapterOptions($options) |
Coloca las opciones del adaptador. |
getOptions($option) |
Coloca una o todas las opciones del adaptador seleccionado. |
El filtro Compress
en sí mismo no comprime los datos. En su lugar él usa la
clase adaptador. La clase adaptador debe implementar la interfaz
CompressionAlgorithmInterface
. Luego, se une un adaptador a un filtro Compress
y el adaptador implementa el algoritmo de compresión concreto.
Existen varias clases adaptadoras estándares disponibles (figura 8.2 y tabla 8.10).
Estas clases se encuentran en el espacio de nombres Zend\Filter\Compress
.
Nombre de la Clase | Descripción |
---|---|
Bz2 |
Algoritmo de compresión Bzip2 (Burrows–Wheeler). |
Gz |
El algoritmo de compresión Gzip está basado en el algoritmo Deflate que es una combinación del código de LZ77 y Huffman. |
Zip |
ZIP es un algoritmo de compresión ampliamente usado en sistemas operativos Windows. |
Tar |
El formato de archivo Tarball es hoy usado comúnmente para empaquetar muchos archivos dentro de un solo gran archivo preservando la información del sistema como permisos de usuario y grupo, fechas y estructura de carpetas. Es ampliamente usado en sistemas GNU/Linux. |
Lzf |
LZF es un algoritmo de compresión muy rápido, ideal para ahorrar espacio con solo un pequeño costo de velocidad. |
Snappy |
Snappy es una biblioteca de compresión y descompresión rápida de datos desarrollada por Google basada en las ideas de LZ77. |
Rar |
RAR es un formato de paquete de archivos que soporta compresión de datos, recuperación de errores y separación del paquete. |
Figura 8.2. Herencia del adaptador de compresión
Abajo, mostramos un ejemplo del uso del filtro Compress
.
<?php
// Create Compress filter.
$filter = new \Zend\Filter\Compress();
// Configure the adapter.
$filter->setAdapter('Zip');
$filter->setAdapterOptions([
'archive' => 'example.zip',
]);
// Compress an input data (it is assumed that you have the testfile.txt
// file in the current working directory.
$filter->filter('testfile.txt');
En el código de arriba creamos una instancia del filtro Compress
(línea 3), colocamos
su adaptador (línea 6), colocamos las opciones del adaptador (línea 7) y finalmente comprimimos
el archivo de entrada (línea 13). El resultado esperado, un paquete de archivos
example.zip, será creado en el carpeta actual. El paquete de archivos contiene
el archivo testfile.txt.
El filtro
Decompress
es un «espejo reflector» del filtroCompress
y se puede usar análogamente. Por esta razón no cubrimos el filtroDecompress
en esta sección.
El propósito del filtro Encrypt
es codificar los datos de entrada con el algoritmo
especificado. Los métodos públicos del filtro se muestran en la tabla 8.11.
Nombre del método | Descripción |
---|---|
__construct($options) |
Construcción del filtro. |
filter($value) |
Ejecuta la codificación de los datos usando el algoritmo especificado. |
getAdapter() |
Regresa el actual adaptador, instanciandolo si es necesario. |
setAdapter($adapter) |
Coloca el adaptador de codificación. |
El filtro Encrypt
usa clases adaptadoras para ejecutar la codificación de los
datos. Asignamos un adaptador al filtro Encrypt
con el método setAdapter()
y
el adaptador ejecuta el cifrado.
La clase adaptador debe implementar la interfaz EncryptionAlgorithmInterface
.
Existen varias clases adaptadoras estándares disponibles (ver la figura 8.3).
Estas clases están en el espacio de nombres Zend\Filter\Encrypt
.
BlockCipher
-- implementa un algoritmo de cifrado por bloques simétrico.Openssl
-- usa el algoritmo de cifrado de la biblioteca OpenSSL.
Figura 8.3. Herencia del adaptador de cifrado
Abajo, tenemos un ejemplo que demuestra el uso del filtro Encrypt
.
<?php
// Create Encrypt filter.
$filter = new \Zend\Filter\Encrypt();
// Set encryption adapter.
$filter->setAdapter('BlockCipher');
// Encrypt an input data.
$filteredValue = $filter->filter('some data to encrypt');
El resultado esperado es una cadena de caracteres cifrada con cifrado por bloques.
El filtro
Decrypt
es un «espejo reflector» del filtroEncrypt
y se puede usar de manera análoga. Por esta razón, no discutimos el funcionamiento del filtroDecrypt
en esta sección.
En esta sección consideraremos los filtros del grupo de filtros que manipulan cadenas de caracteres.
La clase filtro StringToLower
está diseñada para convertir los datos de entrada
que son cadenas de caracteres a letras minúsculas. Los métodos públicos del
filtro se muestran en la tabla 8.12 más abajo.
Nombre del método | Descripción |
---|---|
__construct($options) |
Construye el filtro. |
filter($value) |
Convierte la cadena de caracteres a letras minúsculas. |
setEncoding($encoding) |
Coloca la codificación para la cadena dada. |
getEncoding() |
Regresa la codificación. |
Por defecto, el filtro se comporta como la función strtolower()
de PHP. Dado
una cadena, el filtro regresa la cadena con los caracteres alfabéticos convertidos
a minúsculas. Los «caracteres alfabéticos» son determinados por la Configuración
Regional del sistema. Esto significa que, por ejemplo, la Configuración Regional
por defecto «C» no convertirá el carácter umlaut-A (Ä).
Cuando llamamos al método setEncoding()
junto con la codificación
forzamos al filtro a comportarse como la función mb_strtolower()
de PHP. En
constaste con la función strtolower()
, el «alfabeto» se determina con las
propiedades de los caracteres Unicode. En este caso el comportamiento de esta
función no es afectada por la Configuración Regional y puede convertir cualquier
carácter «alfabético», como A-umlaut (Ä).
Si el valor dado no es un escalar, el valor se mantendrá sin filtrar y se producirá un
E_USER_WARNING
indicando que no se pudo filtrar.
Abajo, mostramos un ejemplo de como usar el filtro StringToLower
:
<?php
// Create StringToLower filter.
$filter = new \Zend\Filter\StringToLower();
// (Optionally) set encoding on the filter.
$filter->setEncoding('UTF-8');
// Filter a string.
$filteredValue = $filter->filter('How to Start a Business in 10 Days');
// The expected filter's output is the 'how to start a business in 10 days'.
El filtro
StringToUpper
(convierte una cadena de caracteres a letras mayúsculas) es un «espejo reflectante» del filtroStringToLower
y se puede usar análogamente. Por esta razón, no cubrimos el filtroStringToUpper
en esta sección.
El filtro PregReplace
se puede usar para buscar y reemplazar una cadena de
caracteres usando un expresión regular. Este filtro es una envoltura sobre la
función de PHP preg_replace()
PHP. Los métodos públicos del filtro se muestran
en la tabla 8.13 más abajo.
Nombre del método | Descripción |
---|---|
__construct($options) |
Construye el filtro. |
filter($value) |
Ejecuta la búsqueda y reemplazo usando la expresión regular. |
setPattern($pattern) |
Coloca el patrón de búsqueda. Este puede ser una cadena de caracteres o un arreglo con cadenas de caracteres. |
getPattern() |
Regresa el patrón. |
setReplacement($replacement) |
Coloca la cadena de caracteres o un arreglo con cadenas de caracteres con que reemplazar. |
getReplacement() |
Regresa el conjunto actual de valores de reemplazo. |
Abajo, se muestra un ejemplo de como usar el filtro PregReplace
:
<?php
// Create PregReplace filter.
$filter = new \Zend\Filter\PregReplace();
// Configure the filter.
$filter->setPattern("/\s\s+/");
$filter->setReplacement(' ');
// Filter a string.
$filteredValue = $filter->filter('An example with multiple spaces.');
// The expected filter's output is the 'An example with multiple spaces.'
El filtro StripTags
remueve todas las etiquetas (por ejemplo, <!-- -->
, <p>
, <h1>
or <?php ?>
)
que puede contener las cadenas de caracteres que son ingresadas en el formulario.
El filtro nos permite definir explícitamente las etiquetas que no deben ser eliminadas.
Además, el filtro permite especificar que atributos se permiten tanto a todas las etiquetas
como a etiquetas especificas.
Los métodos públicos del filtro StripTags
se listan en la tabla 8.14.
Nombre del método | Descripción |
---|---|
__construct($options) |
Construye el filtro. |
filter($value) |
Regresa el valor con las etiquetas eliminadas. |
getAttributesAllowed() |
Regresa la lista de atributos que se permiten en las etiquetas. |
setAttributesAllowed($attributesAllowed) |
Coloca la lista de atributos permitidos para las etiquetas. |
getTagsAllowed() |
Regresa la lista de atributos permitidos. |
setTagsAllowed($tagsAllowed) |
Coloca la lista de etiquetas permitidas. |
Abajo, mostramos un ejemplo de como usar el filtro StripTags
:
<?php
// Create StripTags filter.
$filter = new \Zend\Filter\StripTags();
// Configure the filter.
$filter->setTagsAllowed(['p']);
// Filter a string.
$filteredValue = $filter->filter(
'<p>Please click the following <a href="example.com">link</a>.</p>');
// The expected filter's output is the
// '<p>Please click the following link.</p>;'
El filtro
StripTags
no procesa valores no escalares. Si el valor que se pasa al filtro no es un escalar el valor permanecerá sin filtrar.
El filtro StripNewlines
es un filtro muy simple que regresa la cadena de caracteres
de entrada sin los caracteres de control de nueva línea ("\r", "\n").
Abajo, mostramos un código de ejemplo que muestra como usar el filtro StripNewlines
:
<?php
// Create StripNewlines filter.
$filter = new \Zend\Filter\StripNewlines();
// Filter a string.
$filteredValue = $filter->filter("A multi line\r\n string");
// The expected filter's output is the 'A multi line string'.
El filtro
StripNewlines
no procesa valores no escalares. Si el valor pasado al filtro no es un escalar el valor permanecerá sin filtrar.
El filtro UriNormalize
se puede usar para normalizar la URL y opcionalmente
asignar un esquema a la URL. Los métodos públicos del filtro se muestran más abajo en la tabla 8.15.
Nombre del método | Descripción |
---|---|
filter($value) |
Filtrar la URL normalizandola y asigna un esquema si se coloca. |
setDefaultScheme($defaultScheme) |
Coloca el esquema por defecto que se usa cuando la URI no tiene esquema. |
setEnforcedScheme($enforcedScheme) |
Coloca el esquema del URI forzándolo cuando la URI no tienen esquema. |
El proceso de normalización de la URL consiste generalmente de los siguientes pasos:
Las reglas del proceso de normalización de la URL puede ser diferente para cada
protocolo (esquema). Si la URL no contiene la parte del esquema, el esquema http
se usa por defecto. Podemos usar el método setDefaultScheme()
del filtro UriNormalize
para colocar el esquema por defecto para la normalización de la URL. Este método
acepta cualquiera de los siguientes esquemas: http
, https
, file
, mailto
,
urn
y tag
.
Además, el método setEnforcedScheme()
del filtro UriNormalize
permite sobrescribir
la parte del esquema por un «esquema forzado» si la URL no contiene la parte del
esquema.
Abajo, mostramos un ejemplo de como usar el filtro UriNormalize
:
<?php
// Create UriNormalize filter.
$filter = new \Zend\Filter\UriNormalize();
// Configure the filter.
$filter->setDefaultScheme('http');
$filter->setEnforcedScheme('https');
// Filter an URL string.
$filteredValue = $filter->filter('www.example.com');
// The expected filter's output is the 'https://www.example.com/'.
Los filtros se pueden organizar en secuencias. Esto se lleva a cabo por medio
de la clase FilterChain
. Cuando este filtro compuesto se ejecuta, el valor
filtrado por el primer filtro se pasa como entrada para el segundo filtro, luego
el valor filtrado por el segundo filtro se pasa al tercer filtro y así sucesivamente.
La clase
FilterChain
es usada internamente por la clase contenedorInputFilter
para guardar la secuencia de filtros asociados al campo del modelo de formulario.
Los métodos públicos que provee la clase FilterChain
se muestran en la tabla 8.16:
Nombre del método | Descripción |
---|---|
filter($value) |
Regresa los valores filtrados por cada uno de los filtros de la cadena. Los filtros se ejecutan en el orden en que fueron agregados a la cadena (FIFO). |
setOptions($options) |
Coloca las opciones. |
attach($callback, $priority) |
Asocia una instancia de un filtro existente (o una función de retrollamada) a la cadena. |
attachByName($name, $options, $priority) |
Instancia un filtro a partir del nombre de la clase o del alias e inserta la cadena. |
merge($filterChain) |
Mezcla una cadena de filtros con otra cadena de filtros. |
getFilters() |
Regresa todos lo filtro asociadas. |
count() |
Regresa el número de filtros asociados. |
En la figura 8.4 se muestra un ejemplo de una cadena de filtro. La cadena consiste
en el filtro StringTrim
seguido por el filtro StripTags
que a su vez es seguido
por el filtro StripNewlines
.
Para construir una cadena de filtro como la de la figura 8.4 podemos usar el siguiente código:
<?php
use Zend\Filter\FilterChain;
// Instantiate the filter chain.
$filter = new FilterChain();
// Insert filters into filter chain.
$filter->setOptions([
'filters'=>[
[
'name'=>'StringTrim',
'options'=>['charlist'=>"\r\n\t "],
'priority'=>FilterChain::DEFAULT_PRIORITY
],
[
'name'=>'StripTags',
'options'=>['tagsallowed'=>['p']],
'priority'=>FilterChain::DEFAULT_PRIORITY
],
[
'name'=>'StripNewlines',
'priority'=>FilterChain::DEFAULT_PRIORITY
]
]
]);
// Execute all filters in the chain.
$filteredValue = $filter->filter(" name@example.com<html>\n ");
// The expected output is 'name@example.com'.
En el código de arriba instanciamos el filtro FilterChain
con el operador new
(línea 5). En la línea 8, construimos la cadena de filtros con el método setOptions()
.
El método toma una arreglo de configuración como el que recibe el método add()
del filtro InputFilter
.
El arreglo tiene la llave «filters» en donde registramos los filtros que queremos
insertar en la cadena. Para cada filtro que se asocia debemos proveer las siguientes
subllaves:
StringTrim::class
)
o su alias (ejemplo, «StringTrim»).DEFAULT_PRIORITY
.Finalmente, en la línea 28 llamamos al método filter()
que recorre la cadena
y pasa el valor filtrado a cada filtro a su turno.
Los filtros estándares están diseñados para ser usados en las situaciones más comunes.
Por ejemplo, a menudo necesitamos cortar una cadena de caracteres o convertirla
a letras minúsculas. Sin embargo, algunas veces hay casos en donde no podemos
usar un filtro estándar. En estos casos el filtro Callback
será útil.
El filtro Callback
está diseñado como un envoltorio para nuestros algoritmos
de filtrado. Por ejemplo, el filtro Callback
puede ser útil cuando un filtro
estándar no es apropiado y necesitamos aplicar nuestro propio algoritmo de filtrado
a los datos.
Un algoritmo de filtrado a la medida se implementa como una función de retrollamada o como un método de retrollamada en una clase. Una retrollamada es una función o un método público, que es llamado por el filtro
Callback
, al que se le pasa el valor que será filtrado y opcionalmente argumentos definidos por el usuario.
Los métodos públicos que provee la función Callback
se listan en la tabla 8.17.
Nombre del método | Descripción |
---|---|
filter($value) |
Ejecuta una función de retrollamada como un filtro. |
setCallback($callback) |
Asigna una nueva retrollamada al filtro. |
getCallback() |
Regresa la retrollamada asignada al filtro. |
setCallbackParams($params) |
Coloca los parámetros para la retrollamada. |
getCallbackParams() |
Recupera los parámetros de la retrollamada. |
Como podemos ver en la tabla el filtro Callback
provee los métodos setCallback()
y setCallbackParams()
que se pueden usar para colocar las funciones de retrollamada
(o los métodos de retrollamada de una clase) y opcionalmente pasarle uno o más
parámetros.
Para demostrar el uso del filtro Callback
vamos a agregar el campo número de
teléfono a nuestra clase modelo de formulario ContactForm
y le añadiremos el
filtro personalizado.
Un número de teléfono internacional típico tiene el aspecto siguiente «1 (808) 456-7890». Este consiste en el código del país seguido por un código de área de tres dígitos encerrados entre paréntesis. El resto de número consiste en siete dígitos que corresponden al código del suscriptor dividido en dos grupos que se separan con un guión. El código de país, el código de área y el código del suscriptor se separan con un espacio. Nos referiremos a este formato de número de teléfono como el formato «internacional».
El formato de número internacional se necesita para hacer llamadas entre diferentes países (o áreas). Si las llamadas son hechas dentro de la misma área el número puede ser simplemente «456-7890» (solo omitimos el código del país y el código de área). Nos referiremos a este formato como el formato de número «local».
Para hacer a nuestro filtro tan genérico como sea posible asumiremos que el usuario necesita ingresar el número en el formato internacional en algunos formularios y en formato local en otros. Como algunos usuarios pueden ingresar su número de teléfono en un formato diferente al que es requerido, queremos aplicar un filtro que «normalice» el número de teléfono por nosotros.
Para «normalizar» el número de teléfono, el filtro debe:
Como ZF3 no provee un filtro estándar para filtrar el teléfono, usaremos el filtro
de envoltura Callback
. Para hacerlo, haremos los siguientes cambios en el
código de la clase ContactForm
:
<?php
// ...
class ContactForm extends Form
{
// ...
protected function addElements()
{
// ...
// Add "phone" field
$this->add([
'type' => 'text',
'name' => 'phone',
'attributes' => [
'id' => 'phone'
],
'options' => [
'label' => 'Your Phone',
],
]);
}
private function addInputFilter()
{
// ...
$inputFilter->add([
'name' => 'phone',
'required' => true,
'filters' => [
[
'name' => 'Callback',
'options' => [
'callback' => [$this, 'filterPhone'],
'callbackParams' => [
'format' => 'intl'
]
]
],
],
]);
}
// Custom filter for a phone number.
public function filterPhone($value, $format)
{
if(!is_scalar($value)) {
// Return non-scalar value unfiltered.
return $value;
}
$value = (string)$value;
if(strlen($value)==0) {
// Return empty value unfiltered.
return $value;
}
// First, remove any non-digit character.
$digits = preg_replace('#[^0-9]#', '', $value);
if($format == 'intl') {
// Pad with zeros if the number of digits is incorrect.
$digits = str_pad($digits, 11, "0", STR_PAD_LEFT);
// Add the braces, the spaces, and the dash.
$phoneNumber = substr($digits, 0, 1) . ' ('.
substr($digits, 1, 3) . ') ' .
substr($digits, 4, 3) . '-'.
substr($digits, 7, 4);
} else { // 'local'
// Pad with zeros if the number of digits is incorrect.
$digits = str_pad($digits, 7, "0", STR_PAD_LEFT);
// Add the dash.
$phoneNumber = substr($digits, 0, 3) . '-'. substr($digits, 3, 4);
}
return $phoneNumber;
}
}
En las líneas 11-20 del código de arriba, agregamos el campo «phone» al modelo
de formulario ContactForm
. El campo es usualmente un campo de entrada de texto
y ya tenemos algo de experiencia trabajando con este tipo de campos antes.
Luego, en las líneas 26-40, agregamos una regla de validación para el campo «phone»
de nuestro formulario. Dentro de la llave «filters» (línea 29) registramos el
filtro Callback
(usamos el alias Callback
, pero podemos también usar el nombre
completo de la clase Callback::class
).
El filtro toma dos opciones (línea 32): la opción «callback» y la opción «callback_params».
La opción «callback» es un arreglo que consiste en dos elementos que representan
respectivamente a la clase y el método que se llama. En este ejemplo, la retrollamada
es al método filterPhone()
de la clase ContactForm
. Pasamos el parámetro
«format» al método de retrollamada con la ayuda de la opción «callbackParams»
(línea 34).
En las líneas 44-79, definimos el método de retrollamada filterPhone()
que toma
dos argumentos: el $value
es el número de teléfono a filtrar y el $format
es
el formato de número deseado. El parámetro $format
puede ser o «local» (para
un formato local) o «intl» (para un formato internacional).
Con el método de retrollamada filterPhone()
hacemos lo siguiente:
Primero, en la línea 46, revisamos si el parámetro $value
es un escalar y
no un arreglo. Si el valor no es un escalar lo regresamos sin cambiarlo.
En la línea 53, revisamos el tamaño del valor de entrada. No hacemos nada si el usuario ingresó un número de teléfono vacío por lo que retornamos el valor sin hacer modificaciones.
Luego, removemos cualquier carácter que no sea un dígito (línea 59).
Si la longitud del número es muy corta rellenamos con ceros.
Agregamos paréntesis, el guión y los espacios para el número de teléfono internacional o solo el guión para los números de teléfono locales.
Finalmente, regresamos el número de teléfono que resulta.
Para ver como este filtro trabaja podemos abrir la URL «http://localhost/contactus» en nuestro navegador web. Si ingresamos algún número de teléfono en un formato incorrecto, el filtro corregirá el número de teléfono y lo transformará al formato estándar.