Вызов функции из тела добавлением кода через AJAX

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

Аватар пользователя daberman daberman 29 марта 2011 в 14:14

Есть задача:
При изменении поля формы вызвать AJAX, обработать это поле PHP и сформировать массив данных который надо вывести на страницу.
Далее на основании этого массива сформировать еще несколько полей.
Делаю модуль:

<?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 файл

(function ($) {
        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 (определенная в файле) не известна.

В чем может быть причина?
Кот-нибудь с этим сталкивался?

Комментарии

Аватар пользователя xxandeadxx xxandeadxx 29 марта 2011 в 14:31

"daberman" wrote:
В чем может быть причина?

область видимости. ф-я setForm доступна только в пределах анонимной функции

Аватар пользователя daberman daberman 29 марта 2011 в 14:34

"xxandeadxx" wrote:
доступна только в пределах анонимной функции

можно поподробней? что-о я не совсем понял о чем речь.

Аватар пользователя daberman daberman 29 марта 2011 в 15:59

"xxandeadxx" wrote:
(function () {})();

Ага. понял. я что-то не подумал, что это тоже функция.
Благодарю.
Решение:
правки в модуле

<?php
$page['#markup'] = '<script type="text/javascript">(function ($) {Drupal.setForm(' . $pr . ', ' . $ds . ', ' . $tm . ');})(jQuery);</script>';
?>

правки в файле JS

Drupal.setForm = function(pr, ds, tm) {
        $('... input').attr('value', pr);
        $('... input').attr('value', ds);
        $('... input').attr('value', tm);
}