TigerZF
🌐Español

76.2. Clases de validación estándar

Zend Framework incluye un conjunto estándar de clases de validación, listas para que las use.

76.2.1. Alnum

Zend_Validate_Alnum le permite validar si un valor determinado contiene solo caracteres alfabéticos y dígitos. No existe limitación de longitud para la entrada que desea validar.

76.2.1.1. Opciones admitidas para Zend_Validate_Alnum

Se admiten las siguientes opciones para Zend_Validate_Alnum:

  • allowWhiteSpace: Si se permiten caracteres de espacio en blanco. Esta opción tiene como valor predeterminado FALSE

76.2.1.2. Uso básico

Un ejemplo básico es el siguiente:

$validator = new Zend_Validate_Alnum();
if ($validator->isValid('Abcd12')) {
    // value contains only allowed chars
} else {
    // false
}

76.2.1.3. Uso de espacios en blanco

Por defecto los espacios en blanco no se aceptan porque no forman parte del alfabeto. Aun así, hay una forma de aceptarlos como entrada. Esto permite validar oraciones o frases completas.

Para permitir el uso de espacios en blanco debe indicar la opción allowWhiteSpace. Esto se puede hacer al crear una instancia del validador, o posteriormente mediante setAllowWhiteSpace(). Para obtener el estado actual puede usar getAllowWhiteSpace().

$validator = new Zend_Validate_Alnum(array('allowWhiteSpace' => true));
if ($validator->isValid('Abcd and 12')) {
    // value contains only allowed chars
} else {
    // false
}

76.2.1.4. Uso de diferentes idiomas

Al usar Zend_Validate_Alnum, el idioma que el usuario configure en su navegador se utilizará para establecer los caracteres permitidos. Esto significa que cuando su usuario configura de para alemán, también puede introducir caracteres como ä, ö y ü además de los caracteres del alfabeto inglés.

Qué caracteres están permitidos depende completamente del idioma utilizado, ya que cada idioma define su propio conjunto de caracteres.

En realidad hay 3 idiomas que no se aceptan en su propia escritura. Estos idiomas son coreano, japonés y chino, ya que estos idiomas utilizan un alfabeto en el que un solo carácter se construye usando múltiples caracteres.

En caso de que utilice estos idiomas, la entrada solo se validará usando el alfabeto inglés.

76.2.2. Alpha

Zend_Validate_Alpha le permite validar si un valor determinado contiene solo caracteres alfabéticos. No existe limitación de longitud para la entrada que desea validar. Este validador está relacionado con el validador Zend_Validate_Alnum, con la excepción de que no acepta dígitos.

76.2.2.1. Opciones admitidas para Zend_Validate_Alpha

Se admiten las siguientes opciones para Zend_Validate_Alpha:

  • allowWhiteSpace: Si se permiten caracteres de espacio en blanco. Esta opción tiene como valor predeterminado FALSE

76.2.2.2. Uso básico

Un ejemplo básico es el siguiente:

$validator = new Zend_Validate_Alpha();
if ($validator->isValid('Abcd')) {
    // value contains only allowed chars
} else {
    // false
}

76.2.2.3. Uso de espacios en blanco

Por defecto los espacios en blanco no se aceptan porque no forman parte del alfabeto. Aun así, hay una forma de aceptarlos como entrada. Esto permite validar oraciones o frases completas.

Para permitir el uso de espacios en blanco debe indicar la opción allowWhiteSpace. Esto se puede hacer al crear una instancia del validador, o posteriormente mediante setAllowWhiteSpace(). Para obtener el estado actual puede usar getAllowWhiteSpace().

$validator = new Zend_Validate_Alpha(array('allowWhiteSpace' => true));
if ($validator->isValid('Abcd and efg')) {
    // value contains only allowed chars
} else {
    // false
}

76.2.2.4. Uso de diferentes idiomas

Al usar Zend_Validate_Alpha, el idioma que el usuario configure en su navegador se utilizará para establecer los caracteres permitidos. Esto significa que cuando su usuario configura de para alemán, también puede introducir caracteres como ä, ö y ü además de los caracteres del alfabeto inglés.

Qué caracteres están permitidos depende completamente del idioma utilizado, ya que cada idioma define su propio conjunto de caracteres.

En realidad hay 3 idiomas que no se aceptan en su propia escritura. Estos idiomas son coreano, japonés y chino, ya que estos idiomas utilizan un alfabeto en el que un solo carácter se construye usando múltiples caracteres.

En caso de que utilice estos idiomas, la entrada solo se validará usando el alfabeto inglés.

76.2.3. Barcode

Zend_Validate_Barcode le permite comprobar si un valor determinado puede representarse como un código de barras.

Zend_Validate_Barcode admite múltiples estándares de códigos de barras y puede extenderse muy fácilmente con implementaciones propias de códigos de barras. Se admiten los siguientes estándares de códigos de barras:

  • CODE25: A menudo llamado "two of five" o "Code25 Industrial".

    Este código de barras no tiene limitación de longitud. Admite solo dígitos, y el último dígito puede ser opcionalmente un checksum que se calcula con módulo 10. Este estándar es muy antiguo y hoy en día no se usa mucho. Los casos de uso comunes se dan dentro de la industria.

  • CODE25INTERLEAVED: A menudo llamado "Code 2 of 5 Interleaved".

    Este estándar es una variante de CODE25. No tiene limitación de longitud, pero debe contener una cantidad par de caracteres. Admite solo dígitos, y el último dígito puede ser opcionalmente un checksum que se calcula con módulo 10. Se usa en todo el mundo y es común en el mercado.

  • CODE39: CODE39 es uno de los códigos disponibles más antiguos.

    Este código de barras tiene una longitud variable. Admite dígitos, caracteres alfabéticos en mayúsculas y 7 caracteres especiales como espacio en blanco, punto y signo de dólar. Puede tener un checksum opcional que se calcula con módulo 43. Este estándar se usa en todo el mundo y es común dentro de la industria.

  • CODE39EXT: CODE39EXT es una extensión de CODE39.

    Este código de barras tiene las mismas propiedades que CODE39. Además permite el uso de los 128 caracteres ASCII. Este estándar se usa en todo el mundo y es común dentro de la industria.

  • CODE93: CODE93 es el sucesor de CODE39.

    Este código de barras tiene una longitud variable. Admite dígitos, caracteres alfabéticos y 7 caracteres especiales. Tiene un checksum opcional que se calcula con módulo 47 y contiene 2 caracteres. Este estándar produce un código más denso que CODE39 y es más seguro.

  • CODE93EXT: CODE93EXT es una extensión de CODE93.

    Este código de barras tiene las mismas propiedades que CODE93. Además permite el uso de los 128 caracteres ASCII. Este estándar se usa en todo el mundo y es común dentro de la industria.

  • EAN2: EAN es la abreviatura de "European Article Number".

    Este código de barras debe tener 2 caracteres. Admite solo dígitos y no tiene checksum. Este estándar se usa principalmente como añadido a EAN13 (ISBN) cuando se imprime en libros.

  • EAN5: EAN es la abreviatura de "European Article Number".

    Este código de barras debe tener 5 caracteres. Admite solo dígitos y no tiene checksum. Este estándar se usa principalmente como añadido a EAN13 (ISBN) cuando se imprime en libros.

  • EAN8: EAN es la abreviatura de "European Article Number".

    Este código de barras puede tener 7 u 8 caracteres. Admite solo dígitos. Cuando tiene una longitud de 8 caracteres incluye un checksum. Este estándar se usa en todo el mundo pero tiene un alcance muy limitado. Se puede encontrar en artículos pequeños donde no se podría imprimir un código de barras más largo.

  • EAN12: EAN es la abreviatura de "European Article Number".

    Este código de barras debe tener una longitud de 12 caracteres. Admite solo dígitos, y el último dígito es siempre un checksum que se calcula con módulo 10. Este estándar se usa dentro de EE. UU. y es común en el mercado. Ha sido reemplazado por EAN13.

  • EAN13: EAN es la abreviatura de "European Article Number".

    Este código de barras debe tener una longitud de 13 caracteres. Admite solo dígitos, y el último dígito es siempre un checksum que se calcula con módulo 10. Este estándar se usa en todo el mundo y es común en el mercado.

  • EAN14: EAN es la abreviatura de "European Article Number".

    Este código de barras debe tener una longitud de 14 caracteres. Admite solo dígitos, y el último dígito es siempre un checksum que se calcula con módulo 10. Este estándar se usa en todo el mundo y es común en el mercado. Es el sucesor de EAN13.

  • EAN18: EAN es la abreviatura de "European Article Number".

    Este código de barras debe tener una longitud de 18 caracteres. Admite solo dígitos. El último dígito es siempre un dígito de checksum que se calcula con módulo 10. Este código se usa a menudo para la identificación de contenedores de transporte.

  • GTIN12: GTIN es la abreviatura de "Global Trade Item Number".

    Este código de barras usa el mismo estándar que EAN12 y es su sucesor. Se usa comúnmente dentro de EE. UU.

  • GTIN13: GTIN es la abreviatura de "Global Trade Item Number".

    Este código de barras usa el mismo estándar que EAN13 y es su sucesor. Se usa en todo el mundo por la industria.

  • GTIN14: GTIN es la abreviatura de "Global Trade Item Number".

    Este código de barras usa el mismo estándar que EAN14 y es su sucesor. Se usa en todo el mundo y es común en el mercado.

  • IDENTCODE: Identcode es usado por Deutsche Post y DHL. Es una implementación especializada de Code25.

    Este código de barras debe tener una longitud de 12 caracteres. Admite solo dígitos, y el último dígito es siempre un checksum que se calcula con módulo 10. Este estándar se usa principalmente por las empresas DP y DHL.

  • INTELLIGENTMAIL: Intelligent Mail es un código de barras postal.

    Este código de barras puede tener una longitud de 20, 25, 29 o 31 caracteres. Admite solo dígitos, y no contiene checksum. Este estándar es el sucesor de PLANET y POSTNET. Se usa principalmente por el Servicio Postal de los Estados Unidos.

  • ISSN: ISSN es la abreviatura de International Standard Serial Number.

    Este código de barras puede tener una longitud de 8 o 13 caracteres. Admite solo dígitos, y el último dígito debe ser un dígito de checksum que se calcula con módulo 11. Se usa en todo el mundo para publicaciones impresas.

  • ITF14: ITF14 es la implementación GS1 de un código de barras Interleaved Two of Five.

    Este código de barras es una variante especial de Interleaved 2 of 5. Debe tener una longitud de 14 caracteres y se basa en GTIN14. Admite solo dígitos, y el último dígito debe ser un dígito de checksum que se calcula con módulo 10. Se usa en todo el mundo y es común dentro del mercado.

  • LEITCODE: Leitcode es usado por Deutsche Post y DHL. Es una implementación especializada de Code25.

    Este código de barras debe tener una longitud de 14 caracteres. Admite solo dígitos, y el último dígito es siempre un checksum que se calcula con módulo 10. Este estándar se usa principalmente por las empresas DP y DHL.

  • PLANET: Planet es la abreviatura de Postal Alpha Numeric Encoding Technique.

    Este código de barras puede tener una longitud de 12 o 14 caracteres. Admite solo dígitos, y el último dígito es siempre un checksum. Este estándar se usa principalmente por el Servicio Postal de los Estados Unidos.

  • POSTNET: Postnet es usado por el Servicio Postal de EE. UU.

    Este código de barras puede tener una longitud de 6, 7, 10 o 12 caracteres. Admite solo dígitos, y el último dígito es siempre un checksum. Este estándar se usa principalmente por el Servicio Postal de los Estados Unidos.

  • ROYALMAIL: Royalmail es usado por Royal Mail.

    Este código de barras no tiene una longitud definida. Admite dígitos, letras en mayúsculas, y el último dígito es siempre un checksum. Este estándar se usa principalmente por Royal Mail para su Cleanmail Service. También se llama RM4SCC.

  • SSCC: SSCC es la abreviatura de "Serial Shipping Container Code".

    Este código de barras es una variante del código de barras EAN. Debe tener una longitud de 18 caracteres y admite solo dígitos. El último dígito debe ser un dígito de checksum que se calcula con módulo 10. Se usa comúnmente en la industria del transporte.

  • UPCA: UPC es la abreviatura de "Univeral Product Code".

    Este código de barras precedió a EAN13. Debe tener una longitud de 12 caracteres y admite solo dígitos. El último dígito debe ser un dígito de checksum que se calcula con módulo 10. Se usa comúnmente dentro de EE. UU.

  • UPCE: UPCE es la variante corta de UPCA.

    Este código de barras es una variante más pequeña de UPCA. Puede tener una longitud de 6, 7 u 8 caracteres y admite solo dígitos. Cuando el código de barras tiene 8 caracteres de longitud incluye un checksum que se calcula con módulo 10. Se usa comúnmente con productos pequeños donde no cabría un código de barras UPCA.

