2010-12-13 54 views
0

J'ai un formulaire pour un objet appelé AccountImport. Ce formulaire vit dans un module généré par l'administrateur. En plus des champs qui correspondent directement aux attributs de cet objet, j'ai besoin de quelques champs supplémentaires.Formulaire d'administration avec champs "supplémentaires"

Si j'ajoute simplement les champs au formulaire AccountImport, il ne sera pas enregistré correctement car le formulaire ne correspondra plus à l'objet AccountImport. Si je crée un gabarit manuellement et superpose les champs supplémentaires, je rejette tout ce que le générateur d'administration me donne gratuitement (c'est-à-dire le formatage, le bouton "Retour à la liste", les boutons de sauvegarde).

Qu'est-ce qu'une "bonne" façon de faire ce que j'essaie de faire?

+1

Bienvenue à l'endroit où les cadres deviennent un fardeau. Espérons que quelqu'un d'autre a déjà résolu ce problème ... – DampeS8N

+1

Pshaw @ DampeS8N. Symfony gère cela assez élégamment. – Nathan

+0

Je voulais dire dans le plus grand schéma des choses. Si votre cadre ne fait pas ce que vous voulez, c'est le pire sentiment du monde. Et tu dois juste prier Baal et Belial que quelqu'un d'autre l'ait réparé. Si ce n'était pas la chute des symphonies. Quelque chose d'autre est. :) – DampeS8N

Répondre

1

Si vous définissez des champs supplémentaires dans generator.yml, vous pouvez remplacer l'une des actions du générateur d'administration pour gérer les champs comme vous le souhaitez.

Regardez généré actions.class.php dans cache/YourApp/YOURENV/modules/autoYOURMODULE/actions/actions.class.php. Vous pouvez remplacer l'une de ces fonctions par la vôtre dans apps/YOURAPP/modules/YOURMODULE/actions/actions.class.php, car elle hérite de ce fichier mis en cache. Lorsque vous modifiez generator.conf, le fichier mis en cache est mis à jour mais votre code le remplace toujours. Vous voulez probablement remplacer processForm().

J'ai un exemple dans step 5 at this blog post:

protected function processForm(sfWebRequest $request, sfForm $form) 
{ 
    $form->bind($request->getParameter($form->getName()), $request->getFiles($form->getName())); 

    if ($form->isValid()) 
    { 
$notice = $form->getObject()->isNew() ? 'The item was created successfully.' : 'The item was updated successfully.'; 

// NEW: deal with tags 
if ($form->getValue('remove_tags')) { 
    foreach (preg_split('/\s*,\s*/', $form->getValue('remove_tags')) as $tag) { 
    $form->getObject()->removeTag($tag); 
    } 
} 
if ($form->getValue('new_tags')) { 
    foreach (preg_split('/\s*,\s*/', $form->getValue('new_tags')) as $tag) { 
    // sorry, it would be better to not hard-code this string 
    if ($tag == 'Add tags with commas') continue; 
    $form->getObject()->addTag($tag); 
    } 
} 

try { 
    $complaint = $form->save(); 
    // and the remainder is just pasted from the generated actions file 

Quand je compris que je pouvais lire les fichiers générés dans le cache pour voir exactement ce que le générateur d'administration a été fait, et que je pouvais remplacer une partie de eux, cela m'a rendu beaucoup plus productif avec le générateur d'administration.

0

Je suppose que vous avez ajouté les champs supplémentaires en tant que widgets à votre objet formulaire, mais avez-vous aussi a ajouté leurs validateurs? Quels que soient les champs de formulaire que vous incluez dans l'objet formulaire, tant que le fichier generator.yml ne remplace pas les paramètres du formulaire (c'est-à-dire que vous ne définissez aucune valeur pour la clé [new|form|edit].display dans ce fichier), l'objet devrait être enregistré avec succès sur une entrée valide.