it-swarm.asia

كيف يمكنني تعبئة حقل نص ديناميكيًا باستخدام #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

بعد العبث بهذا لفترة ، اكتشفت أنني بحاجة إلى إلغاء تعيين حقل النص. بمجرد أن بدأت هذه القيمة الافتراضية في العمل مع 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