76.2.3.1. Opciones admitidas para Zend_Validate_Barcode

Se admiten las siguientes opciones para Zend_Validate_Barcode:

  • adapter: Establece el adaptador de código de barras que se usará. Se admiten todos los adaptadores mencionados anteriormente. Al usar un adaptador definido por el usuario, debe indicar el nombre de clase completo.

  • checksum: TRUE cuando el código de barras debe contener un checksum. El valor predeterminado depende del adaptador utilizado. Tenga en cuenta que algunos adaptadores no permiten establecer esta opción.

  • options: Define opciones opcionales para adaptadores propios.

76.2.3.2. Uso básico

Para validar si una cadena determinada es un código de barras solo necesita conocer su tipo. Vea el siguiente ejemplo para un código de barras EAN13:

$valid = new Zend_Validate_Barcode('EAN13');
if ($valid->isValid($input)) {
    // input appears to be valid
} else {
    // input is invalid
}

76.2.3.3. Checksum opcional

Algunos códigos de barras se pueden proporcionar con un checksum opcional. Estos códigos de barras serían válidos incluso sin checksum. Aun así, cuando proporciona un checksum, también debería validarlo. Por defecto, estos tipos de código de barras no realizan validación de checksum. Usando la opción checksum puede definir si el checksum se validará o se ignorará.

$valid = new Zend_Validate_Barcode(array(
    'adapter'  => 'EAN13',
    'checksum' => false,
));
if ($valid->isValid($input)) {
    // input appears to be valid
} else {
    // input is invalid
}
[Note] Seguridad reducida al deshabilitar la validación de checksum

Al desactivar la validación de checksum también reducirá la seguridad de los códigos de barras usados. Además debe tener en cuenta que también puede desactivar la validación de checksum para aquellos tipos de código de barras que deben contener un valor de checksum. Los códigos de barras que no serían válidos podrían entonces devolverse como válidos aunque no lo sean.

76.2.3.4. Escribir adaptadores personalizados

Puede escribir validadores de código de barras personalizados para usar con Zend_Validate_Barcode; esto suele ser necesario cuando se trabaja con tipos de código de barras propietarios. Para escribir su propio validador de código de barras, necesita la siguiente información.

  • Length: La longitud que debe tener su código de barras. Puede tener uno de los siguientes valores:

    • Integer: Un valor mayor que 0, lo que significa que el código de barras debe tener esa longitud.

    • -1: No hay limitación para la longitud de este código de barras.

    • "even": La longitud de este código de barras debe tener una cantidad par de dígitos.

    • "odd": La longitud de este código de barras debe tener una cantidad impar de dígitos.

    • array: Un array de valores enteros. La longitud de este código de barras debe tener uno de los valores establecidos en el array.

  • Characters: Una cadena que contiene todos los caracteres permitidos para este código de barras. También se permite el valor entero 128, que significa los primeros 128 caracteres de la tabla ASCII.

  • Checksum: Una cadena que se usará como callback para un método que realiza la validación del checksum.

Su validador de código de barras personalizado debe extender Zend_Validate_Barcode_AdapterAbstract o implementar Zend_Validate_Barcode_AdapterInterface.

Como ejemplo, creemos un validador que espera un número par de caracteres que incluyan todos los dígitos y las letras 'ABCDE', y que requiere un checksum.

class My_Barcode_MyBar extends Zend_Validate_Barcode_AdapterAbstract
{
    protected $_length     = 'even';
    protected $_characters = '0123456789ABCDE';
    protected $_checksum   = '_mod66';

    protected function _mod66($barcode)
    {
        // do some validations and return a boolean
    }
}

$valid = new Zend_Validate_Barcode('My_Barcode_MyBar');
if ($valid->isValid($input)) {
    // input appears to be valid
} else {
    // input is invalid
}

76.2.4. Between

Zend_Validate_Between le permite validar si un valor determinado está entre otros dos valores.

[Note] Zend_Validate_Between admite solo la validación de números

Debe tenerse en cuenta que Zend_Validate_Between admite solo la validación de números. Las cadenas o fechas no se pueden validar con este validador.

76.2.4.1. Opciones admitidas para Zend_Validate_Between

Se admiten las siguientes opciones para Zend_Validate_Between:

  • inclusive: Define si la validación incluye los valores de los límites mínimo y máximo o los excluye. Su valor predeterminado es TRUE.

  • max: Establece el límite máximo para la validación.

  • min: Establece el límite mínimo para la validación.

76.2.4.2. Comportamiento predeterminado para Zend_Validate_Between

Por defecto este validador comprueba si un valor está entre min y max, donde ambos valores límite están permitidos como valor.

$valid  = new Zend_Validate_Between(array('min' => 0, 'max' => 10));
$value  = 10;
$result = $valid->isValid($value);
// returns true

En el ejemplo anterior el resultado es TRUE debido a que por defecto la búsqueda incluye los valores límite. Esto significa en nuestro caso que cualquier valor de '0' a '10' está permitido. Y valores como '-1' y '11' devolverán FALSE.

76.2.4.3. Validación excluyendo los valores límite

A veces es útil validar un valor excluyendo los valores límite. Vea el siguiente ejemplo:

$valid  = new Zend_Validate_Between(
    array(
        'min' => 0,
        'max' => 10,
        'inclusive' => false
    )
);
$value  = 10;
$result = $valid->isValid($value);
// returns false

El ejemplo es casi igual a nuestro primer ejemplo, pero excluimos el valor límite. Ahora los valores '0' y '10' ya no están permitidos y devolverán FALSE.

76.2.5. Callback

Zend_Validate_Callback le permite proporcionar un callback con el que validar un valor determinado.

76.2.5.1. Opciones admitidas para Zend_Validate_Callback

Se admiten las siguientes opciones para Zend_Validate_Callback:

  • callback: Establece el callback que se llamará para la validación.

  • options: Establece las opciones adicionales que se darán al callback.

76.2.5.2. Uso básico

El caso de uso más simple es tener una sola función y usarla como callback. Supongamos que tenemos la siguiente función.

function myMethod($value)
{
    // some validation
    return true;
}

Para usarla dentro de Zend_Validate_Callback solo tiene que llamarla de esta manera:

$valid = new Zend_Validate_Callback('myMethod');
if ($valid->isValid($input)) {
    // input appears to be valid
} else {
    // input is invalid
}

76.2.5.3. Uso con closures

PHP 5.3 introduce las closures, que son básicamente funciones autocontenidas o anónimas. PHP considera las closures otra forma de callback, y, como tal, se pueden usar con Zend_Validate_Callback. Por ejemplo:

$valid = new Zend_Validate_Callback(function($value){
    // some validation
    return true;
});

if ($valid->isValid($input)) {
    // input appears to be valid
} else {
    // input is invalid
}

76.2.5.4. Uso con callbacks basados en clases

Por supuesto también es posible usar un método de clase como callback. Supongamos que tenemos el siguiente método de clase:

class MyClass
{
    public function myMethod($value)
    {
        // some validation
        return true;
    }
}

La definición del callback es en este caso casi la misma. Solo tiene que crear una instancia de la clase antes del método y crear un array que describa el callback:

$object = new MyClass;
$valid = new Zend_Validate_Callback(array($object, 'myMethod'));
if ($valid->isValid($input)) {
    // input appears to be valid
} else {
    // input is invalid
}

También puede definir un método estático como callback. Considere la siguiente definición de clase y uso del validador:

class MyClass
{
    public static function test($value)
    {
        // some validation
        return true;
    }
}

$valid = new Zend_Validate_Callback(array('MyClass', 'test'));
if ($valid->isValid($input)) {
    // input appears to be valid
} else {
    // input is invalid
}

Finalmente, si está usando PHP 5.3, puede definir el método mágico __invoke() en su clase. Si lo hace, simplemente proporcionar una instancia de la clase como callback también funcionará:

class MyClass
{
    public function __invoke($value)
    {
        // some validation
        return true;
    }
}

$object = new MyClass();
$valid = new Zend_Validate_Callback($object);
if ($valid->isValid($input)) {
    // input appears to be valid
} else {
    // input is invalid
}

76.2.5.5. Añadir opciones

Zend_Validate_Callback también permite el uso de opciones que se proporcionan como argumentos adicionales al callback.

Considere la siguiente definición de clase y método:

class MyClass
{
    function myMethod($value, $option)
    {
        // some validation
        return true;
    }
}

Hay dos formas de informar al validador sobre opciones adicionales: pasarlas en el constructor, o pasarlas al método setOptions().

Para pasarlas al constructor, necesitaría pasar un array que contenga dos claves, "callback" y "options":

$valid = new Zend_Validate_Callback(array(
    'callback' => array('MyClass', 'myMethod'),
    'options'  => $option,
));

if ($valid->isValid($input)) {
    // input appears to be valid
} else {
    // input is invalid
}

De lo contrario, puede pasarlas al validador después de la instanciación:

