Introducción

Los formularios son la parte más repetitiva de cualquier proyecto en PHP: el mismo label, el mismo input, el mismo div de error, copiados una y otra vez. FormifyPhp los declara como datos y deja el HTML final en tus manos, sin imponer un framework de estilos ni un markup concreto.

Metodología y herramientas

La API mínima es una lista de campos y un botón:

use Oswa\FormifyPhp\FormifyPhp;

$form = new FormifyPhp('POST', '/submit');

$form->addField('text', 'name', [
    'label'       => 'Nombre',
    'required'    => true,
    'placeholder' => 'Tu nombre',
    'class'       => 'form-control'
]);

$form->addField('email', 'email', [
    'label'    => 'Email',
    'required' => true
]);

$form->submitButton('Enviar');

echo $form->render();

Donde la librería se vuelve útil de verdad es en la personalización. El renderizado se puede intervenir en tres niveles distintos, de lo global a lo puntual:

Labels de todo el formulario, con setRenderLabel():

$form->setRenderLabel(function ($field) {
    return sprintf(
        '<label for="%s" class="font-bold text-blue-600">%s%s</label>',
        $field['name'],
        $field['label'],
        $field['required'] ? ' *' : ''
    );
});

El wrapper de cada campo, con setFieldWrapper(), que recibe el label, el input y el error ya resueltos:

$form->setFieldWrapper(function ($field) {
    $html = '<div class="mb-6">' . PHP_EOL;
    $html .= $field['label'];
    $html .= $field['input'];

    if ($field['error']) {
        $html .= sprintf('<p class="text-red-500 text-sm mt-1">%s</p>', $field['error']);
    }

    return $html . '</div>' . PHP_EOL;
});

Un campo suelto, con customRenderer dentro de sus opciones, cuando uno de ellos necesita una estructura que no comparte con los demás.

Así el mismo formulario se adapta a Bootstrap, a Tailwind o a un CSS propio cambiando sólo las funciones de renderizado, nunca la declaración de los campos.