Есть задача:
При изменении поля формы вызвать AJAX, обработать это поле PHP и сформировать массив данных который надо вывести на страницу.
Далее на основании этого массива сформировать еще несколько полей.
Делаю модуль:
function order_form_alter (&$form, &$form_state, $form_id) {
if ($form_id == 'ord_node_form') {
$form['field_delivery_city']['und'][0]['value']['#ajax'] = array(
'callback' => 'ajax_order_callback',
'wrapper' => 'rel-div',
'event' => 'change',
);
$form['relation'] = array(
'#type' => 'markup',
'#markup' => '<div id="data" style="display:none;"><div id="rel-div">DIV for replasing.</div></div>',
);
}
}
function ajax_order_callback($form, $form_state) {
$ids = preg_split('/-/', $form_state['input']['ids']);
$result = db_query("
SELECT
...",
array(
':c1id' => $ids[0],
':c2id' => $ids[1],
':type' => 'city_rel',
));
foreach ($result as $row)
$node = $row;
$pr = ($node->price) ? $node->price : 'null';
$ds = ($node->dist) ? $node->dist : 'null';
$tm = ($node->time) ? $node->time : 'null';
$page['#markup'] = '<script type="text/javascript">(function ($) {Drupal.attachBehaviors(setForm(' . $pr . ', ' . $ds . ', ' . $tm . '));})(jQuery);</script>';
return $page;
}
?>
Тут вешается на стандартную форму AJAX обработчик и определяется функция.
Обработчик AJAX срабатывает, функция обрабатывается, массив формируется, строка выводится в тело.
JS файл
Drupal.behaviors.order = {
attach: function(context) {
$('#restart').live("click", function () {
restart();
});
}
};
function setForm(pr, ds, tm) {
$('... input').attr('value', pr);
$('... input').attr('value', ds);
$('... input').attr('value', tm);
}
})(jQuery);
Строка добавляется и срабатывает JS код, но:
пишет "setForm is not defined".
Т.е. в теле функция setForm (определенная в файле) не известна.
В чем может быть причина?
Кот-нибудь с этим сталкивался?
Комментарии
область видимости. ф-я setForm доступна только в пределах анонимной функции
можно поподробней? что-о я не совсем понял о чем речь.
function foo(){alert('ok');};
foo(); // ok
})(); // <-- анонимная функция
foo(); // fail
http://www.google.com/search?q=javascript+%D0%BE%D0%B1%D0%BB%D0%B0%D1%81...
Ага. понял. я что-то не подумал, что это тоже функция.
Благодарю.
Решение:
правки в модуле
$page['#markup'] = '<script type="text/javascript">(function ($) {Drupal.setForm(' . $pr . ', ' . $ds . ', ' . $tm . ');})(jQuery);</script>';
?>
правки в файле JS
$('... input').attr('value', pr);
$('... input').attr('value', ds);
$('... input').attr('value', tm);
}