Definir campos de formulario de forma programática

Un diseño contiene definiciones de campo estables más un árbol de referencia visual.

$layout = array(
    'steps'  => array(
        array(
            'id'      => 'contact',
            'title'   => 'Contact',
            'rows'    => array(
                array(
                    'id'      => 'contact-row',
                    'columns' => array(
                        array(
                            'id'               => 'contact-column',
                            'bootstrap_col_lg' => 12,
                            'field_ids'        => array( 'contact_email', 'message' ),
                        ),
                    ),
                ),
            ),
        ),
    ),
    'fields' => array(
        'contact_email' => array(
            'id'       => 'contact_email',
            'name'     => 'contact_email',
            'type'     => 'email',
            'label'    => 'Email',
            'required' => true,
        ),
        'message' => array(
            'id'       => 'message',
            'name'     => 'message',
            'type'     => 'textarea',
            'label'    => 'How can we help?',
            'required' => true,
        ),
    ),
);

Usa los tipos de campo de la referencia de campos de formulario pública. Mantén los IDs/nombres en minúsculas y estables. La etiqueta visible puede cambiar sin romper las etiquetas de combinación de las notificaciones.

Las columnas usan valores de anchura de estilo Bootstrap. Suministra solo las anchuras que el formulario necesita y conserva un orden lógico de origen/teclado. Un diseño visual de dos columnas debe contraerse en el orden de lectura previsto en pantallas pequeñas.

Cada ID de campo conecta la definición del campo con la lista field_ids de una columna y con el comportamiento posterior de envío/notificación. Defínelo una vez, haz referencia a él desde una única ubicación visual prevista y conserva el mismo valor después de la publicación. Una referencia ausente deja un campo definido sin renderizar; una referencia a un ID desconocido no puede producir una entrada utilizable.

Establece las propiedades relevantes para la validación en la definición del campo, en lugar de confiar en que una etiqueta o un marcador de posición impliquen un requisito. Trata las etiquetas como texto traducible para los visitantes y los IDs/nombres como contratos de integración estables.

No aceptes una matriz de diseño arbitraria de un visitante y la pases al renderizador. La integración propietaria define el esquema; la entrada del visitante solo suministra los valores de los campos.