web-dev-qa-db-ja.com

テキストフィールドに#ajaxを動的に入力するにはどうすればよいですか?

タイトルが示すように、AJAXコールバックを「select」フォームフィールドから使用してテキストフィールドに動的に入力する方法を知りたいのですが。

変更するとテキストフィールドにデータが入力される多数のオプションを使用して、選択フォームをテストしようとしています。テキストフィールドの「#default_value」を設定しようとしましたが、機能していないようです。 「#value」の設定は機能し、テキストフィールドに表示される情報を取得しますが、これには別の問題があります。次のステップに進んでボタンにデータを保存させようとすると、テキストフィールドの値は設定したままになり、変更されません。つまり、選択フォームでオプションを選択すると、テキストフィールドが正しく入力されますが、テキストフィールドを変更して[保存]をクリックすると、$form_stateの値は、変更した値ではなく、 。私がやろうとしていることは可能ですか?

$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'
    )
);

テキストフィールドの値を$form_stateからテスト用にファイルに保存しています。

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

しばらくこれをいじった後、私はテキストフィールドの設定を解除する必要があることに気付きました。このdefault_valueを実行すると、ajaxで動作するようになりました。以下は、最終的なコードです。

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する必要はないと思いますunset($form_state['input']['profile_name']);

これは私のために働くので、私がそれを機能させるために私がすることです:

$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