1

我有一个drupal表单,我希望它作为“添加一个”:表单末尾有一个按钮,单击它时,另一个表单将附加到它。这是我的代码的一部分:

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'])),

                    )
                );
}

当我单击添加一个按钮时,我希望 $form['num_names']['#value'] 增加一个。现在它只工作一次(到 3 次)。

4

2 回答 2

2

像这样更改您的代码.. 这将创建“添加更多”按钮以添加新乘客和每个乘客的一个字段(姓名)。例如,您可以将“姓名”字段替换为字段集,并为一位乘客添加更多字段。

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

于 2014-02-23T18:08:49.933 回答
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'];    
}
于 2016-12-26T19:07:04.083 回答