Elementos de formulario

Resumen de los elementos de formulario estándar.

addText (string|int $name, $label=null, ?int $cols=null, ?int $maxLength=null): TextInput

Agrega un campo de texto de una línea (clase TextInput). Si el usuario no rellena el campo, devuelve una cadena vacía '', o mediante setNullable() se puede especificar que devuelva null.

$form->addText('name', 'Nombre:')
	->setRequired()
	->setNullable();

Valida automáticamente UTF-8, recorta los espacios iniciales y finales y elimina los saltos de línea que un atacante podría enviar.

La longitud máxima se puede limitar mediante setMaxLength(). Modificar el valor introducido por el usuario permite addFilter().

Mediante setHtmlType() se puede cambiar el carácter visual del campo de texto a tipos como search, tel o url ver especificación. Recuerde que el cambio de tipo es solo visual y no reemplaza la función de validación. Para el tipo url es conveniente agregar una regla de validación específica URL.

Para otros tipos de entradas, como number, range, email, date, datetime-local, time y color, utilice métodos especializados como addInteger, addFloat, addEmail addDate, addTime, addDateTime y addColor, que aseguran la validación del lado del servidor. Los tipos month y week aún no son totalmente compatibles con todos los navegadores.

Al elemento se le puede establecer el llamado empty-value, que es algo así como un valor predeterminado, pero si el usuario no lo cambia, el elemento devuelve una cadena vacía o null.

$form->addText('phone', 'Teléfono:')
	->setHtmlType('tel')
	->setEmptyValue('+34');

addTextArea (string|int $name, $label=null): TextArea

Agrega un campo para introducir texto multilínea (clase TextArea). Si el usuario no rellena el campo, devuelve una cadena vacía '', o mediante setNullable() se puede especificar que devuelva null.

$form->addTextArea('note', 'Nota:')
	->addRule($form::MaxLength, 'La nota es demasiado larga', 10000);

Valida automáticamente UTF-8 y normaliza los separadores de línea a \n. A diferencia del campo de entrada de una sola línea, no se realiza ningún recorte de espacios.

La longitud máxima se puede limitar mediante setMaxLength(). Modificar el valor introducido por el usuario permite addFilter(). Se puede establecer el llamado empty-value mediante setEmptyValue().

addInteger (string|int $name, $label=null): TextInput

Agrega un campo para introducir un número entero (clase TextInput). Devuelve un integer, o null si el usuario no introduce nada.

$form->addInteger('year', 'Año:')
	->addRule($form::Range, 'El año debe estar en el rango de %d a %d.', [1900, 2023]);

El elemento se renderiza como <input type="number">. Usando el método setHtmlType() se puede cambiar el tipo a range para mostrarlo como un control deslizante, o a text, si prefiere un campo de texto estándar sin el comportamiento especial del tipo number.

addFloat (string|int $name, $label=null): TextInput

Agrega un campo para introducir un número decimal (clase TextInput). Devuelve un float, o null si el usuario no introduce nada.

$form->addFloat('level', 'Nivel:')
	->setDefaultValue(0)
	->addRule($form::Range, 'El nivel debe estar en el rango de %d a %d.', [0, 100]);

El elemento se renderiza como <input type="number">. Usando el método setHtmlType() se puede cambiar el tipo a range para mostrarlo como un control deslizante, o a text, si prefiere un campo de texto estándar sin el comportamiento especial del tipo number.

Nette y el navegador Chrome aceptan tanto la coma como el punto como separador decimal. Para que esta funcionalidad esté disponible también en Firefox, se recomienda establecer el atributo lang ya sea para el elemento dado o para toda la página, por ejemplo <html lang="es">.

addEmail (string|int $name, $label=null, int $maxLength=255): TextInput

Agrega un campo para introducir una dirección de correo electrónico (clase TextInput). Si el usuario no rellena el campo, devuelve una cadena vacía '', o mediante setNullable() se puede especificar que devuelva null.

