Tu peux faire une table en base de données pour stocker tes champs en fonction de leur catégorie.
fields:
id, label, type, options, default_value, category_id
Et tu boucles ensuite selon la catégorie ou tu te trouves pour générer tes champs. Ca fait une requête à chaque fois mais bon, au final c'est ce qui me semble le plus simple.
Sinon tu fais un générateur, qui écrira un fichier de template et le modifiera à chaque fois que tu ajoutes/supprime/modifie un champ, comme ça tu n'auras plus l'appel pour remplir le formulaire.