ajax подзапрос в ajax запросе

Главные вкладки

Аватар пользователя fil.diesel fil.diesel 3 февраля 2012 в 16:16

Здраствуйте! есть форма которая обрабатывается ajax-ом, нужно в эту форму ajax подзапросом добавить новую, обработать, и вернуть полученные результаты. Есть мнения по этому счету? Ответы тестируй ctools не приветствуются:)

Комментарии

Аватар пользователя Znaem.net Znaem.net 3 февраля 2012 в 19:52

http://api.drupal.ru/api/group/form_api/7

Form_api - отлично справляется с подобными задачами.
Заворачиваете обработчик формы на себя же саму, а там уже рулите.
Не забываем на входе рушить предыдущую созданную этой функцией форму (как минимум $form_state = array();), и в зависимости от полученных данных формируете новую.

Аватар пользователя fil.diesel fil.diesel 4 февраля 2012 в 17:02

"Znaem.net" wrote:
Form_api - отлично справляется с подобными задачами

не могли бы показать на примере!

 
<?php
// $Id$

/**
 *Implementation of hook_menu().
 */

function test_module_menu() {
    
$items = array();
    
$items['test_module_page'] = array(
      
'title' => t('test_module_page'),
      
'page callback'    => 'test_module_module_page',
      
'access callback'  => TRUE,
      
'type'             => MENU_CALLBACK,
    );
 
 
    return 
$items;
}

 

/**
 * Page callback for test_module_module_page
 */
function test_module_module_page(){
  
$fc_form drupal_get_form('fc_form');
  return 
render($fc_form);
}
 
 
 
/**
 * Form for page
 */
function fc_form($form$form_state) {
 
  
$form['#prefix'] = '<div id="fc-form-ajax-wrapper">';
  
$form['#suffix'] = '</div>';
      
  
$form['submit'] = array(
    
'#type' => 'submit',
    
'#value' => 'submit ajax',
    
'#ajax' => array(
      
'callback' => 'preview_form_ajax',
      
'wrapper' => 'fc-form-ajax-wrapper',  
    ),
  );
 
  return 
$form;
}

function 

_ajax_example_test_form_get_first_dropdown_options() {
     return 
drupal_map_assoc(array(t('first'), t('second'), t('third')));
    }
function 
ajax_example_test_form_dependent_dropdown_callback($form$form_state) {
     return 
$form['ajax_form']['dropdown_second'];
    }
function 
_ajax_example_test_form_get_second_dropdown_options($key '') {
  
$options = array(
    
t('first') => drupal_map_assoc(array(t('first_first'), t('first_second'), t('first_third'))),
    
t('second') => drupal_map_assoc(array(t('second_first'), t('second_second'), t('second_third'))),
    
t('third') => drupal_map_assoc(array(t('third_first'), t('third_second'), t('third_third'))),
  );
  if (isset(
$options[$key])) {
    return 
$options[$key];
  }
  else {
    return array();
  }
}

/**
 * Ajax callback for FC FORM
 */
function preview_form_ajax($form, &$form_state) {  
 
  
$options_first _ajax_example_test_form_get_first_dropdown_options();
  
$selected = isset($form_state['values']['ajax_form']['dropdown_first']) ?    $form_state['values']['ajax_form']['dropdown_first'] : key($options_first);
  
  
$form['ajax_form'] = array(
    
'#type' => 'fieldset',
    
'#title' => t('This is some content delivered via AJAX'),
    );
  
  
  
$form['ajax_form']['dropdown_first'] = array(
    
'#type' => 'select',
    
'#title' => 'Instrument Type',
    
'#options' => $options_first,
    
'#default_value' => $selected,
    
'#ajax' => array(
      
// 'event' => 'change',
      
'callback' => 'ajax_example_test_form_dependent_dropdown_callback',
      
'wrapper' => 'dropdown-second-replace',
    ),
  );

  

$form['ajax_form']['dropdown_second'] = array(
    
'#type' => 'select',
    
'#title' => $options_first[$selected] . ' ' t('Instruments'),
    
'#prefix' => '<div id="dropdown-second-replace">',
    
'#suffix' => '</div>',
    
'#options' => _ajax_example_test_form_get_second_dropdown_options($selected),
    
'#default_value' => isset($form_state['values']['ajax_form']['dropdown_second']) ? $form_state['values']['ajax_form']['dropdown_second'] : '',
  );
  
  return 
$form;    
        
  } 
?>

В общем главное чтоб ajax_example_test_form_dependent_dropdown_callback сработала!

Аватар пользователя Znaem.net Znaem.net 15 февраля 2012 в 21:50

Даавненько не заходил.
С 7-ой пока такого не пробовал, но для 6-ой делал подобное.
Так что если интересно посмотреть как сие происходит 6-ке, мог бы попробовать отыскать и поправить.
Только опишите что в конце должно получится, каков нужен результат .