$form->addEmail('email', 'E-mail:');

Verifica si el valor es una dirección de correo electrónico válida. No se verifica si el dominio realmente existe, solo se verifica la sintaxis. Valida automáticamente UTF-8, recorta los espacios iniciales y finales.

La longitud máxima se puede limitar mediante setMaxLength(). Modificar el valor introducido por el usuario permite addFilter(). Se puede establecer el llamado empty-value mediante setEmptyValue().

addPassword (string|int $name, $label=null, ?int $cols=null, ?int $maxLength=null): TextInput

Agrega un campo para introducir una contraseña (clase TextInput).

$form->addPassword('password', 'Contraseña:')
	->setRequired()
	->addRule($form::MinLength, 'La contraseña debe tener al menos %d caracteres', 8)
	->addRule($form::Pattern, 'Debe contener un dígito', '.*[0-9].*');

Al volver a mostrar el formulario, el campo estará vacío. Valida automáticamente UTF-8, recorta los espacios iniciales y finales y elimina los saltos de línea que un atacante podría enviar.

addCheckbox (string|int $name, $caption=null): Checkbox

Agrega una casilla de verificación (clase Checkbox). Devuelve el valor true o false, dependiendo de si está marcada.

$form->addCheckbox('agree', 'Acepto los términos y condiciones')
	->setRequired('Es necesario aceptar los términos y condiciones');

addCheckboxList (string|int $name, $label=null, ?array $items=null): CheckboxList

Agrega casillas de verificación para seleccionar múltiples elementos (clase CheckboxList). Devuelve un array de claves de los elementos seleccionados. El método getSelectedItems() devuelve los valores en lugar de las claves.

$form->addCheckboxList('colors', 'Colores:', [
	'r' => 'rojo',
	'g' => 'verde',
	'b' => 'azul',
]);

El array de elementos ofrecidos se pasa como tercer parámetro o mediante el método setItems().

Mediante setDisabled(['r', 'g']) se pueden desactivar elementos individuales.

El elemento comprueba automáticamente que no haya habido falsificación y que los elementos seleccionados sean realmente uno de los ofrecidos y no hayan sido desactivados. Mediante el método getRawValue() se pueden obtener los elementos enviados sin esta importante comprobación.

Al establecer los elementos seleccionados por defecto, también comprueba que sean uno de los ofrecidos, de lo contrario lanza una excepción. Esta comprobación se puede desactivar mediante checkDefaultValue(false).

Si envía el formulario mediante el método GET, puede elegir un método de transmisión de datos más compacto que ahorra tamaño de la cadena de consulta. Se activa estableciendo el atributo HTML del formulario:

$form->setHtmlAttribute('data-nette-compact');

addRadioList (string|int $name, $label=null, ?array $items=null): RadioList

Agrega botones de opción (clase RadioList). Devuelve la clave del elemento seleccionado, o null si el usuario no seleccionó nada. El método getSelectedItem() devuelve el valor en lugar de la clave.

$sex = [
	'm' => 'hombre',
	'f' => 'mujer',
];
$form->addRadioList('gender', 'Género:', $sex);

El array de elementos ofrecidos se pasa como tercer parámetro o mediante el método setItems().

Mediante setDisabled(['m', 'f']) se pueden desactivar elementos individuales.

El elemento comprueba automáticamente que no haya habido falsificación y que el elemento seleccionado sea realmente uno de los ofrecidos y no haya sido desactivado. Mediante el método getRawValue() se puede obtener el elemento enviado sin esta importante comprobación.

Al establecer el elemento seleccionado por defecto, también comprueba que sea uno de los ofrecidos, de lo contrario lanza una excepción. Esta comprobación se puede desactivar mediante checkDefaultValue(false).

addSelect (string|int $name, $label=null, ?array $items=null, ?int $size=null): SelectBox