$valid = new Zend_Validate_Callback(array('MyClass', 'myMethod'));
$valid->setOptions($option);

if ($valid->isValid($input)) {
    // input appears to be valid
} else {
    // input is invalid
}

Cuando se dan valores adicionales a isValid(), estos valores se añadirán inmediatamente después de $value.

$valid = new Zend_Validate_Callback(array('MyClass', 'myMethod'));
$valid->setOptions($option);

if ($valid->isValid($input, $additional)) {
    // input appears to be valid
} else {
    // input is invalid
}

Al hacer la llamada al callback, el valor que se va a validar siempre se pasará como primer argumento al callback, seguido de todos los demás valores dados a isValid(); todas las demás opciones lo seguirán. La cantidad y el tipo de opciones que se pueden usar no está limitado.

76.2.6. CreditCard

Zend_Validate_CreditCard le permite validar si un valor determinado podría ser un número de tarjeta de crédito.

Una tarjeta de crédito contiene varios elementos de metadatos, incluyendo un holograma, número de cuenta, logotipo, fecha de caducidad, código de seguridad y el nombre del titular de la tarjeta. Los algoritmos para verificar la combinación de metadatos solo los conoce la empresa emisora, y deben verificarse con ella para fines de pago. Sin embargo, a menudo es útil saber si un número determinado cae dentro de los rangos de números posibles antes de realizar dicha verificación, y, como tal, Zend_Validate_CreditCard simplemente verifica que el número de tarjeta de crédito proporcionado esté bien formado.

Para aquellos casos en los que tenga un servicio que pueda realizar una verificación exhaustiva, Zend_Validate_CreditCard también proporciona la capacidad de adjuntar un callback de servicio para activarlo una vez que el número de tarjeta de crédito se haya considerado válido; este callback se activará entonces, y su valor de retorno determinará la validez general.

Se aceptan las siguientes entidades emisoras:

  • American Express

    China UnionPay

    Diners Club Card Blanche

    Diners Club International

    Diners Club US & Canada

    Discover Card

    JCB

    Laser

    Maestro

    MasterCard

    Solo

    Visa

    Visa Electron

[Note] Entidades no válidas

Las entidades Bankcard y Diners Club enRoute ya no existen. Por lo tanto se tratan como no válidas.

Switch ha sido renombrada a Visa y por lo tanto también se trata como no válida.

76.2.6.1. Opciones admitidas para Zend_Validate_CreditCard

Se admiten las siguientes opciones para Zend_Validate_CreditCard:

  • service: Un callback a un servicio en línea que además se usará para la validación.

  • type: El tipo de tarjeta de crédito que se validará. Vea la siguiente lista de entidades para más detalles.

76.2.6.2. Uso básico

Hay varias entidades de tarjetas de crédito que pueden validarse con Zend_Validate_CreditCard. Por defecto, se aceptarán todas las entidades conocidas. Vea el siguiente ejemplo:

$valid = new Zend_Validate_CreditCard();
if ($valid->isValid($input)) {
    // input appears to be valid
} else {
    // input is invalid
}

El ejemplo anterior validaría contra todas las entidades de tarjetas de crédito conocidas.

76.2.6.3. Aceptar tarjetas de crédito definidas

A veces es necesario aceptar solo entidades de tarjetas de crédito definidas en lugar de todas; por ejemplo, cuando tiene una tienda en línea que solo acepta tarjetas Visa y American Express. Zend_Validate_CreditCard le permite hacer exactamente esto limitándolo exactamente a estas entidades.

Para usar una limitación puede proporcionar entidades específicas en la inicialización, o posteriormente mediante setType(). Cada uno puede tomar varios argumentos.

Puede proporcionar una sola entidad:

$valid = new Zend_Validate_CreditCard(
    Zend_Validate_CreditCard::AMERICAN_EXPRESS
);

Cuando quiere permitir múltiples entidades, puede proporcionarlas como array:

$valid = new Zend_Validate_CreditCard(array(
    Zend_Validate_CreditCard::AMERICAN_EXPRESS,
    Zend_Validate_CreditCard::VISA
));

Y como con todos los validadores, también puede pasar un array asociativo de opciones o una instancia de Zend_Config. En este caso debe proporcionar las entidades con la clave de array type como se simula aquí:

$valid = new Zend_Validate_CreditCard(array(
    'type' => array(Zend_Validate_CreditCard::AMERICAN_EXPRESS)
));

Tabla 76.1. Constantes para entidades de tarjetas de crédito

Entidad Constante
American Express AMERICAN_EXPRESS
China UnionPay UNIONPAY
Diners Club Card Blanche DINERS_CLUB
Diners Club International DINERS_CLUB
Diners Club US & Canada DINERS_CLUB_US
Discover Card DISCOVER
JCB JCB
Laser LASER
Maestro MAESTRO
MasterCard MASTERCARD
Solo SOLO
Visa VISA
Visa Electron VISA

También puede establecer o añadir entidades después de la instanciación usando los métodos setType(), addType() y getType().

$valid = new Zend_Validate_CreditCard();
$valid->setType(array(
    Zend_Validate_CreditCard::AMERICAN_EXPRESS,
    Zend_Validate_CreditCard::VISA
));
[Note] Entidad predeterminada

Cuando no se da ninguna entidad en la inicialización se usa ALL, que establece todas las entidades a la vez.

En este caso el uso de addType() es inútil porque todas las entidades ya se han añadido.

76.2.6.4. Validación usando APIs externas

Como se dijo antes, Zend_Validate_CreditCard solo validará el número de tarjeta de crédito. Afortunadamente, algunas entidades proporcionan APIs en línea que pueden validar un número de tarjeta de crédito usando algoritmos que no están disponibles al público. La mayoría de estos servicios son de pago. Por lo tanto, esta comprobación está desactivada por defecto.

Cuando tenga acceso a dicha API, puede usarla como un complemento para Zend_Validate_CreditCard y aumentar la seguridad de la validación.

Para hacerlo, simplemente necesita dar un callback que se llamará cuando la validación genérica haya pasado. Esto evita que se llame a la API para números no válidos, lo que aumenta el rendimiento de la aplicación.

setService() establece un nuevo servicio, y getService() devuelve el servicio establecido. Como opción de configuración, puede dar la clave de array 'service' en la inicialización. Para más detalles sobre las posibles opciones eche un vistazo a Callback.

// Your service class
class CcService
{
    public function checkOnline($cardnumber, $types)
    {
        // some online validation
    }
}

// The validation
$service = new CcService();
$valid   = new Zend_Validate_CreditCard(Zend_Validate_CreditCard::VISA);
$valid->setService(array($service, 'checkOnline'));

Como puede ver, el método callback se llamará con el número de tarjeta de crédito como primer parámetro, y los tipos aceptados como segundo parámetro.

76.2.7. Ccnum

[Note] Nota

El validador Ccnum se ha declarado obsoleto en favor del validador CreditCard. Por razones de seguridad debería usar CreditCard en lugar de Ccnum.

76.2.8. Date

Zend_Validate_Date le permite validar si un valor determinado contiene una fecha. Este validador también valida entradas localizadas.

76.2.8.1. Opciones admitidas para Zend_Validate_Date

Se admiten las siguientes opciones para Zend_Validate_Date:

  • format: Establece el formato que se usa para escribir la fecha.

  • locale: Establece la configuración regional que se usará para validar los valores de fecha.

76.2.8.2. Validación de fecha predeterminada

La forma más fácil de validar una fecha es usando el formato de fecha predeterminado. Se usa cuando no se ha dado ninguna configuración regional ni ningún formato.

$validator = new Zend_Validate_Date();

$validator->isValid('2000-10-10');   // returns true
$validator->isValid('10.10.2000'); // returns false

El formato de fecha predeterminado para Zend_Validate_Date es 'yyyy-MM-dd'.

76.2.8.3. Validación de fecha localizada

Zend_Validate_Date también valida fechas dadas en un formato localizado. Usando la opción locale puede definir la configuración regional que debe usar el formato de fecha para la validación.

$validator = new Zend_Validate_Date(array('locale' => 'de'));

$validator->isValid('10.Feb.2010'); // returns true
$validator->isValid('10.May.2010'); // returns false

La opción locale establece el formato de fecha predeterminado. En el ejemplo anterior este es 'dd.MM.yyyy', que se define como formato de fecha predeterminado para 'de'.

76.2.8.4. Validación de fecha definida por el usuario

Zend_Validate_Date también admite formatos de fecha definidos por el usuario. Cuando quiera validar tal fecha puede usar la opción format.

$validator = new Zend_Validate_Date(array('format' => 'yyyy'));

$validator->isValid('2010'); // returns true
$validator->isValid('May');  // returns false

Por supuesto puede combinar format y locale. En este caso también puede usar nombres de mes o de día localizados.

$validator = new Zend_Validate_Date(array('format' => 'yyyy MMMM', 'locale' => 'de'));

$validator->isValid('2010 Dezember'); // returns true
$validator->isValid('2010 June');     // returns false

76.2.9. Db_RecordExists y Db_NoRecordExists

Zend_Validate_Db_RecordExists y Zend_Validate_Db_NoRecordExists proporcionan un medio para probar si un registro existe en una tabla determinada de una base de datos, con un valor determinado.

76.2.9.1. Opciones admitidas para Zend_Validate_Db_*

Se admiten las siguientes opciones para Zend_Validate_Db_NoRecordExists y Zend_Validate_Db_RecordExists:

  • adapter: El adaptador de base de datos que se usará para la búsqueda.

  • exclude: Establece los registros que se excluirán de la búsqueda.

  • field: El campo de la base de datos dentro de esta tabla en el que se buscará el registro.

  • schema: Establece el esquema que se usará para la búsqueda.

  • table: La tabla en la que se buscará el registro.

76.2.9.2. Uso básico

Un ejemplo de uso básico de los validadores:

//Check that the email address exists in the database
$validator = new Zend_Validate_Db_RecordExists(
    array(
        'table' => 'users',
        'field' => 'emailaddress'
    )
);

if ($validator->isValid($emailaddress)) {
    // email address appears to be valid
} else {
    // email address is invalid; print the reasons
    foreach ($validator->getMessages() as $message) {
        echo "$message\n";
    }
}

Lo anterior probará que una dirección de correo electrónico determinada está en la tabla de la base de datos. Si no se encuentra ningún registro que contenga el valor de $emailaddress en la columna especificada, se muestra un mensaje de error.

//Check that the username is not present in the database
$validator = new Zend_Validate_Db_NoRecordExists(
    array(
        'table' => 'users',
        'field' => 'username'
    )
);
if ($validator->isValid($username)) {
    // username appears to be valid
} else {
    // username is invalid; print the reason
    $messages = $validator->getMessages();
    foreach ($messages as $message) {
        echo "$message\n";
    }
}

