将参数传递给drupal 7形式api中的ajax回调函数

时间:2011-05-22 14:13:51

标签: ajax drupal

如何在drupal 7形式api

中将参数传递给Ajax回调函数
$element['field name'] = array(
        '#type' => 'textfield',
        '#ajax' => array(
          'callback' => 'ajax_function_name_callback'/%/%/%,
          'method' => 'replace',
          'event' => 'blur',
              'effect' => 'fade',
              'progress' => array('type' => 'throbber', 'message' => ''),
        ),
    );

function ajax_function_name_callback($form,$form_state)
{
return ..
}

例如,如果我需要指定表单元素以使用ajax进行操作,我需要将元素名称传递给函数并进行客户操作并将结果返回到另一个元素表单

我需要通过这个回调函数'callback'=>的结果'ajax_function_name_callback'

function ajax_function_name_callback($ args1,$ args2,... $ form,$ form_state){return ..}

2 - 以及如何通过表格?

感谢..

如果我不知道它是什么$ input_name从一些操作中产生的,我需要告诉ajax_'function_name_callback这个字段的名称来制作

$element[$input_name] = array(
        '#type' => 'textfield',
        '#size' => '41',
        '#ajax' => array(
//////////////////////////////////////////////////////////////////////////////////
// here how i tell the ajax call back about this arguments informationvlike parents of this field ... etc
/////////////////////////////////////////////////////////////////////////////////
              'callback' => 'ajax_'function_name_callback',
          'method' => 'replace',
          'event' => 'blur',
              'effect' => 'fade',
              'progress' => array('type' => 'throbber', 'message' => ''),
        ),
    );


function ajax_'function_name_callback($arg_position,$arg_fieldName,$form,$form_state)
{
$form[$arg_position][$arg_fieldName][#value] = anotherFunction($form[$arg_position][$arg_fieldName][#value]);
return $form[$arg_position][$arg_fieldName];
}

7 个答案:

答案 0 :(得分:16)

使用此$form_state['triggering_element']这将告诉您触发元素的名称并为您提供所有属性。

答案 1 :(得分:4)

通过表格。无需自定义回调。

ajax回调可以访问作为表单一部分的所有信息。例如,您可以添加类型为hidden的表单元素(发送到浏览器,可以使用JavaScript更改)或值(仅在内部使用,可以包含任何类型的数据,如对象,用户不能更改)。

如果你能提供一个更详细的例子,我可以给你一个更详细的解释。

答案 2 :(得分:2)

无法在ajax回调函数中传递其他参数。

有关详情,请参阅第381行的includes / form.inc。

function ajax_form_callback() {
  list($form, $form_state) = ajax_get_form();
  drupal_process_form($form['#form_id'], $form, $form_state);

  // We need to return the part of the form (or some other content) that needs
  // to be re-rendered so the browser can update the page with changed content.
  // Since this is the generic menu callback used by many Ajax elements, it is
  // up to the #ajax['callback'] function of the element (may or may not be a
  // button) that triggered the Ajax request to determine what needs to be
  // rendered.
  if (!empty($form_state['triggering_element'])) {
    $callback = $form_state['triggering_element']['#ajax']['callback'];
  }
  if (!empty($callback) && function_exists($callback)) {
    return $callback($form, $form_state); // TA-DAM!
  }
}

答案 3 :(得分:1)

The #ajax has an element called parameters, and can use as follows,


$form['pro_div6_'.$id] = array(
                            '#type' => 'button',
                            '#value' => t('order now'),
                            '#ajax' => array(
                                  'wrapper' => 'order_wrapper',
                                 'callback' => 'product_order_callback',
                                 'parameters'=>array('param1'=>'param1_vale','param2'=>'param2_vale','param3'=>'param3_vale'),

                                 ),

                    );
And you can get this values from the call back function as,
  function product_order_callback($form, $form_state){

 echo "<pre>";print_r($form_state['triggering_element']); exit;

  }


 will get an output like,
![Please find the screen shot][1]


  [1]: http://i.stack.imgur.com/75PoU.jpg

享受编码:)

答案 4 :(得分:1)

我也有同样的问题。我的解决方案是为表单定义一个隐藏字段,然后在回调中获取隐藏值。例如:

$form['departure_city_1']= array(
    '#type' => 'select',
    '#options'=>$destination_array,
    '#weight'=>1,
    '#ajax' => array(
        'callback' => 'ajax_example_autocheckboxes_callback',
        'wrapper' => 'checkboxes-div',
        'method' => 'replace',
        'effect' => 'fade',
    ),

);

$form['skybird_token']= array(
    '#type' => 'hidden',
    '#value' => $token,
);

然后在回调中:

function ajax_example_autocheckboxes_callback($form, $form_state) {
     $token=$form_state['values']['skybird_token'];
}

答案 5 :(得分:0)

你可以使用$ form_state并将其传递给回调函数,例如

在表单函数中定义

function form_function_name($form, $form_state){

$element['field name'] = array(
    '#type' => 'textfield',
    '#ajax' => array(
      'callback' => 'ajax_function_name_callback',
      'method' => 'replace',
    ),
);

$form_state['var'] = array('variable' => 'My_costome_variable'); 
return $element;
}

function ajax_function_name_callback($form, $form_state){

# use of $form_state['var']; 
return ..
}

如果你想改变ajax_function_name_callback中的form_state ['var']你必须使用

function ajax_function_name_callback($form, &$form_state)

而不是

function ajax_function_name_callback($form, $form_state)

答案 6 :(得分:0)

将变量传递给AJAX回调的可能方法的一些结论:

  1. 将您的变量保存到$ form_state [&#39; YOUR_VAR_NAME&#39;],然后在回调中使用。
  2. 使用之前建议的隐藏类型创建表单元素。
  3. 将变量保存为一些表单元素属性,如:

    
    $element['field_name'] = array(
      '#type' => 'textfield',
      '#ajax' => array(
        'callback' => 'ajax_function_name_callback',
        'method'   => 'replace',
        'event'    => 'blur',
        'effect'   => 'fade',
        'progress' => array(
          'type'    => 'throbber',
          'message' => '',
        ),
      ),
      '#attributes' => array(
        'data' => array('some_data'),
        'id'   => array('some_id'),
      ),
    );
    
    function ajax_function_name_callback($form,$form_state) {
      $data = $form['field_name']['#attributes']['data'][0];
      $id = $form['field_name']['#attributes']['id'][0];
    }