Agrega un cuadro de selección (clase SelectBox). Devuelve la clave del elemento seleccionado, o null si el usuario no seleccionó nada. El método getSelectedItem() devuelve el valor en lugar de la clave.

$countries = [
	'ES' => 'España',
	'MX' => 'México',
	'AR' => 'Argentina',
];

$form->addSelect('country', 'País:', $countries)
	->setDefaultValue('MX');

El array de elementos ofrecidos se pasa como tercer parámetro o mediante el método setItems(). Los elementos también pueden ser un array bidimensional:

$countries = [
	'Europa' => [
		'ES' => 'España',
		'FR' => 'Francia',
		'DE' => 'Alemania',
	],
	'CA' => 'Canadá',
	'MX' => 'México',
	'?'  => 'otro',
];

En los cuadros de selección, a menudo el primer elemento tiene un significado especial, sirve como llamada a la acción. Para agregar tal elemento, se utiliza el método setPrompt().

$form->addSelect('country', 'País:', $countries)
	->setPrompt('Seleccione un país');

Mediante setDisabled(['ES', 'FR']) se pueden desactivar elementos individuales.

El elemento comprueba automáticamente que no haya habido falsificación y que el elemento seleccionado sea realmente uno de los ofrecidos y no haya sido desactivado. Mediante el método getRawValue() se puede obtener el elemento enviado sin esta importante comprobación.

Al establecer el elemento seleccionado por defecto, también comprueba que sea uno de los ofrecidos, de lo contrario lanza una excepción. Esta comprobación se puede desactivar mediante checkDefaultValue(false).

addMultiSelect (string|int $name, $label=null, ?array $items=null, ?int $size=null): MultiSelectBox

Agrega un cuadro de selección para elegir múltiples elementos (clase MultiSelectBox). Devuelve un array de claves de los elementos seleccionados. El método getSelectedItems() devuelve los valores en lugar de las claves.

$form->addMultiSelect('countries', 'Países:', $countries);

El array de elementos ofrecidos se pasa como tercer parámetro o mediante el método setItems(). Los elementos también pueden ser un array bidimensional.

Mediante setDisabled(['ES', 'FR']) se pueden desactivar elementos individuales.

El elemento comprueba automáticamente que no haya habido falsificación y que los elementos seleccionados sean realmente uno de los ofrecidos y no hayan sido desactivados. Mediante el método getRawValue() se pueden obtener los elementos enviados sin esta importante comprobación.

Al establecer los elementos seleccionados por defecto, también comprueba que sean uno de los ofrecidos, de lo contrario lanza una excepción. Esta comprobación se puede desactivar mediante checkDefaultValue(false).

addUpload (string|int $name, $label=null): UploadControl

Agrega un campo para subir un archivo (clase UploadControl). Devuelve un objeto FileUpload incluso si el usuario no envió ningún archivo, lo cual se puede verificar con el método FileUpload::hasFile().

$form->addUpload('avatar', 'Avatar:')
	->addRule($form::Image, 'El avatar debe ser JPEG, PNG, GIF, WebP o AVIF.')
	->addRule($form::MaxFileSize, 'El tamaño máximo es 1 MB.', 1024 * 1024);

Si el archivo no se sube correctamente, el formulario no se envía con éxito y se muestra un error. Es decir, en caso de envío exitoso, no es necesario verificar el método FileUpload::isOk().

Nunca confíe en el nombre original del archivo devuelto por el método FileUpload::getName(), el cliente podría haber enviado un nombre de archivo malicioso con la intención de dañar o hackear su aplicación.

Las reglas MimeType e Image detectan el tipo requerido basándose en la firma del archivo y no verifican su integridad. Si la imagen está dañada se puede verificar, por ejemplo, intentando cargarla.

addMultiUpload (string|int $name, $label=null): UploadControl

Agrega un campo para subir múltiples archivos a la vez (clase UploadControl). Devuelve un array de objetos FileUpload. El método FileUpload::hasFile() en cada uno de ellos devolverá true.

