web-dev-qa-db-fra.com

Comment modifier une entité complexe via des formulaires AJAX chargés de manière dynamique?

J'ai une entité "profil" avec un domaine "éducation" (pour commencer). Ce champ contient divers champs de saisie décrivant la "éducation". Pour le moment, j'ai "institution" et "année". J'ai créé ce champ avec l'API de terrain dans un module dédié et je l'ai jointe à mon "profil" (actuellement ceci est un ensemble de profils2). Le formulaire d'entité fonctionne comme prévu, le widget de terrain "éducation" est inclus et je peux ajouter plusieurs entrées "éducation". Je peux voir mon entité et les champs sont formatés et je peux éditer mon entité et les widgets de formulaire sont rendus.

--profile entity
----education field
------education a
--------institution a
--------year a
------education b
--------institution b
--------year b

Mais je n'aime pas que tout ou rien n'approche ici. Il y aura de nombreux champs différents et je souhaite afficher l'entité "Profil" avec divers boutons "Modifier" et "Ajouter de nouvelles saisies", ce qui devrait charger le widget de formulaire de champ spécifié via AJAX. La page de profil sur xing.com est un bon exemple de ce que j'essaie d'atteindre.

Est-ce possible avec le widget de champs de formulaire et l'API de champ seul, ou dois-je mettre en œuvre le rappel AJAX via un crochet de menu, qui renvoie un formulaire avec les champs d'entrée nécessaires? Puis-je même utiliser mon champ "éducation" dans ce scénario ou dois-je travailler avec l'API API et la base de données d'entité?

3
Thomas Schuster

Les formulaires que Fieldapi peuvent construire pour vous automatiquement sont utiles mais pas terriblement flexibles. Si vous souhaitez construire une forme vraiment dynamique, vous préférez probablement créer votre propre à partir de zéro et simplement créer/enregistrer l'entité par programme une fois que le formulaire fini est soumis.

1
Eaton

J'ai effectué avec succès une sélection hiérarchique avec Ajax sur un formulaire de profilé utilisé lors de l'inscription.

// implementation of hook_form_FORM_ID_alter()    
function impact_registration_form_profile2_edit_library_registration_form_alter(&$form, &$form_state) {
$form['profile_library_registration']['field_library_reg_state']['und']['#options'] = _impact_registration_library_states();
$form['profile_library_registration']['field_library_reg_state']['und']['#ajax'] = array(
                          'callback' => 'impact_registration_state_change_callback',
                          'wrapper' => 'name-select',
                        );
        $selected = isset($form_state['values']['profile_library_registration']['field_library_reg_state']['und'][0]['value']) ? $form_state['values']['profile_library_registration']['field_library_reg_state']['und'][0]['value'] : '';
    $form['profile_library_registration']['field_library_reg_system']['und']['#options'] = _impact_registration_library_names($selected);
    $form['profile_library_registration']['field_library_reg_system']['und']['#prefix'] = "<div id='name-select'>";
    $form['profile_library_registration']['field_library_reg_system']['und']['#suffix'] = "</div>";
        }
    function impact_registration_state_change_callback(&$form, $form_state) {
    return $form['profile_library_registration']['field_library_reg_system']['und'];
            }

Lorsque je sélectionne field_library_reg_state, AJAX renvoie field_library_reg_system, Avec une valeur par défaut basée sur field_library_reg_state 'S valeur in $form_state . Ceci est tout adapté de l'exemple Ajax. Maintenant, qu'est-ce que cela ne fonctionne pas pour moi, c'est ajouter un appel AJAX supplémentaire sur field_library_reg_system Afin qu'il préponse une zone de texte. La documentation pour faire cela est inexistant Je ne comprends pas comment les formes de profil2 et d'entité fonctionnent différemment des formes régulières à Drupal. Quels éléments de tableau sont-nous censés cibler le wrapper et le rappel?

0
mortona42