Lo anterior probará que un nombre de usuario determinado no está en la tabla de la base de datos. Si se encuentra un registro que contiene el valor de $username en la columna especificada, se muestra un mensaje de error.

76.2.9.3. Excluir registros

Zend_Validate_Db_RecordExists y Zend_Validate_Db_NoRecordExists también proporcionan un medio para probar la base de datos, excluyendo una parte de la tabla, ya sea proporcionando una cláusula where como cadena, o un array con las claves "field" y "value".

Cuando se proporciona un array para la cláusula de exclusión, se usa el operador !=, de modo que puede comprobar el resto de una tabla en busca de un valor antes de modificar un registro (por ejemplo en un formulario de perfil de usuario)

//Check no other users have the username
$user_id   = $user->getId();
$validator = new Zend_Validate_Db_NoRecordExists(
    array(
        'table' => 'users',
        'field' => 'username',
        'exclude' => array(
            'field' => 'id',
            'value' => $user_id
        )
    )
);

if ($validator->isValid($username)) {
    // username appears to be valid
} else {
    // username is invalid; print the reason
    $messages = $validator->getMessages();
    foreach ($messages as $message) {
        echo "$message\n";
    }
}

El ejemplo anterior comprobará la tabla para asegurar que ningún registro salvo aquel donde id = $user_id contiene el valor $username.

También puede proporcionar una cadena para la cláusula de exclusión, de modo que pueda usar un operador distinto de !=. Esto puede ser útil para probar contra claves compuestas.

$email     = 'user@example.com';
$clause    = $db->quoteInto('email = ?', $email);
$validator = new Zend_Validate_Db_RecordExists(
    array(
        'table'   => 'users',
        'field'   => 'username',
        'exclude' => $clause
    )
);

if ($validator->isValid($username)) {
    // username appears to be valid
} else {
    // username is invalid; print the reason
    $messages = $validator->getMessages();
    foreach ($messages as $message) {
        echo "$message\n";
    }
}

El ejemplo anterior comprobará la tabla 'users' para asegurar que solo un registro con tanto el nombre de usuario $username como el email $email es válido.

76.2.9.4. Adaptadores de base de datos

También puede especificar un adaptador. Esto le permitirá trabajar con aplicaciones que usan múltiples adaptadores de base de datos, o donde no ha establecido un adaptador predeterminado. Como en el siguiente ejemplo:

$validator = new Zend_Validate_Db_RecordExists(
    array(
        'table' => 'users',
        'field' => 'id',
        'adapter' => $dbAdapter
    )
);

76.2.9.5. Esquemas de base de datos

Puede especificar un esquema dentro de su base de datos para adaptadores como PostgreSQL y DB/2 simplemente proporcionando un array con las claves table y schema. Como en el siguiente ejemplo:

$validator = new Zend_Validate_Db_RecordExists(
    array(
        'table'  => 'users',
        'schema' => 'my',
        'field'  => 'id'
    )
);

76.2.10. Digits

Zend_Validate_Digits valida si un valor determinado contiene solo dígitos.

76.2.10.1. Opciones admitidas para Zend_Validate_Digits

No hay opciones adicionales para Zend_Validate_Digits:

76.2.10.2. Validar dígitos

Para validar si un valor determinado contiene solo dígitos y ningún otro carácter, simplemente llame al validador como se muestra en este ejemplo:

$validator = new Zend_Validate_Digits();

$validator->isValid("1234567890"); // returns true
$validator->isValid(1234);         // returns true
$validator->isValid('1a234');      // returns false
[Note] Validar números

Cuando quiera validar números o valores numéricos, tenga en cuenta que este validador solo valida dígitos. Esto significa que cualquier otro signo como un separador de miles o una coma no pasará este validador. En este caso debería usar Zend_Validate_Int o Zend_Validate_Float.

76.2.11. EmailAddress

Zend_Validate_EmailAddress le permite validar una dirección de correo electrónico. El validador primero divide la dirección de correo en la parte local @ el nombre de host e intenta cotejarlos contra especificaciones conocidas para direcciones de correo y nombres de host.

76.2.11.1. Uso básico

Un ejemplo básico de uso está a continuación:

$validator = new Zend_Validate_EmailAddress();
if ($validator->isValid($email)) {
    // email appears to be valid
} else {
    // email is invalid; print the reasons
    foreach ($validator->getMessages() as $message) {
        echo "$message\n";
    }
}

Esto cotejará la dirección de correo electrónico $email y, en caso de fallo, rellenará getMessages() con mensajes de error útiles.

76.2.11.2. Opciones para validar direcciones de correo electrónico

Zend_Validate_EmailAddress admite varias opciones que se pueden establecer bien en la inicialización, dando un array con las opciones relacionadas, o posteriormente, usando setOptions(). Se admiten las siguientes opciones:

  • allow: Define qué tipo de nombres de dominio se aceptan. Esta opción se usa junto con la opción hostname para establecer el validador de nombre de host. Para más información sobre los posibles valores de esta opción, eche un vistazo a Hostname y las posibles constantes ALLOW*. Esta opción tiene como valor predeterminado ALLOW_DNS.

  • deep: Define si los registros MX del servidor deben verificarse con una comprobación profunda. Cuando esta opción se establece en TRUE, además de los registros MX también se usan los registros A, A6 y AAAA para verificar si el servidor acepta correos. Esta opción tiene como valor predeterminado FALSE.

  • domain: Define si se debe comprobar la parte del dominio. Cuando esta opción se establece en FALSE, solo se comprobará la parte local de la dirección de correo electrónico. En este caso no se llamará al validador de nombre de host. Esta opción tiene como valor predeterminado TRUE.

  • hostname: Establece el validador de nombre de host con el que se validará la parte del dominio de la dirección de correo electrónico.

  • mx: Define si se deben detectar los registros MX del servidor. Si esta opción se define como TRUE, entonces se usan los registros MX para verificar si el servidor acepta correos. Esta opción tiene como valor predeterminado FALSE.

$validator = new Zend_Validate_EmailAddress();
$validator->setOptions(array('domain' => false));

76.2.11.3. Partes locales complejas

Zend_Validate_EmailAddress cotejará cualquier dirección de correo electrónico válida según RFC2822. Por ejemplo, los correos válidos incluyen bob@domain.com, bob+jones@domain.us, "bob@jones"@domain.com y "bob jones"@domain.com.