$form->addMultiUpload('files', 'Archivos:')
	->addRule($form::MaxLength, 'Se pueden subir como máximo %d archivos', 10);

Si alguno de los archivos no se sube correctamente, el formulario no se envía con éxito y se muestra un error. Es decir, en caso de envío exitoso, no es necesario verificar el método FileUpload::isOk().

Nunca confíe en los nombres originales de los archivos devueltos por el método FileUpload::getName(), el cliente podría haber enviado un nombre de archivo malicioso con la intención de dañar o hackear su aplicación.

Las reglas MimeType e Image detectan el tipo requerido basándose en la firma del archivo y no verifican su integridad. Si la imagen está dañada se puede verificar, por ejemplo, intentando cargarla.

addDate (string|int $name, $label=null): DateTimeControl

Agrega un campo que permite al usuario introducir fácilmente una fecha compuesta por año, mes y día (clase DateTimeControl).

Como valor predeterminado, acepta objetos que implementan la interfaz DateTimeInterface, una cadena con la hora o un número que representa un timestamp UNIX. Lo mismo se aplica a los argumentos de las reglas Min, Max o Range, que definen la fecha mínima y máxima permitida.

$form->addDate('date', 'Fecha:')
	->setDefaultValue(new DateTime)
	->addRule($form::Min, 'La fecha debe tener al menos un mes de antigüedad.', new DateTime('-1 month'));

Por defecto, devuelve un objeto DateTimeImmutable, con el método setFormat() puede especificar el formato de texto o timestamp:

$form->addDate('date', 'Fecha:')
	->setFormat('Y-m-d');

addTime (string|int $name, $label=null, bool $withSeconds=false): DateTimeControl

Agrega un campo que permite al usuario introducir fácilmente una hora compuesta por horas, minutos y opcionalmente segundos (clase DateTimeControl).

Como valor predeterminado, acepta objetos que implementan la interfaz DateTimeInterface, una cadena con la hora o un número que representa un timestamp UNIX. De estas entradas, solo se utiliza la información de la hora, la fecha se ignora. Lo mismo se aplica a los argumentos de las reglas Min, Max o Range, que definen la hora mínima y máxima permitida. Si el valor mínimo establecido es mayor que el máximo, se crea un rango de tiempo que cruza la medianoche.

$form->addTime('time', 'Hora:', withSeconds: true)
	->addRule($form::Range, 'La hora debe estar en el rango de %d a %d.', ['12:30', '13:30']);

Por defecto, devuelve un objeto DateTimeImmutable (con la fecha 1 de enero del año 1), con el método setFormat() puede especificar el formato de texto:

$form->addTime('time', 'Hora:')
	->setFormat('H:i');

addDateTime (string|int $name, $label=null, bool $withSeconds=false): DateTimeControl

Agrega un campo que permite al usuario introducir fácilmente una fecha y hora compuesta por año, mes, día, horas, minutos y opcionalmente segundos (clase DateTimeControl).

Como valor predeterminado, acepta objetos que implementan la interfaz DateTimeInterface, una cadena con la hora o un número que representa un timestamp UNIX. Lo mismo se aplica a los argumentos de las reglas Min, Max o Range, que definen la fecha mínima y máxima permitida.

$form->addDateTime('datetime', 'Fecha y hora:')
	->setDefaultValue(new DateTime)
	->addRule($form::Min, 'La fecha debe tener al menos un mes de antigüedad.', new DateTime('-1 month'));

Por defecto, devuelve un objeto DateTimeImmutable, con el método setFormat() puede especificar el formato de texto o timestamp:

$form->addDateTime('datetime')
	->setFormat(DateTimeControl::FormatTimestamp);

addColor (string|int $name, $label=null): ColorPicker

Agrega un campo para seleccionar un color (clase ColorPicker). El color es una cadena en formato #rrggbb. Si el usuario no realiza la selección, se devuelve el color negro #000000.

