web-dev-qa-db-fra.com

Comment remplir dynamiquement un champ de texte avec #ajax?

Comme le titre l'indique, je me demande comment remplir dynamiquement un champ de texte en utilisant un rappel AJAX à partir d'un champ de formulaire "select".

J'essaie de tester un formulaire de sélection avec un certain nombre d'options qui, une fois modifiées, remplissent le champ de texte avec des données. J'ai essayé de définir le champ de texte "#default_value ", mais cela ne semble pas fonctionner. Réglage" #value "fonctionne et j'obtiens les informations à afficher dans le champ de texte, mais cela présente un autre problème. Lorsque j'essaie de passer à l'étape suivante et qu'un bouton enregistre les données, la valeur du champ de texte reste celle que j'ai définie et ne change pas. Ce que je veux dire, c'est que lorsque je sélectionne une option dans le formulaire de sélection, le champ de texte est correctement rempli, mais si je le modifie et que je clique sur Enregistrer, le $form_state la valeur est toujours celle que je mets à pas ce que je l'ai changé. Ce que j'essaie de faire est-il même possible?

$form['profiles'] = array(
    '#type' => 'select',
    '#title' => 'Profiles',
    '#options' => $profiles,
    '#ajax' => array(
        'callback' => 'profile_callback',
        'wrapper' => 'profile-wrapper'
    )
);

$profile = isset($form_state['values']['profiles']) ? 
             _get_profile_info($form_state['values']['profiles']) : NULL;

$form['profile_name'] = array(
    '#type' => 'textfield',
    '#prefix' => '<div id="profile-wrapper">',
    '#suffix' => '</div>',
    '#title' => 'Profile Name',
    '#value' => $profile == NULL ? '' : $profile[0]->{'name'}
);

$form['profile_save'] = array(
    '#type' => 'submit',
    '#value' => t('Save Profile'),
    '#submit' => array(
        'save_profile'
    )
);

J'économise la valeur de mon champ de texte à partir du $form_state dans un fichier à tester en ce moment.

function save_profile($form, &$form_state){
    $fh = fopen('C:\out.txt', 'w+');
    fwrite($fh, $form_state['values']['profile_name']);
}

function profile_callback($form, &$form_state){
    return $form['profile_name'];
}
5
Sathariel

Après avoir joué avec cela pendant un certain temps, j'ai découvert que je devais désactiver le champ de texte. Une fois que j'ai fait cette valeur par défaut, j'ai commencé à travailler avec ajax, voici le code final que j'avais.

unset($form_state['input']['profile_name']);

$form['profiles'] = array(
    '#type' => 'select',
    '#title' => 'Profiles',
    '#options' => $profiles,
    '#ajax' => array(
        'callback' => 'profile_callback',
        'wrapper' => 'profile-wrapper',
    ),
);

$profile = isset($form_state['values']['profiles']) ? _get_profile_info($form_state['values']['profiles']) : NULL;

$form['profile_name'] = array(
    '#type' => 'textfield',
    '#prefix' => '<div id="profile-wrapper">',
    '#suffix' => '</div>',
    '#title' => 'Profile Name',
    '#default_value' => $profile == NULL ? '' : $profile[0]->{'name'},
);
3
Sathariel

@Sathariel Je ne pense pas que vous ayez besoin de faire unset($form_state['input']['profile_name']);

Voici ce que je ferais pour le faire fonctionner, car cela fonctionne pour moi:

$form['profiles'] = array(
    '#type' => 'select',
    '#title' => 'Profiles',
    '#options' => $profiles,
    '#ajax' => array(
        'callback' => 'profile_callback',
        'wrapper' => 'profile-wrapper',
        'event' => 'change',
    ),
);

$form['profile_name'] = array(
    '#type' => 'textfield',
    '#prefix' => '<div id="profile-wrapper">',
    '#suffix' => '</div>',
    '#title' => 'Profile Name',
);

function profile_callback($form, &$form_state){
    $form['profile_name']['#value'] = _get_profile_info($form['profiles']['#values']);
    return $form['profile_name'];
}
2
BPm