Algunos formatos de correo electrónico obsoletos actualmente no se validarán (p. ej. retornos de carro o un carácter "\" en una dirección de correo electrónico).

76.2.11.4. Validar solo la parte local

Si necesita que Zend_Validate_EmailAddress compruebe solo la parte local de una dirección de correo electrónico, y quiere deshabilitar la validación del nombre de host, puede establecer la opción domain en FALSE. Esto obliga a Zend_Validate_EmailAddress a no validar la parte de nombre de host de la dirección de correo electrónico.

$validator = new Zend_Validate_EmailAddress();
$validator->setOptions(array('domain' => FALSE));

76.2.11.5. Validar diferentes tipos de nombres de host

La parte de nombre de host de una dirección de correo electrónico se valida contra Zend_Validate_Hostname. Por defecto solo se aceptan nombres de host DNS de la forma domain.com, aunque si lo desea también puede aceptar direcciones IP y nombres de host locales.

Para hacer esto necesita instanciar Zend_Validate_EmailAddress pasando un parámetro para indicar el tipo de nombres de host que quiere aceptar. Hay más detalles incluidos en Zend_Validate_Hostname, aunque a continuación aparece un ejemplo de cómo aceptar nombres de host tanto DNS como locales:

$validator = new Zend_Validate_EmailAddress(
                    Zend_Validate_Hostname::ALLOW_DNS |
                    Zend_Validate_Hostname::ALLOW_LOCAL);
if ($validator->isValid($email)) {
    // email appears to be valid
} else {
    // email is invalid; print the reasons
    foreach ($validator->getMessages() as $message) {
        echo "$message\n";
    }
}

76.2.11.6. Comprobar si el nombre de host realmente acepta correo

Solo porque una dirección de correo electrónico esté en el formato correcto, no significa necesariamente que esa dirección de correo realmente exista. Para ayudar a resolver este problema, puede usar la validación MX para comprobar si existe una entrada MX (correo) en el registro DNS para el nombre de host del correo. Esto le dice que el nombre de host acepta correo, pero no le dice que la dirección de correo electrónico exacta en sí sea válida.

La comprobación MX no está habilitada por defecto. Para habilitar la comprobación MX puede pasar un segundo parámetro al constructor de Zend_Validate_EmailAddress.

$validator = new Zend_Validate_EmailAddress(
    array(
        'allow' => Zend_Validate_Hostname::ALLOW_DNS,
        'mx'    => true
    )
);
[Note] Comprobación MX en Windows

Dentro de entornos Windows la comprobación MX solo está disponible cuando se usa PHP 5.3 o superior. Por debajo de PHP 5.3 la comprobación MX no se usará aunque esté activada dentro de las opciones.

Alternativamente puede pasar TRUE o FALSE a setValidateMx() para habilitar o deshabilitar la validación MX.

Al habilitar esta configuración se usarán funciones de red para comprobar la presencia de un registro MX en el nombre de host de la dirección de correo electrónico que desea validar. Tenga en cuenta que esto probablemente ralentizará su script.

A veces la validación de registros MX devuelve FALSE, incluso si se aceptan los correos. La razón detrás de este comportamiento es que los servidores pueden aceptar correos incluso si no proporcionan un registro MX. En este caso pueden proporcionar registros A, A6 o AAAA. Para permitir que Zend_Validate_EmailAddress también compruebe estos otros registros, necesita establecer la validación MX profunda. Esto se puede hacer en la inicialización estableciendo la opción deep o usando setOptions().

$validator = new Zend_Validate_EmailAddress(
    array(
        'allow' => Zend_Validate_Hostname::ALLOW_DNS,
        'mx'    => true,
        'deep'  => true
    )
);
[Warning] Advertencia de rendimiento

Debe tener en cuenta que habilitar la comprobación MX ralentizará su script debido a las funciones de red usadas. Habilitar la comprobación profunda ralentizará su script aún más, ya que busca en el servidor dado 3 tipos adicionales.

[Note] Direcciones IP no permitidas

Debe tener en cuenta que la validación MX solo se acepta para servidores externos. Cuando la validación MX profunda está habilitada, las direcciones IP locales como 192.168.* o 169.254.* no se aceptan.

76.2.11.7. Validar nombres de dominio internacionales

Zend_Validate_EmailAddress también cotejará caracteres internacionales que existen en algunos dominios. Esto se conoce como soporte de International Domain Name (IDN). Esto está habilitado por defecto, aunque puede deshabilitarlo cambiando la configuración a través del objeto interno Zend_Validate_Hostname que existe dentro de Zend_Validate_EmailAddress.

$validator->getHostnameValidator()->setValidateIdn(false);

Más información sobre el uso de setValidateIdn() aparece en la documentación de Zend_Validate_Hostname.

Tenga en cuenta que los IDN solo se validan si permite que se validen nombres de host DNS.

76.2.11.8. Validar dominios de nivel superior

Por defecto, un nombre de host se comprobará contra una lista de TLD conocidos. Esto está habilitado por defecto, aunque puede deshabilitarlo cambiando la configuración a través del objeto interno Zend_Validate_Hostname que existe dentro de Zend_Validate_EmailAddress.

$validator->getHostnameValidator()->setValidateTld(false);

Más información sobre el uso de setValidateTld() aparece en la documentación de Zend_Validate_Hostname.

Tenga en cuenta que los TLD solo se validan si permite que se validen nombres de host DNS.

76.2.11.9. Establecer mensajes

Zend_Validate_EmailAddress también hace uso de Zend_Validate_Hostname para comprobar la parte de nombre de host de una dirección de correo electrónico determinada. Al igual que con Zend Framework 1.10 puede simplemente establecer mensajes para Zend_Validate_Hostname desde dentro de Zend_Validate_EmailAddress.

$validator = new Zend_Validate_EmailAddress();
$validator->setMessages(
    array(
        Zend_Validate_Hostname::UNKNOWN_TLD => "I don't know the TLD you gave"
    )
);

Antes de Zend Framework 1.10 tenía que adjuntar los mensajes a su propio Zend_Validate_Hostname, y luego establecer este validador dentro de Zend_Validate_EmailAddress para obtener sus propios mensajes devueltos.

76.2.12. Float

Zend_Validate_Float le permite validar si un valor determinado contiene un valor de punto flotante. Este validador también valida entradas localizadas.

76.2.12.1. Opciones admitidas para Zend_Validate_Float

Se admiten las siguientes opciones para Zend_Validate_Float:

  • locale: Establece la configuración regional que se usará para validar valores flotantes localizados.

76.2.12.2. Validación simple de valores flotantes

La forma más simple de validar un valor flotante es usando la configuración del sistema. Cuando no se usa ninguna opción, se usa la configuración regional del entorno para la validación:

$validator = new Zend_Validate_Float();

$validator->isValid(1234.5);   // returns true
$validator->isValid('10a01'); // returns false
$validator->isValid('1,234.5'); // returns true

En el ejemplo anterior esperábamos que nuestro entorno esté configurado con "en" como configuración regional.

76.2.12.3. Validación de valores flotantes localizada

A menudo es útil poder validar también valores localizados. Los valores flotantes a menudo se escriben de forma diferente en otros países. Por ejemplo usando inglés escribirá "1.5". En alemán puede escribir "1,5" y en otros idiomas puede usar agrupación.

Zend_Validate_Float es capaz de validar tales notaciones. Pero está limitado a la configuración regional que establezca. Vea el siguiente código:

$validator = new Zend_Validate_Float(array('locale' => 'de'));

$validator->isValid(1234.5); // returns true
$validator->isValid("1 234,5"); // returns false
$validator->isValid("1.234"); // returns true

Como puede ver, al usar una configuración regional, su entrada se valida de forma localizada. Al usar una notación diferente obtiene un FALSE cuando la configuración regional fuerza una notación diferente.

La configuración regional también se puede establecer posteriormente usando setLocale() y recuperar usando getLocale().

76.2.13. GreaterThan

Zend_Validate_GreaterThan le permite validar si un valor determinado es mayor que un valor límite mínimo.

[Note] Zend_Validate_GreaterThan admite solo la validación de números

Debe tenerse en cuenta que Zend_Validate_GreaterThan admite solo la validación de números. Las cadenas o fechas no se pueden validar con este validador.

76.2.13.1. Opciones admitidas para Zend_Validate_GreaterThan

Se admiten las siguientes opciones para Zend_Validate_GreaterThan:

  • min: Establece el valor límite mínimo.

76.2.13.2. Uso básico

Para validar si un valor determinado es mayor que un límite definido simplemente use el siguiente ejemplo.

$valid  = new Zend_Validate_GreaterThan(array('min' => 10));
$value  = 11;
$return = $valid->isValid($value);
// returns true

El ejemplo anterior devuelve TRUE para todos los valores que son mayores que 10.

$valid  = new Zend_Validate_GreaterThan(array('min' => 10));
$value  = 10;
$return = $valid->isValid($value);
// returns false

El ejemplo anterior devuelve FALSE para todos los valores que son menores o iguales al valor límite mínimo.

76.2.14. Hex

Zend_Validate_Hex le permite validar si un valor determinado contiene solo caracteres hexadecimales. Estos son todos los caracteres de 0 a 9 y A a F, sin distinción entre mayúsculas y minúsculas. No existe limitación de longitud para la entrada que desea validar.

$validator = new Zend_Validate_Hex();
if ($validator->isValid('123ABC')) {
    // value contains only hex chars
} else {
    // false
}
[Note] Caracteres no válidos

Todos los demás caracteres devolverán false, incluyendo espacios en blanco y el punto decimal. Además los ceros unicode y números de otras escrituras distintas del latín no se tratarán como válidos.

76.2.14.1. Opciones admitidas para Zend_Validate_Hex

No hay opciones adicionales para Zend_Validate_Hex:

76.2.15. Hostname

Zend_Validate_Hostname le permite validar un nombre de host contra un conjunto de especificaciones conocidas. Es posible comprobar tres tipos diferentes de nombres de host: un nombre de host DNS (p. ej. domain.com), una dirección IP (p. ej. 1.2.3.4), y nombres de host locales (p. ej. localhost). Por defecto solo se cotejan los nombres de host DNS.

76.2.15.1. Opciones admitidas para Zend_Validate_Hostname

Se admiten las siguientes opciones para Zend_Validate_Hostname:

  • allow: Define el tipo de nombre de host que se permite usar. Vea Tipos de nombre de host para más detalles.

  • idn: Define si se permiten los dominios IDN. Esta opción tiene como valor predeterminado TRUE.

  • ip: Permite definir un validador de IP propio. Esta opción tiene como valor predeterminado una nueva instancia de Zend_Validate_Ip.

  • tld: Define si se validan los TLD. Esta opción tiene como valor predeterminado TRUE.

76.2.15.2. Uso básico

Un ejemplo básico de uso está a continuación:

$validator = new Zend_Validate_Hostname();
if ($validator->isValid($hostname)) {
    // hostname appears to be valid
} else {
    // hostname is invalid; print the reasons
    foreach ($validator->getMessages() as $message) {
        echo "$message\n";
    }
}

Esto cotejará el nombre de host $hostname y, en caso de fallo, rellenará getMessages() con mensajes de error útiles.

76.2.15.3. Validar diferentes tipos de nombres de host

Puede encontrar que también quiere cotejar direcciones IP, nombres de host locales, o una combinación de todos los tipos permitidos. Esto se puede hacer pasando un parámetro a Zend_Validate_Hostname cuando lo instancie. El parámetro debe ser un entero que determine qué tipos de nombres de host se permiten. Se le anima a usar las constantes de Zend_Validate_Hostname para hacer esto.

Las constantes de Zend_Validate_Hostname son: ALLOW_DNS para permitir solo nombres de host DNS, ALLOW_IP para permitir direcciones IP, ALLOW_LOCAL para permitir nombres de red locales, ALLOW_URI para permitir direcciones conformes a RFC3986, y ALLOW_ALL para permitir los cuatro tipos anteriores.

[Note] Información adicional sobre ALLOW_URI

ALLOW_URI permite comprobar nombres de host según RFC3986. Estos son nombres registrados que usan WINS, NetInfo y también nombres de host locales como los definidos en su archivo .hosts.

Para comprobar solo direcciones IP puede usar el siguiente ejemplo:

$validator = new Zend_Validate_Hostname(Zend_Validate_Hostname::ALLOW_IP);
if ($validator->isValid($hostname)) {
    // hostname appears to be valid
} else {
    // hostname is invalid; print the reasons
    foreach ($validator->getMessages() as $message) {
        echo "$message\n";
    }
}

Además de usar ALLOW_ALL para aceptar todos los tipos de nombres de host comunes, puede combinar estos tipos para permitir combinaciones. Por ejemplo, para aceptar nombres de host DNS y locales, instancie su objeto Zend_Validate_Hostname así:

$validator = new Zend_Validate_Hostname(Zend_Validate_Hostname::ALLOW_DNS |
                                        Zend_Validate_Hostname::ALLOW_IP);

76.2.15.4. Validar nombres de dominio internacionales

Algunos dominios de código de país de nivel superior (ccTLD), como 'de' (Alemania), admiten caracteres internacionales en nombres de dominio. Esto se conoce como International Domain Names (IDN). Estos dominios pueden ser cotejados por Zend_Validate_Hostname mediante caracteres extendidos que se usan en el proceso de validación.

[Note] Dominios IDN

Hasta ahora más de 50 ccTLD admiten dominios IDN.

Para cotejar un dominio IDN es tan simple como usar el validador Hostname estándar, ya que la comprobación IDN está habilitada por defecto. Si desea deshabilitar la validación IDN esto se puede hacer bien pasando un parámetro al constructor de Zend_Validate_Hostname o mediante el método setValidateIdn().

Puede deshabilitar la validación IDN pasando un segundo parámetro al constructor de Zend_Validate_Hostname de la siguiente manera.

$validator =
    new Zend_Validate_Hostname(
        array(
            'allow' => Zend_Validate_Hostname::ALLOW_DNS,
            'idn'   => false
        )
    );

Alternativamente puede pasar TRUE o FALSE a setValidateIdn() para habilitar o deshabilitar la validación IDN. Si está intentando cotejar un nombre de host IDN que actualmente no se admite, es probable que falle la validación si tiene algún carácter internacional. Cuando no existe un archivo de ccTLD en Zend/Validate/Hostname que especifique los caracteres adicionales, se realiza una validación de nombre de host normal.

[Note] Validación IDN

Tenga en cuenta que los IDN solo se validan si permite que se validen nombres de host DNS.

76.2.15.5. Validar dominios de nivel superior

Por defecto, un nombre de host se comprobará contra una lista de TLD conocidos. Si esta funcionalidad no es necesaria, se puede deshabilitar de la misma manera que al deshabilitar el soporte IDN. Puede deshabilitar la validación TLD pasando un tercer parámetro al constructor de Zend_Validate_Hostname. En el siguiente ejemplo estamos admitiendo la validación IDN mediante el segundo parámetro.

$validator =
    new Zend_Validate_Hostname(
        array(
            'allow' => Zend_Validate_Hostname::ALLOW_DNS,
            'idn'   => true,
            'tld'   => false
        )
    );

Alternativamente puede pasar TRUE o FALSE a setValidateTld() para habilitar o deshabilitar la validación TLD.

[Note] Validación TLD

Tenga en cuenta que los TLD solo se validan si permite que se validen nombres de host DNS.

76.2.16. Iban

Zend_Validate_Iban valida si un valor determinado podría ser un número IBAN. IBAN es la abreviatura de "International Bank Account Number".

76.2.16.1. Opciones admitidas para Zend_Validate_Iban

Se admiten las siguientes opciones para Zend_Validate_Iban:

  • locale: Establece la configuración regional que se usa para obtener el formato IBAN para la validación.

76.2.16.2. Validación IBAN

Los números IBAN siempre están relacionados con un país. Esto significa que diferentes países usan diferentes formatos para sus números IBAN. Esta es la razón por la que los números IBAN siempre necesitan una configuración regional. Sabiendo esto ya sabemos cómo usar Zend_Validate_Iban.

76.2.16.2.1. Configuración regional de toda la aplicación

Podríamos usar la configuración regional de toda la aplicación. Esto significa que cuando no se da ninguna opción en la inicialización, Zend_Validate_Iban busca la configuración regional de toda la aplicación. Vea el siguiente fragmento de código:

// within bootstrap
Zend_Registry::set('Zend_Locale', new Zend_Locale('de_AT'));

// within the module
$validator = new Zend_Validate_Iban();

if ($validator->isValid('AT611904300234573201')) {
    // IBAN appears to be valid
} else {
    // IBAN is not valid
}
[Note] Configuración regional de toda la aplicación

Por supuesto esto solo funciona cuando se estableció previamente una configuración regional de toda la aplicación en el registro. De lo contrario Zend_Locale intentará usar la configuración regional que envíe el cliente o, cuando no se envíe ninguna, usa la configuración regional del entorno. Tenga en cuenta que esto puede llevar a un comportamiento no deseado dentro de la validación.

76.2.16.2.2. Validación IBAN no exhaustiva

A veces es útil solo validar si el valor determinado es un número IBAN o no. Esto significa que no quiere validarlo contra un país definido. Esto se puede hacer usando FALSE como configuración regional.

$validator = new Zend_Validate_Iban(array('locale' => false));
// Note: you can also set a FALSE as single parameter

if ($validator->isValid('AT611904300234573201')) {
    // IBAN appears to be valid
} else {
    // IBAN is not valid
}

Así que cualquier número IBAN será válido. Tenga en cuenta que esto no debería hacerse cuando solo acepta cuentas de un único país.

76.2.16.2.3. Validación IBAN sensible a la región

Para validar contra un país definido, solo necesita dar la configuración regional deseada. Puede hacer esto mediante la opción locale y también posteriormente usando setLocale().

$validator = new Zend_Validate_Iban(array('locale' => 'de_AT'));

if ($validator->isValid('AT611904300234573201')) {
    // IBAN appears to be valid
} else {
    // IBAN is not valid
}
[Note] Use configuraciones regionales completamente calificadas

Debe dar una configuración regional completamente calificada, de lo contrario el país no se podría detectar correctamente porque los idiomas se hablan en múltiples países.

76.2.17. Identical

Zend_Validate_Identical le permite validar si un valor determinado es idéntico a un haystack establecido.

76.2.17.1. Opciones admitidas para Zend_Validate_Identical

Se admiten las siguientes opciones para Zend_Validate_Identical:

  • strict: Define si la validación debe hacerse estricta. El valor predeterminado es TRUE.

  • token: Establece el token contra el que se validará la entrada.

76.2.17.2. Uso básico

Para validar si dos valores son idénticos necesita establecer el valor de origen como haystack. Vea el siguiente ejemplo que valida dos cadenas.

$valid = new Zend_Validate_Identical('origin');
if ($valid->isValid($value) {
    return true;
}

La validación solo devolverá TRUE cuando ambos valores sean 100% idénticos. En nuestro ejemplo, cuando $value es 'origin'.

También puede establecer el token deseado posteriormente usando el método setToken() y getToken() para obtener el token establecido actualmente.

76.2.17.3. Objetos idénticos

Por supuesto Zend_Validate_Identical puede validar no solo cadenas, sino también cualquier otro tipo de variable como Booleano, Entero, Flotante, Array o incluso Objetos. Como ya se ha señalado, Haystack y Value deben ser idénticos.

$valid = new Zend_Validate_Identical(123);
if ($valid->isValid($input)) {
    // input appears to be valid
} else {
    // input is invalid
}
[Note] Comparación de tipos

Debe tener en cuenta que también se usa el tipo de una variable para la validación. Esto significa que la cadena '3' no es idéntica al entero 3. Cuando quiera una validación no estricta debe establecer la opción strict.

76.2.17.4. Elementos de formulario

Zend_Validate_Identical también admite la comparación de elementos de formulario. Esto se puede hacer usando el nombre del elemento como token. Vea el siguiente ejemplo:

$form->addElement('password', 'elementOne');
$form->addElement('password', 'elementTwo', array(
    'validators' => array(
        array('identical', false, array('token' => 'elementOne'))
    )
));

Usando el nombre del primer elemento como token para el segundo elemento, el validador valida si el segundo elemento es igual al primer elemento. En caso de que su usuario no introduzca dos valores idénticos, obtendrá un error de validación.

76.2.17.5. Validación estricta

Como se mencionó antes, Zend_Validate_Identical valida los tokens de forma estricta. Puede cambiar este comportamiento usando la opción strict. El valor predeterminado para esta propiedad es TRUE.

$valid = new Zend_Validate_Identical(array('token' => 123, 'strict' => FALSE));
$input = '123';
if ($valid->isValid($input)) {
    // input appears to be valid
} else {
    // input is invalid
}

La diferencia con el ejemplo anterior es que la validación devuelve en este caso TRUE, incluso si compara un valor entero con uno de cadena siempre que el contenido sea idéntico pero no el tipo.

Por conveniencia también puede usar setStrict() y getStrict().

76.2.17.6. Configuración

Como todos los demás validadores, Zend_Validate_Identical también admite el uso de configuraciones como parámetro de entrada. Esto significa que puede configurar este validador con un objeto Zend_Config.

Pero esto añade un caso del que debe ser consciente. Cuando use un array como haystack, debería envolverlo dentro de una clave 'token' cuando pudiera contener un solo elemento.

$valid = new Zend_Validate_Identical(array('token' => 123));
if ($valid->isValid($input)) {
    // input appears to be valid
} else {
    // input is invalid
}

El ejemplo anterior valida el entero 123. La razón de este caso especial es que puede configurar el token que se debe usar dando la clave 'token'.

Así que, cuando su haystack contiene un elemento y este elemento se llama 'token', entonces debe envolverlo como se muestra en el ejemplo de abajo.

$valid = new Zend_Validate_Identical(array('token' => array('token' => 123)));
if ($valid->isValid($input)) {
    // input appears to be valid
} else {
    // input is invalid
}

76.2.18. InArray

Zend_Validate_InArray le permite validar si un valor determinado está contenido dentro de un array. También es capaz de validar arrays multidimensionales.

76.2.18.1. Opciones admitidas para Zend_Validate_InArray

Se admiten las siguientes opciones para Zend_Validate_InArray:

  • haystack: Establece el haystack para la validación.

  • recursive: Define si la validación debe hacerse de forma recursiva. Esta opción tiene como valor predeterminado FALSE.

  • strict: Define si la validación debe hacerse estricta. Esta opción tiene como valor predeterminado FALSE.

76.2.18.2. Validación simple de array

La forma más simple es simplemente dar el array contra el que se debe buscar en la inicialización:

$validator = new Zend_Validate_InArray(array('key' => 'value',
                                             'otherkey' => 'othervalue'));
if ($validator->isValid('value')) {
    // value found
} else {
    // no value found
}

Esto se comportará exactamente como el método in_array() de PHP.

[Note] Nota

Por defecto esta validación no es estricta ni puede validar arrays multidimensionales.

Por supuesto también puede dar el array contra el que validar posteriormente usando el método setHaystack(). getHaystack() devuelve el array haystack establecido actualmente.

$validator = new Zend_Validate_InArray();
$validator->setHaystack(array('key' => 'value', 'otherkey' => 'othervalue'));

if ($validator->isValid('value')) {
    // value found
} else {
    // no value found
}

76.2.18.3. Validación estricta de array

Como se mencionó antes, también puede hacer una validación estricta dentro del array. Por defecto no habría diferencia entre el valor entero 0 y la cadena "0". Al hacer una validación estricta esta diferencia también se validará y solo se aceptan los mismos tipos.

Una validación estricta también se puede hacer usando dos formas diferentes. En la inicialización y mediante un método. En la inicialización debe dar un array con la siguiente estructura:

$validator = new Zend_Validate_InArray(
    array(
        'haystack' => array('key' => 'value', 'otherkey' => 'othervalue'),
        'strict'   => true
    )
);

if ($validator->isValid('value')) {
    // value found
} else {
    // no value found
}

La clave haystack contiene su array contra el que validar. Y al establecer la clave strict en TRUE, la validación se hace usando una comprobación estricta de tipos.

Por supuesto también puede usar el método setStrict() para cambiar esta configuración posteriormente y getStrict() para obtener el estado establecido actualmente.

[Note] Nota

Tenga en cuenta que la configuración strict es por defecto FALSE.

76.2.18.4. Validación recursiva de array

Además del método in_array() de PHP, este validador también se puede usar para validar arrays multidimensionales.

Para validar arrays multidimensionales debe establecer la opción recursive.

$validator = new Zend_Validate_InArray(
    array(
        'haystack' => array(
            'firstDimension' => array('key' => 'value',
                                      'otherkey' => 'othervalue'),
            'secondDimension' => array('some' => 'real',
                                       'different' => 'key')),
        'recursive' => true
    )
);

if ($validator->isValid('value')) {
    // value found
} else {
    // no value found
}

Su array se validará entonces de forma recursiva para ver si el valor dado está contenido. Además podría usar setRecursive() para establecer esta opción posteriormente y getRecursive() para recuperarla.

$validator = new Zend_Validate_InArray(
    array(
        'firstDimension' => array('key' => 'value',
                                  'otherkey' => 'othervalue'),
        'secondDimension' => array('some' => 'real',
                                   'different' => 'key')
    )
);
$validator->setRecursive(true);

if ($validator->isValid('value')) {
    // value found
} else {
    // no value found
}
[Note] Configuración predeterminada para la recursión

Por defecto la validación recursiva está desactivada.

[Note] Claves de opción dentro del haystack

Cuando use las claves 'haystack', 'strict' o 'recursive' dentro de su haystack, debe envolver la clave haystack.

76.2.19. Int

Zend_Validate_Int valida si un valor determinado es un entero. También se reconocen y pueden validarse valores enteros localizados.

76.2.19.1. Opciones admitidas para Zend_Validate_Int

Se admiten las siguientes opciones para Zend_Validate_Int:

  • locale: Establece la configuración regional que se usará para validar enteros localizados.

76.2.19.2. Validación simple de enteros

La forma más simple de validar un entero es usando la configuración del sistema. Cuando no se usa ninguna opción, se usa la configuración regional del entorno para la validación:

$validator = new Zend_Validate_Int();

$validator->isValid(1234);   // returns true
$validator->isValid(1234.5); // returns false
$validator->isValid('1,234'); // returns true

En el ejemplo anterior esperábamos que nuestro entorno esté configurado con "en" como configuración regional. Como puede ver en el tercer ejemplo, también se reconoce la agrupación.

76.2.19.3. Validación de enteros localizada

A menudo es útil poder validar también valores localizados. Los valores enteros a menudo se escriben de forma diferente en otros países. Por ejemplo usando inglés puede escribir "1234" o "1,234". Ambos son valores enteros pero la agrupación es opcional. En alemán, por ejemplo, puede escribir "1.234" y en francés "1 234".

Zend_Validate_Int es capaz de validar tales notaciones. Pero está limitado a la configuración regional que establezca. Esto significa que no simplemente elimina el separador, valida si se usa el separador correcto. Vea el siguiente código:

$validator = new Zend_Validate_Int(array('locale' => 'de'));

$validator->isValid(1234); // returns true
$validator->isValid("1,234"); // returns false
$validator->isValid("1.234"); // returns true

Como puede ver, al usar una configuración regional, su entrada se valida de forma localizada. Usando la notación inglesa obtiene un FALSE cuando la configuración regional fuerza una notación diferente.

La configuración regional también se puede establecer posteriormente usando setLocale() y recuperar usando getLocale().

76.2.20. Ip

Zend_Validate_Ip le permite validar si un valor determinado es una dirección IP. Admite el estándar IPv4 y también el estándar IPv6.

76.2.20.1. Opciones admitidas para Zend_Validate_Ip

Se admiten las siguientes opciones para Zend_Validate_Ip:

  • allowipv4: Define si el validador permite direcciones IPv4. Esta opción tiene como valor predeterminado TRUE.

  • allowipv6: Define si el validador permite direcciones IPv6. Esta opción tiene como valor predeterminado TRUE.

76.2.20.2. Uso básico

Un ejemplo básico de uso está a continuación:

$validator = new Zend_Validate_Ip();
if ($validator->isValid($ip)) {
    // ip appears to be valid
} else {
    // ip is invalid; print the reasons
}
[Note] Direcciones IP no válidas

Tenga en cuenta que Zend_Validate_Ip solo valida direcciones IP. Direcciones como 'mydomain.com' o '192.168.50.1/index.html' no son direcciones IP válidas. Son o bien nombres de host o URLs válidas pero no direcciones IP.

[Note] Validación IPv6

Zend_Validate_Ip valida direcciones IPv6 con expresiones regulares. La razón es que los filtros y métodos del propio PHP no siguen la RFC. Muchas otras clases disponibles tampoco la siguen.

76.2.20.3. Validar solo IPv4 o IPV6

A veces es útil validar solo uno de los formatos admitidos. Por ejemplo cuando su red solo admite IPv4. En este caso sería inútil permitir IPv6 dentro de este validador.

Para limitar Zend_Validate_Ip a un protocolo puede establecer las opciones allowipv4 o allowipv6 en FALSE. Puede hacer esto bien dando la opción al constructor o usando setOptions() posteriormente.

$validator = new Zend_Validate_Ip(array('allowipv6' => false);
if ($validator->isValid($ip)) {
    // ip appears to be valid ipv4 address
} else {
    // ip is no ipv4 address
}
[Note] Comportamiento predeterminado

El comportamiento predeterminado que sigue Zend_Validate_Ip es permitir ambos estándares.

76.2.21. Isbn

Zend_Validate_Isbn le permite validar un valor ISBN-10 o ISBN-13.

76.2.21.1. Opciones admitidas para Zend_Validate_Isbn

Se admiten las siguientes opciones para Zend_Validate_Isbn:

  • separator: Define el separador permitido para el número ISBN. Su valor predeterminado es una cadena vacía.

  • type: Define el tipo permitido de números ISBN. Su valor predeterminado es Zend_Validate_Isbn::AUTO. Para más detalles eche un vistazo a esta sección.

76.2.21.2. Uso básico

Un ejemplo básico de uso está a continuación:

$validator = new Zend_Validate_Isbn();
if ($validator->isValid($isbn)) {
    // isbn is valid
} else {
    // isbn is not valid
}

Esto validará cualquier ISBN-10 e ISBN-13 sin separador.

76.2.21.3. Establecer un tipo de validación ISBN explícito

Un ejemplo de restricción de tipo ISBN está a continuación:

$validator = new Zend_Validate_Isbn();
$validator->setType(Zend_Validate_Isbn::ISBN13);
// OR
$validator = new Zend_Validate_Isbn(array(
    'type' => Zend_Validate_Isbn::ISBN13,
));

if ($validator->isValid($isbn)) {
    // this is a valid ISBN-13 value
} else {
    // this is an invalid ISBN-13 value
}

Lo anterior validará solo valores ISBN-13.

Los tipos válidos incluyen:

  • Zend_Validate_Isbn::AUTO (predeterminado)

  • Zend_Validate_Isbn::ISBN10

  • Zend_Validate_Isbn::ISBN13

76.2.21.4. Especificar una restricción de separador

Un ejemplo de restricción de separador está a continuación:

$validator = new Zend_Validate_Isbn();
$validator->setSeparator('-');
// OR
$validator = new Zend_Validate_Isbn(array(
    'separator' => '-',
));

if ($validator->isValid($isbn)) {
    // this is a valid ISBN with separator
} else {
    // this is an invalid ISBN with separator
}
[Note] Valores sin separador

Esto devolverá FALSE si $isbn no contiene un separador o si es un valor ISBN no válido.

Los separadores válidos incluyen:

  • "" (vacío) (predeterminado)

  • "-" (guion)

  • " " (espacio)

76.2.22. LessThan

Zend_Validate_LessThan le permite validar si un valor determinado es menor que un valor límite máximo. Es el primo de Zend_Validate_GreaterThan.

[Note] Zend_Validate_LessThan admite solo la validación de números

Debe tenerse en cuenta que Zend_Validate_LessThan admite solo la validación de números. Las cadenas o fechas no se pueden validar con este validador.

76.2.22.1. Opciones admitidas para Zend_Validate_LessThan

Se admiten las siguientes opciones para Zend_Validate_LessThan:

  • max: Establece el valor máximo permitido.

76.2.22.2. Uso básico

Para validar si un valor determinado es menor que un límite definido simplemente use el siguiente ejemplo.

$valid  = new Zend_Validate_LessThan(array('max' => 10));
$value  = 10;
$return = $valid->isValid($value);
// returns true

El ejemplo anterior devuelve TRUE para todos los valores que sean iguales a 10 o menores que 10.

76.2.23. NotEmpty

Este validador le permite validar si un valor determinado no está vacío. Esto suele ser útil cuando se trabaja con elementos de formulario u otra entrada de usuario, donde puede usarlo para asegurarse de que los elementos requeridos tienen valores asociados.

76.2.23.1. Opciones admitidas para Zend_Validate_NotEmpty

Se admiten las siguientes opciones para Zend_Validate_NotEmpty:

  • type: Establece el tipo de validación que se procesará. Para más detalles eche un vistazo a esta sección.

76.2.23.2. Comportamiento predeterminado para Zend_Validate_NotEmpty

Por defecto, este validador funciona de forma diferente a como esperaría cuando ha trabajado con la función empty() de PHP. En particular, este validador evaluará tanto el entero 0 como la cadena '0' como vacíos.

$valid = new Zend_Validate_NotEmpty();
$value  = '';
$result = $valid->isValid($value);
// returns false
[Note] El comportamiento predeterminado difiere de PHP

Sin proporcionar configuración, el comportamiento de Zend_Validate_NotEmpty difiere del de PHP.

76.2.23.3. Cambiar el comportamiento de Zend_Validate_NotEmpty

Algunos proyectos tienen opiniones diferentes sobre lo que se considera un valor "vacío": una cadena con solo espacios en blanco podría considerarse vacía, o 0 puede considerarse no vacío (particularmente para secuencias booleanas). Para adaptarse a necesidades diferentes, Zend_Validate_NotEmpty le permite configurar qué tipos deben validarse como vacíos y cuáles no.

Se pueden manejar los siguientes tipos:

  • boolean: Devuelve FALSE cuando el valor booleano es FALSE.

  • integer: Devuelve FALSE cuando se da un valor entero 0. Por defecto esta validación no está activada y devuelve TRUE para cualquier valor entero.

  • float: Devuelve FALSE cuando se da un valor flotante 0.0. Por defecto esta validación no está activada y devuelve TRUE para cualquier valor flotante.

  • string: Devuelve FALSE cuando se da una cadena vacía ''.

  • zero: Devuelve FALSE cuando se da el carácter cero único ('0').

  • empty_array: Devuelve FALSE cuando se da un array vacío.

  • null: Devuelve FALSE cuando se da un valor NULL.

  • php: Devuelve FALSE por las mismas razones por las que el método empty() de PHP devolvería TRUE.

  • space: Devuelve FALSE cuando se da una cadena que contiene solo espacios en blanco.

  • object: Devuelve TRUE. Se devolverá FALSE cuando object no esté permitido pero se dé un objeto.

  • object_string: Devuelve FALSE cuando se da un objeto y su método __toString() devuelve una cadena vacía.

  • object_count: Devuelve FALSE cuando se da un objeto, tiene una interfaz Countable y su conteo es 0.

  • all: Devuelve FALSE en todos los tipos anteriores.

Todos los demás valores dados devolverán TRUE por defecto.

Hay varias formas de seleccionar cuáles de los tipos anteriores se validan. Puede dar uno o varios tipos y sumarlos, puede dar un array, puede usar constantes, o puede dar una cadena de texto. Vea los siguientes ejemplos:

// Returns false on 0
$validator = new Zend_Validate_NotEmpty(Zend_Validate_NotEmpty::INTEGER);

// Returns false on 0 or '0'
$validator = new Zend_Validate_NotEmpty(
    Zend_Validate_NotEmpty::INTEGER + Zend_NotEmpty::ZERO
);

// Returns false on 0 or '0'
$validator = new Zend_Validate_NotEmpty(array(
    Zend_Validate_NotEmpty::INTEGER,
    Zend_Validate_NotEmpty::ZERO
));

// Returns false on 0 or '0'
$validator = new Zend_Validate_NotEmpty(array(
    'integer',
    'zero',
));

También puede proporcionar una instancia de Zend_Config para establecer los tipos deseados. Para establecer tipos después de la instanciación, use el método setType().

76.2.24. PostCode

Zend_Validate_PostCode le permite determinar si un valor determinado es un código postal válido. Los códigos postales son específicos de ciudades, y en algunas configuraciones regionales se denominan códigos ZIP.

Zend_Validate_PostCode conoce más de 160 formatos diferentes de código postal. Para seleccionar el formato correcto hay 2 formas. Puede usar una configuración regional completamente calificada o puede establecer su propio formato manualmente.

Usar una configuración regional es más conveniente ya que Zend Framework ya conoce el formato de código postal apropiado para cada configuración regional; sin embargo, necesita usar la configuración regional completamente calificada (una que contenga un especificador de región) para hacerlo. Por ejemplo, la configuración regional "de" es una configuración regional pero no podría usarse con Zend_Validate_PostCode ya que no incluye la región; "de_AT", sin embargo, sería una configuración regional válida, ya que especifica el código de región ("AT", para Austria).

$validator = new Zend_Validate_PostCode('de_AT');

Cuando no establece usted mismo una configuración regional, entonces Zend_Validate_PostCode usará la configuración regional de toda la aplicación establecida, o, cuando no haya ninguna, la configuración regional devuelta por Zend_Locale.

// application wide locale within your bootstrap
$locale = new Zend_Locale('de_AT');
Zend_Registry::set('Zend_Locale', $locale);

$validator = new Zend_Validate_PostCode();

También puede cambiar la configuración regional posteriormente llamando a setLocale(). Y por supuesto puede obtener la configuración regional realmente usada llamando a getLocale().

$validator = new Zend_Validate_PostCode('de_AT');
$validator->setLocale('en_GB');

Los formatos de código postal en sí mismos son simplemente cadenas de expresión regular. Cuando el formato de código postal internacional, que se usa al establecer la configuración regional, no se ajusta a sus necesidades, entonces también puede establecer manualmente un formato llamando a setFormat().

$validator = new Zend_Validate_PostCode('de_AT');
$validator->setFormat('AT-\d{5}');
[Note] Convenciones para formatos definidos por el usuario

Cuando use formatos definidos por el usuario debería omitir las etiquetas de inicio ('/^') y fin ('$/'). Se adjuntan automáticamente.

También debe tener en cuenta que los valores de código postal siempre se validan de forma estricta. Esto significa que deben escribirse de forma independiente sin caracteres adicionales cuando no estén cubiertos por el formato.

76.2.24.1. Opciones del constructor

En su forma más básica, puede pasar bien un objeto Zend_Locale o una cadena que represente una configuración regional completamente calificada al constructor de Zend_Validate_PostCode.

$validator = new Zend_Validate_PostCode('de_AT');
$validator = new Zend_Validate_PostCode($locale);

Además, puede pasar bien un array o un objeto Zend_Config al constructor. Cuando lo haga, debe incluir bien la clave "locale" o "format"; estas se usarán para establecer los valores apropiados en el objeto validador.

$validator = new Zend_Validate_PostCode(array(
    'locale' => 'de_AT',
    'format' => 'AT_\d+'
));

76.2.24.2. Opciones admitidas para Zend_Validate_PostCode

Se admiten las siguientes opciones para Zend_Validate_PostCode:

  • format: Establece un formato de código postal que se usará para la validación de la entrada.

  • locale: Establece una configuración regional de la que se tomará el código postal.

76.2.25. Regex

Este validador le permite validar si una cadena determinada se ajusta a una expresión regular definida.

76.2.25.1. Opciones admitidas para Zend_Validate_Regex

Se admiten las siguientes opciones para Zend_Validate_Regex:

  • pattern: Establece el patrón de expresión regular para este validador.

76.2.25.2. Validación con Zend_Validate_Regex

La validación con expresiones regulares permite tener validaciones complicadas hechas sin escribir un validador propio. El uso de expresiones regulares es bastante común y simple. Veamos algunos ejemplos:

$validator = new Zend_Validate_Regex(array('pattern' => '/^Test/');

$validator->isValid("Test"); // returns true
$validator->isValid("Testing"); // returns true
$validator->isValid("Pest"); // returns false

Como puede ver, el patrón debe darse usando la misma sintaxis que preg_match(). Para más detalles sobre expresiones regulares eche un vistazo al manual de PHP sobre la sintaxis de patrones PCRE.

76.2.25.3. Manejo de patrones

También es posible establecer un patrón diferente posteriormente usando setPattern() y obtener el patrón establecido actualmente con getPattern().

$validator = new Zend_Validate_Regex(array('pattern' => '/^Test/');
$validator->setPattern('ing$/');

$validator->isValid("Test"); // returns false
$validator->isValid("Testing"); // returns true
$validator->isValid("Pest"); // returns false

76.2.26. Validadores Sitemap

Los siguientes validadores se ajustan al protocolo Sitemap XML.

76.2.26.1. Sitemap_Changefreq

Valida si una cadena es válida para usarse como elemento 'changefreq' en un documento Sitemap XML. Los valores válidos son: 'always', 'hourly', 'daily', 'weekly', 'monthly', 'yearly', o 'never'.

Devuelve TRUE si y solo si el valor es una cadena y es igual a una de las frecuencias especificadas anteriormente.

76.2.26.2. Sitemap_Lastmod

Valida si una cadena es válida para usarse como elemento 'lastmod' en un documento Sitemap XML. El elemento lastmod debe contener una cadena de fecha W3C, descartando opcionalmente información sobre la hora.

Devuelve TRUE si y solo si el valor dado es una cadena y es válido según el protocolo.

Ejemplo 76.1. Validador Sitemap Lastmod

$validator = new Zend_Validate_Sitemap_Lastmod();

$validator->isValid('1999-11-11T22:23:52-02:00'); // true
$validator->isValid('2008-05-12T00:42:52+02:00'); // true
$validator->isValid('1999-11-11'); // true
$validator->isValid('2008-05-12'); // true

$validator->isValid('1999-11-11t22:23:52-02:00'); // false
$validator->isValid('2008-05-12T00:42:60+02:00'); // false
$validator->isValid('1999-13-11'); // false
$validator->isValid('2008-05-32'); // false
$validator->isValid('yesterday'); // false

76.2.26.3. Sitemap_Loc

Valida si una cadena es válida para usarse como elemento 'loc' en un documento Sitemap XML. Esto usa Zend_Form::check() internamente. Lea más en Validación de URI.

76.2.26.4. Sitemap_Priority

Valida si un valor es válido para usarse como elemento 'priority' en un documento Sitemap XML. El valor debe ser un decimal entre 0.0 y 1.0. Este validador acepta tanto valores numéricos como valores de cadena.

Ejemplo 76.2. Validador Sitemap Priority

$validator = new Zend_Validate_Sitemap_Priority();

$validator->isValid('0.1'); // true
$validator->isValid('0.789'); // true
$validator->isValid(0.8); // true
$validator->isValid(1.0); // true

$validator->isValid('1.1'); // false
$validator->isValid('-0.4'); // false
$validator->isValid(1.00001); // false
$validator->isValid(0xFF); // false
$validator->isValid('foo'); // false

76.2.26.5. Opciones admitidas para Zend_Validate_Sitemap_*

No hay opciones admitidas para ninguno de los validadores Sitemap.

76.2.27. StringLength

Este validador le permite validar si una cadena determinada está dentro de una longitud definida.

[Note] Zend_Validate_StringLength admite solo la validación de cadenas

Debe tenerse en cuenta que Zend_Validate_StringLength admite solo la validación de cadenas. Los enteros, flotantes, fechas u objetos no se pueden validar con este validador.

76.2.27.1. Opciones admitidas para Zend_Validate_StringLength

Se admiten las siguientes opciones para Zend_Validate_StringLength:

  • encoding: Establece la codificación ICONV que se debe usar para esta cadena.

  • min: Establece la longitud mínima permitida para una cadena.

  • max: Establece la longitud máxima permitida para una cadena.

76.2.27.2. Comportamiento predeterminado para Zend_Validate_StringLength

Por defecto este validador comprueba si un valor está entre min y max. Pero para min el valor predeterminado es 0 y para max es NULL, lo que significa ilimitado.

Así que por defecto, sin dar ninguna opción, este validador solo comprueba si la entrada es una cadena.

76.2.27.3. Limitar la longitud máxima permitida de una cadena

Para limitar la longitud máxima permitida de una cadena necesita establecer la propiedad max. Acepta un valor entero como entrada.

$validator = new Zend_Validate_StringLength(array('max' => 6));

$validator->isValid("Test"); // returns true
$validator->isValid("Testing"); // returns false

También puede establecer la longitud máxima permitida posteriormente usando el método setMax(). Y getMax() para recuperar el límite máximo actual.

$validator = new Zend_Validate_StringLength();
$validator->setMax(6);

$validator->isValid("Test"); // returns true
$validator->isValid("Testing"); // returns false

76.2.27.4. Limitar la longitud mínima requerida de una cadena

Para limitar la longitud mínima requerida de una cadena necesita establecer la propiedad min. También acepta un valor entero como entrada.

$validator = new Zend_Validate_StringLength(array('min' => 5));

$validator->isValid("Test"); // returns false
$validator->isValid("Testing"); // returns true

También puede establecer la longitud mínima solicitada posteriormente usando el método setMin(). Y getMin() para recuperar el límite mínimo actual.

$validator = new Zend_Validate_StringLength();
$validator->setMin(5);

$validator->isValid("Test"); // returns false
$validator->isValid("Testing"); // returns true

76.2.27.5. Limitar una cadena por ambos lados

A veces se requiere obtener una cadena que tenga una longitud máxima definida pero que también tenga una longitud mínima. Por ejemplo cuando tiene un cuadro de texto donde un usuario puede introducir su nombre, entonces puede querer limitar el nombre a un máximo de 30 caracteres pero quiere asegurarse de que introdujo su nombre. Así que limita la longitud mínima requerida a 3 caracteres. Vea el siguiente ejemplo:

$validator = new Zend_Validate_StringLength(array('min' => 3, 'max' => 30));

$validator->isValid("."); // returns false
$validator->isValid("Test"); // returns true
$validator->isValid("Testing"); // returns true
[Note] Establecer un límite máximo menor que el límite mínimo

Cuando intenta establecer un valor máximo menor que el valor mínimo actual, o un valor mínimo mayor que el valor máximo actual, se lanzará una excepción.

76.2.27.6. Codificación de valores

Las cadenas siempre usan una codificación. Incluso cuando no establece la codificación explícitamente, PHP usa una. Cuando su aplicación usa una codificación diferente a la del propio PHP, entonces debería establecer una codificación usted mismo.

Puede establecer su propia codificación en la inicialización con la opción encoding, o usando el método setEncoding(). Supongamos que su instalación usa ISO y su aplicación está configurada en ISO. En este caso verá el siguiente comportamiento.

$validator = new Zend_Validate_StringLength(
    array('min' => 6)
);
$validator->isValid("Ärger"); // returns false

$validator->setEncoding("UTF-8");
$validator->isValid("Ärger"); // returns true

$validator2 = new Zend_Validate_StringLength(
    array('min' => 6, 'encoding' => 'UTF-8')
);
$validator2->isValid("Ärger"); // returns true

Así que cuando su instalación y su aplicación usan codificaciones diferentes, siempre debería establecer una codificación usted mismo.