Ajax Form в Drupal7

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

Аватар пользователя sitdikov sitdikov 2 марта 2012 в 14:09

По мотивам [#61043]Как проще всего реализовать аякс с выдачей json[/#]" и [#59035]Установка фокуса на элемент формы[/#]*.

В итоге, на память себе и может кому понадобится:

В hook_menu:

$items['path_to_page/%'] = array(
        'type' => MENU_CALLBACK,
        'page callback' => 'my_callback',
        'delivery callback' => 'ajax_deliver',
        'page arguments' => array(1),
        'access arguments' => true,
);

Непосредственно callback

function my_callback($fid)
{
        $commands[] = ajax_command_replace('#ID_'.$fid, 'New value text');
        $page = array('#type' => 'ajax', '#commands' => $commands);
# если в форме у нас #type = submit
        ajax_deliver($page);
# если у нас #type = link, то return $page;
}

В форме у необходимого элемента прописываем:

'#ajax' => array(
        'effect' => 'fade',
# нижеперечисленное необходимо для #type = submit
        'path' => 'path_to_page/'.$fid,
        'event' => 'click',
)

Если тип = link, необходимо ещё указать в аттрибутах класс use-ajax.

К чему все это написано:
не нашел нигде рабочего описания по работе с ajax['path'] вместо ajax['callback']
в случаях $form['element']['#type'] = 'submit' или $form['element']['#type'] = 'link' - немного отличаются вывод и возврат callback.

P.S. сначала нашел решение, потом уже по delivery callback'y нашел [#59035]эту статью[/#] и узнал про разницу в типах #type = submit|link.

Комментарии

Аватар пользователя pacufist pacufist 10 ноября 2012 в 14:19

Еще очень полезным будет знать эти две функции:

<?php
function my_callback($fid){

 

//Валидация и сабмит формы:
 
list($form$form_state) = ajax_get_form();
 
drupal_process_form($form['#form_id'], $form$form_state);

 

//Дальше можно генерировать ответ, на базе обновленных данных.
 
...
 
}
?>

Взяты из ajax_form_callback().