Форма ajax добавить больше кнопка добавлена с помощью другого обратного вызова ajax не работает


У меня есть кнопка формы, в которую я хочу добавить другое поле с другой кнопкой в этой форме (я могу это сделать), но вторая кнопка недоступна. Любая идея. Ниже приведен мой код -

Это мой код формы -

function create_report_form($form, $form_state) {
$form['title'] = array(
    '#type' => 'textfield',
    '#title' => t('Report ttitle'),
    '#value' =>'',
);

$form['actions'] = array(
  '#type' => 'actions',
);

$form['actions']['submit'] = array(
  '#type' => 'submit',
  '#value' => t('Save'),
);
$form['conditions'] = array(
  '#tree' => TRUE,
);
$form['conditions']['report_type'] = array(
  '#title' => t('Report type'),
  '#type' => 'select',
  '#prefix'=> '<div class="conditions-wrapper"></div>',
  '#multiple' => false, 
  '#options' => get_report_type()
); 

 $form['conditions']['submit'] = array(
   '#type' => 'button',
   '#value' => t('Add condition'),
   //'#name' =>   '_add_another_outcome',
   '#ajax' => array(
      'callback' => 'reports_add_conditions',
      'wrapper' => 'report-form',
      'method' => 'replace',
      'effect' => 'fade',
   ),
  );  
   return $form;
}

Теперь, когда я нажму на эту кнопку, она вызовет следующую функцию и создаст другой элемент формы (список выбора) с помощью другой кнопки, которая вызовет другую функцию ajax (это то, что не работает).

function reports_add_conditions($form, &$form_state){
$values = $form_state['values'];
$form_state['rebuild'] = TRUE;
$type = $values['conditions']['report_type'];
$form['attributes'] = array(
  '#tree' => TRUE,
);
$form['attributes']['submit'] = array(
    '#type' => 'button',
    '#value' => t('Add attribute condition'),
    '#ajax' => array(
      'callback' => 'reports_add_attribute_conditions',
      'wrapper' => 'report-form',
      'method' => 'replace',
      'effect' => 'fade',
    ),
);       
$form['attributes']['attribute'] = array(
    '#type' => 'select',
    '#title' => '',
    '#options' => get_options($type),
    '#size' => 22, 
);  
  return drupal_render($form);
}

Как вы из кода видно, что я не могу вызвать функцию "reports_add_attribute_conditions" для кнопки.

Это мой второй код обратного звонка -

function reports_add_attribute_conditions($form, &$form_state){
$form_state['rebuild'] = TRUE;
$values = $form_state['values'];
$type = $values['conditions']['report_type'];
$form['attribute'] = array(
    '#type' => 'select',
    '#name' => $type,
    '#title' => '',
    '#options' =>  get_options($type),
    '#size' => 22, 
); 
$form['attributes']['submit'] = array(
    '#type' => 'button',
    '#value' => t('Add attribute condition'),
    '#ajax' => array(
      'callback' => 'reports_add_attribute_conditions',
      'wrapper' => 'report-form',
      'method' => 'replace',
      'effect' => 'fade',
    ),
); 

 return drupal_render($form);
}

Любая идея очень заметна

Author: Nabajit Roy, 2016-06-28

2 answers

@Nabajitroy моя идея

  1. Никогда не используйте drupal_render() вызовы вручную (возвращайте массив $form как есть)
  2. Переместить весь код генерации формы в конструктор форм(create_report_form()), AJAX обратный вызов не должен создавать новые элементы для формы, а только create_report_form() следует
  3. Обратные вызовы AJAX должны возвращать только форму элемента (не генерировать их) , например, возвращать $form['attributes']['submit'] и могут быть $form_state['rebuild'] = true; при необходимости.
  4. Чтобы узнать в create_report_form(), была ли она вызвана кнопкой запроса AJAX, проверьте $form_state['triggering_element'] в ней.
  5. Я почувствуйте, что использование '#type' => 'submit' вместо '#type' => 'button' лучше

https://www.drupal.org/node/752056 https://www.drupal.org/node/752056

 1
Author: Mykola Mykolayovich Dolynskyi, 2016-07-04 17:48:32

Может ли AJAX-запрос вообще не отправляться на сервер? Попробуйте изменить

$form['attributes']['submit'] = array(
'#type' => 'button',

К $form['attributes']['submit'] = array( '#type' => 'submit',

 0
Author: Mykola Mykolayovich Dolynskyi, 2016-07-04 16:56:57