2014-02-22 33 views
1

我有一个drupal表单,我希望它可以作为“添加一个”:在表单末尾有一个按钮,单击它时,另一个表单将追加到它。这里是我的代码部分:drupal 7 ajax表单重建表单以更改form_state的值

function add_passenger_form($form, &$form_state){ 
    if(!isset($form_state['num_names'])){ 
     $form_state['num_names']=2; 
    } 
    $form['add_button']= array(
    '#type' => 'button', 
    '#value'=> 'Add more', 
    '#ajax' => array(
     'callback' => 'ajax_add_passenger_callback', 
     'method' => 'replace', 
     'effect' => 'fade', 
     'wrapper' => 'last_field', 
    ), 
); 
    $form['form_number']=array(
     '#prefix'=>'<div class="form_number">', 
     '#suffix'=>'</div>', 
     '#type'=>'hidden', 
     '#value'=>2, 
    ); 
} 

function ajax_add_passenger_callback($form, &$form_state){ 
    $form_state['num_names']++; 
$form_state['rebuild']=TRUE; 
    $form['form_number']['#value']=$form_state['num_names']; 
    return array(
        '#type' => 'ajax', 
        '#commands' => array(
            ajax_command_replace(".form_number", render($form['form_number'])), 

        ) 
       ); 
} 

我想$形式[“num_names”] [“#值”]增加一个当我点击添加一个按键。现在它只能工作一次(到3)。

回答

2

改变你的代码是这样的..这将创建按钮“添加更多”为每位乘客添加新的乘客和一个字段(名称)。您可以使用fieldset替换该“名称”字段,并为一位乘客添加更多字段。

function add_passenger_form($form, &$form_state){ 

    if(!isset($form_state['num_names'])){ 
     $form_state['num_names']=2; 
    } 

    // Create wrapper for ajax 
    $form['#prefix'] = '<div id="form-wrapper">'; 
    $form['#suffix'] = '</div>'; 

    for ($i = 0; $i < $form_state['num_names']; $i++) { 

    $form['name_' . $i] = array(
     '#type' => 'textfield', 
     '#title' => t('Name'), 
     '#required' => true 
    ); 
    } 

    $form['add_button']= array(
    '#type' => 'button', 
    '#value'=> 'Add more', 
    '#ajax' => array(
     'callback' => 'ajax_add_passenger_callback', 
     'method' => 'replace', 
     'effect' => 'fade', 
     'wrapper' => 'form-wrapper', 
    ), 
); 
} 

function ajax_add_passenger_callback($form, &$form_state){ 

    $form_state['num_names']++; 

    // rebuild whole form with new values 
    $form_state['rebuild'] = true; 
} 

还要检查此链接了解更多信息关于Ajax:

https://api.drupal.org/api/examples/ajax_example!ajax_example_graceful_degradation.inc/7

0
function add_passenger_form($form, &$form_state){ 
    $form['#tree'] = TRUE; 

    if(empty($form_state['num_names'])){ 
     $form_state['num_names'] = 2; 
    } 

    $form['passenger_fieldset'] = array(
     '#type' => 'fieldset', 
     '#title' => t('List of Passengers'), 
     '#prefix' => '<div id="passenger-form-wrapper">', 
     '#suffix' => '</div>', 
    ); 

    for ($i = 0; $i < $form_state['num_names']; $i++) { 
    $form['passenger_fieldset']['passenger_name'][$i] = array(
     '#type' => 'textfield', 
     '#title' => t('Passenger Name'), 
     '#required' => false, 
    ); 
    } 

    $form['passenger_fieldset']['add_button']= array(
    '#type' => 'submit', 
    '#value'=> t('Add passenger'), 
    '#submit' => array('add_passenger_form_add_one'), 
    '#ajax' => array(
     'callback' => 'add_passenger_form_callback', 
     'method' => 'replace', 
     'effect' => 'fade', 
     'wrapper' => 'passenger-form-wrapper', 
    ), 
); 
// Remove passenger 
if ($form_state['num_names'] > 2) { 
    $form['passenger_fieldset']['remove_button'] = array(
     '#type' => 'submit', 
     '#value' => t('Remove Passenger'), 
     '#submit' => array('remove_passenger_form_remove_one'), 
     '#ajax' => array(
     'callback' => 'add_passenger_form_callback', 
     'method' => 'replace', 
     'effect' => 'fade', 
     'wrapper' => 'passenger-form-wrapper', 
     ), 
    ); 
    } 
    $form['submit'] = array(
    '#type' => 'submit', 
    '#value' => t('Submit'), 
    ); 

    return $form; 
} 
/* 
* add a textfield one more 
*/ 
function add_passenger_form_add_one($form, &$form_state) { 
    $form_state['num_names']++; 
    // rebuild whole form with new values 
    $form_state['rebuild'] = true; 
} 
function remove_passenger_form_remove_one($form, &$form_state) { 
    if ($form_state['num_names'] > 2) { 
    $form_state['num_names']--; 
    } 
    $form_state['rebuild'] = TRUE; 
} 
function add_passenger_form_callback($form, $form_state){ 
    return $form['passenger_fieldset'];  
} 
+0

的add_passenger_form_callback只需要返回$形式[ 'passenger_fieldset']。添加按钮需要具有'submit'属性和'add_passenger_form_add_one'函数,该函数更新num_names的form_state并重建表单。 – vizzaro