Custom Macros: Añadiendo soporte para campos tipo ‘date’ y otros en Laravel

Actualmente Laravel en su Form helper nos entrega soporte para campos input del tipo: label, text, hidden, password, email y file. ¿Pero que pasa cuando deseamos utilizar otro tiempo de campo, como lo es date?: debemos generar un Macro personalizado.

/*
|--------------------------------------------------------------------------
| Custom Form Macros
|--------------------------------------------------------------------------
|
*/

Form::macro('date', function($name, $value = null, $options = array()) {
    $value = ((is_null($value) or $value == '')) ? \Input::get($name) : $value;
    $input =  '<input type="date" name="' . $name . '" value="' . $value . '"';
    foreach ($options as $key => $value) {
        $input .= ' ' . $key . '="' . $value . '"';
    }
    return $input.'>';
});

Este código debe ir en el archivo global.php ubicado en ‘app/start‘, o si lo desean crear un archivo aparte y hacer el require.

De este modo hemos generado un nuevo tipo de campo para ser utilizado en nuestros formularios, al cual podemos llamarlo de la siguiente manera en nuestras vistas:

{{ Form::date('campo_fecha') }}

Podríamos mejorar el código para poderlo utilizar con cualquier tipo de campo que necesitemos, sin la necesidad de crear un Macro personalizado una y otra vez, algo así:

Form::macro('custom', function($type, $name, $value = null, $options = array()) {
    $value = ((is_null($value) or $value == '')) ? Input::old($name) : $value;
    $input =  '<input type="'. $type .'" name="' . $name . '" value="' . $value . '"';
    foreach ($options as $key => $value) {
        $input .= ' ' . $key . '="' . $value . '"';
    }
    return $input.'>';
});

De este modo podemos hacer uso de cualquier otro tipo de campo sólo indicando su nombre:

{{ Form:custom('date', 'campo_fecha') }}
{{ Form:custom('number', 'campo_con_numeros') }}
{{ Form:custom('url', 'campo_con_url') }}

ACTUALIZACIÓN (03/11/2013): Actualicé el código del macro. En vez de utilizar Input::get() se debía utilizar Input::old(), ya que luego de validar y querer re-popular el formulario, los datos enviados en el request anterior quedan en la sesión.

Anuncios

Deja un comentario (puedes utilizar Markdown)

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión / Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión / Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión / Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión / Cambiar )

Conectando a %s