$form->addColor('color', 'Color:')
	->setDefaultValue('#3C8ED7');

addHidden (string|int $name, ?string $default=null): HiddenField

Agrega un campo oculto (clase HiddenField).

$form->addHidden('userid');

Mediante setNullable() se puede establecer que devuelva null en lugar de una cadena vacía. Modificar el valor enviado permite addFilter().

Aunque el elemento está oculto, es importante tener en cuenta que el valor aún puede ser modificado o falsificado por un atacante. Siempre verifique y valide minuciosamente todos los valores recibidos en el lado del servidor para prevenir riesgos de seguridad asociados con la manipulación de datos.

addSubmit (string|int $name, $caption=null): SubmitButton

Agrega un botón de envío (clase SubmitButton).

$form->addSubmit('submit', 'Enviar');

En el formulario es posible tener múltiples botones de envío:

$form->addSubmit('register', 'Registrar');
$form->addSubmit('cancel', 'Cancelar');

Para determinar en cuál de ellos se hizo clic, use:

if ($form['register']->isSubmittedBy()) {
  // ...
}

Si no desea validar todo el formulario al presionar un botón (por ejemplo, en los botones CancelarVista previa), use setValidationScope().

addButton (string|int $name, $caption)Button

Agrega un botón (clase Button) que no tiene función de envío. Por lo tanto, se puede usar para alguna otra función, por ejemplo, llamar a una función JavaScript al hacer clic.

$form->addButton('raise', 'Aumentar salario')
	->setHtmlAttribute('onclick', 'raiseSalary()');

addImageButton (string|int $name, ?string $src=null, ?string $alt=null): ImageButton

Agrega un botón de envío en forma de imagen (clase ImageButton).

$form->addImageButton('submit', '/ruta/a/imagen.png');

Al usar múltiples botones de envío, se puede determinar en cuál se hizo clic mediante $form['submit']->isSubmittedBy().

addContainer (string|int $name): Container

Agrega un subformulario (clase Container), o contenedor, al que se pueden agregar otros elementos de la misma manera que los agregamos al formulario. También funcionan los métodos setDefaults() o getValues().

$sub1 = $form->addContainer('first');
$sub1->addText('name', 'Su nombre:');
$sub1->addEmail('email', 'Email:');

$sub2 = $form->addContainer('second');
$sub2->addText('name', 'Su nombre:');
$sub2->addEmail('email', 'Email:');

Los datos enviados se devuelven como una estructura multidimensional:

[
	'first' => [
		'name' => /* ... */,
		'email' => /* ... */,
	],
	'second' => [
		'name' => /* ... */,
		'email' => /* ... */,
	],
]

Resumen de configuración

En todos los elementos podemos llamar a los siguientes métodos (resumen completo en la documentación de la API):

setDefaultValue($value) establece el valor predeterminado
getValue() obtener el valor actual
setOmitted() Omisión de valor
setDisabled() Desactivación de elementos

Renderizado:

setCaption($caption) cambia la etiqueta del elemento
setTranslator($translator) establece el traductor
setHtmlAttribute($name, $value) establece el atributo HTML del elemento
setHtmlId($id) establece el atributo HTML id
setHtmlType($type) establece el atributo HTML type
setHtmlName($name) establece el atributo HTML name
setOption($key, $value) configuración para renderizado

Validación:

setRequired() elemento obligatorio
addRule() establece la regla de validación
addCondition(), addConditionOn() establece la condición de validación
addError($message) entrega de mensaje de error

En los elementos addText(), addPassword(), addTextArea(), addEmail(), addInteger() se pueden llamar los siguientes métodos:

setNullable() establece si getValue() devolverá null en lugar de una cadena vacía
setEmptyValue($value) establece un valor especial que se considera una cadena vacía
setMaxLength($length) establece el número máximo de caracteres permitidos
addFilter($filter) modificación de entrada

Omisión de valor

