Helpers 1/2 – Funciones genericas

Analizando un poco sobre los famosos helpers mencionados hoy en día en la mayoría de los Frameworks orientados a la web, me pareció interesante la idea de formular alguna explicación de como crearlos a fin de que sean lo más genéricos y reutilizables posible.

Para el ejemplo tomaremos el caso de un helper capaz de crear un input de formulario de la familia de los text, hidden, password, radio, checkbox, button, submit, reset. La idea sería crear una función que genere el HTML necesario para esto. Vayamos a un primer ejemplo y analicemoslo.

function input_helper($name, $type='text', $value='')
{
    $ret = '<input type="' . $type . '" name="' . $name . '" value="' . $value . '">';
    return $ret;
}
 
echo input_helper('nombre');
echo input_helper('id', 'hidden', 1);
echo input_helper('nombre', 'text', 'John Doe');
echo input_helper('sexo', 'checkbox', 'M');

Esto podría ser de ayuda para lo que necesitamos y es super sencillo. Obligatoriamente deberíamos pasar un nombre para el input y luego opcionalmente un tipo y un valor, tomando en cuenta que si no enviamos el tipo lo tomamos como inputtext

Supongamos que necesitaremos que el helper también sirva para agregar un class para trabajar con CSS. Este ya no sería un atributo obligatorio así que debería ser opcional y lo podremos como último parámetro de entrada.

function input_helper($name, $type='text', $value='', $class=null)
{
    $ret = '<input type="' . $type . '" name="' . $name . '" value="' . $value . '"';
 
    //-- en caso de no contener nulo lo agregamos
    if($class)
        $ret .= ' class="' . $class . '"';
 
    $ret .= '>';
 
    return $ret;
}

Vayamos un paso más adelante y notaremos algo. Agreguemos la posibilidad de utilizar la etiqueta “id”:

function input_helper($name, $type='text', $value='', $class=null, $id=null)
{
    $ret = '<input type="' . $type . '" name="' . $name . '" value="' . $value . '"';
 
    //-- en caso de no contener nulo lo agregamos
    if($class)
        $ret .= ' class="' . $class . '"';
 
    //-- en caso de no contener nulo lo agregamos
    if($id)
        $ret .= ' id="' . $id . '"';
 
    $ret .= '>';
 
    return $ret;
}

Es aquí donde empezamos a encontrarnos con unos problemas. Por cada etiqueta que necesite habría que agregar un parámetro de entrada opcional ya que no serían requeridos, pero, ¿qué pasa si para el último ejemplo queremos utilizar el “id” pero no utilizar ningún “class”?. Deberíamos invocar a la función de esta forma:

echo input_helper('nombre', 'text', 'John Doe', null, 'txtnombre');

Esto es totalmente válido, pero el problema está en que pusimos un parámetro opcional para el atributo “class” pero sin embargo ya no es opcional ya que no podemos pasar al siguiente sin utilizar esa posición, por lo tanto debemos ingresar explícitamente null.

Aquí es donde el concepto de los arrays asociativos van muy unidos de los helpers. La idea principal es esta, “Si tenemos que estar usando muchos parámetros opcionales que finalmente no son opcionales y generar una función con parámetros interminables, carguemos en un array asociativo los atributos con sus valores y dejemos como parámetro opcional el array”.

Para este caso el único parámetro obligatorio sería el “name” ya que debería tenerlo y si no se define el “type” lo usamos como un inputtext.

function input_helper($name, $attrs=array())
{
    //-- usamos como name el primer parámetro pasado a la función
    $attrs['name'] = $name;
 
    //-- si no se seteó el tipo lo dejamos como text
    if(!isset($attrs['type']))
        $attrs['type'] = 'text';
 
    //-- recorremos el array y vamos generando los atributos
    $attributes = '';
    foreach($attrs as $key => $value)
        $attributes .= ' ' . $key . '="' . $value . '"';
 
    //-- finalmente creamos el HTML
    $ret = "<input{$attributes} />";
 
    return $ret;
}

De esta manera generamos una función bien genérica capaz de generar cualquier etiqueta de tipo input que podría ser llamada de varias maneras:

echo input_helper('nombre');
echo input_helper('nombre', array('value' => 'John Doe'));
echo input_helper('nombre', array('id' => 'txtnombre', 'type' => 'text'));
echo input_helper('categoria', array('type' => 'checkbox', 'value' => 'INF', 'checked' => 'checked'));
echo input_helper('sexo', array('type' => 'radio', 'value' => 'M', 'id' => 'sexo_M'));
echo input_helper('nombre', array('type' => 'submit', 'value' => 'grabar'));

Por último, supongamos que queremos utilizar esto para los submits y queremos agregar la funcionalidad de que al hacer un click nos pregunte si estamos seguros de querer realizar la acción. Podríamos simplemente agregar al array algo como esto:

array('onclick' => "return confirm('¿Esta serguro de queres realizar esta acción?')")

O, podríamos encapsular esta funcionalidad dentro de un segundo array opcional para las opciones algo así:

function input_helper($name, $attrs=array(), $options=array())
{
    //-- usamos como name el primer parámetro pasado a la función
    $attrs['name'] = $name;
 
    //-- si no se seteó el tipo lo dejamos como text
    if(!isset($attrs['type']))
        $attrs['type'] = 'text';
 
    //-- si es de tipo submit y se solicitó un confirm entonces lo agrega
    if($attrs['type'] == 'submit' && isset($options['confirm']) && $options['confirm'] === true)
    {
        //-- se debería de tener en cuenta si también fue enviado un evento onclick a la par
        if(!isset($attrs['onclick']))
            $onclick = "return confirm('¿Esta seguro de queres realizar esta acción?');";
        else
            $onclick = "if(confirm('¿Esta seguro de queres realizar esta acción?')) { " . $attrs['onclick'] . " } else return false;";
 
        $attrs['onclick'] = $onclick;
    }
 
    //-- recorremos el array y vamos generando los atributos
    $attributes = '';
    foreach($attrs as $key => $value)
        $attributes .= ' ' . $key . '="' . $value . '"';
 
    //-- finalmente creamos el HTML
    $ret = "<input{$attributes} />";
 
    return $ret;
}
 
//-- Esto puede ser utilizado de la siguiente manera.
 
echo input_helper('nombre',
    array('type' => 'submit', 'value' => 'grabar'),
    array('confirm' => true)
);
 
echo input_helper('nombre',
    array(
        'type' => 'submit',
        'value' => 'grabar',
        'onclick' => "alert('Hola Mundo!')",
    ),
    array('confirm' => true)
);

De esta manera tenemos más comodidad con ciertas opciones específicas y podemos encapsularlas dentro de nuestro helper.

Los arrays asociativos son una de las funcionalidades más interesantes de PHP, mi recomendación sería que aprendan a usarlos y que no piensen que son tan aburridos como cuando los vemos en pseudocódigo 😛

Puedes ver el siguiente artículo sobre esta serie aquí.

Comenta este artículo