Si el valor rellenado por el usuario no nos interesa, podemos omitirlo del resultado del método $form->getValues() o de los datos pasados a los handlers mediante setOmitted(). Esto es útil para diversas contraseñas de verificación, elementos antispam, etc.

$form->addPassword('passwordVerify', 'Contraseña para verificación:')
	->setRequired('Por favor, introduzca la contraseña de nuevo para verificar')
	->addRule($form::Equal, 'Las contraseñas no coinciden', $form['password'])
	->setOmitted();

Desactivación de elementos

Los elementos se pueden desactivar mediante setDisabled(). Tal elemento no puede ser editado por el usuario.

$form->addText('username', 'Nombre de usuario:')
	->setDisabled();

Los elementos deshabilitados no son enviados por el navegador al servidor, por lo tanto, tampoco los encontrará en los datos devueltos por la función $form->getValues(). Sin embargo, si establece setOmitted(false), Nette incluirá su valor predeterminado en estos datos.

Al llamar a setDisabled(), por razones de seguridad, se borra el valor del elemento. Si establece un valor predeterminado, es necesario hacerlo después de desactivarlo:

$form->addText('username', 'Nombre de usuario:')
	->setDisabled()
	->setDefaultValue($userName);

Una alternativa a los elementos deshabilitados son los elementos con el atributo HTML readonly, que el navegador sí envía al servidor. Aunque el elemento es solo de lectura, es importante tener en cuenta que su valor aún puede ser modificado o falsificado por un atacante.

Elementos personalizados

Además de la amplia gama de elementos de formulario incorporados, puede agregar elementos personalizados al formulario de esta manera:

$form->addComponent(new DateInput('Fecha:'), 'date');
// sintaxis alternativa: $form['date'] = new DateInput('Fecha:');

El formulario es descendiente de la clase Container y los elementos individuales son descendientes de Component.

Existe una forma de definir nuevos métodos de formulario que sirven para agregar elementos personalizados (por ejemplo, $form->addZip()). Se trata de los llamados extension methods. La desventaja es que el autocompletado en los editores no funcionará para ellos.

use Nette\Forms\Container;

// agregamos el método addZip(string $name, ?string $label = null)
Container::extensionMethod('addZip', function (Container $form, string $name, ?string $label = null) {
	return $form->addText($name, $label)
		->addRule($form::Pattern, 'Al menos 5 números', '[0-9]{5}');
});

// uso
$form->addZip('zip', 'Código postal:');

Elementos de bajo nivel

También se pueden usar elementos que escribimos solo en la plantilla y no los agregamos al formulario con alguno de los métodos $form->addXyz(). Por ejemplo, si mostramos registros de la base de datos y no sabemos de antemano cuántos habrá ni qué ID tendrán, y queremos mostrar una casilla de verificación o un botón de opción en cada fila, basta con codificarlo en la plantilla:

{foreach $items as $item}
	<p><input type=checkbox name="sel[]" value={$item->id}> {$item->name}</p>
{/foreach}

Y después de enviar, obtenemos el valor:

$data = $form->getHttpData($form::DataText, 'sel[]');
$data = $form->getHttpData($form::DataText | $form::DataKeys, 'sel[]');

donde el primer parámetro es el tipo de elemento (DataFile para type=file, DataLine para entradas de una línea como text, password, email, etc. y DataText para todos los demás) y el segundo parámetro sel[] corresponde al atributo HTML name. Podemos combinar el tipo de elemento con el valor DataKeys, que conserva las claves de los elementos. Esto es especialmente útil para select, radioList y checkboxList.

Lo importante es que getHttpData() devuelve un valor sanitizado, en este caso siempre será un array de cadenas UTF-8 válidas, sin importar lo que un atacante intente pasar al servidor. Es análogo al trabajo directo con $_POST o $_GET, pero con la diferencia esencial de que siempre devuelve datos limpios, tal como está acostumbrado con los elementos estándar de los formularios Nette.

versión: 4.0