2012-03-07 3 views
3

Я заполняю поле выбора с помощью обратного вызова AJAX в Drupal 7. Я попробовал как ajax_command_append(), так и ajax_command_html() для установки новых операторов <option...>, но оба они обертывают HTML что я создаю внутри <div>. Это приводит к тому, что <select> не отображает никаких параметров.Drupal 7 ajax_command_ * создает ненужный div

Есть ли способ рассказать Drupal «Эй, глупо, это именно тот HTML-код, который я хочу, не возиться с ним»?

Я могу скопировать некоторые jQuery, чтобы удалить div, я думаю, но было бы намного лучше, если бы я мог помешать ему быть добавленным в первую очередь.

ответ

4

Да, вы можете!

Объявите свой собственный js callback. В приведенном ниже примере я использовал span вместо div. Но вы, очевидно, можете удалить оболочку все вместе.

PHP:

function my_ajax_callback() { 
    $data = 'saved!'; 
    // instead of using ajax_command_html, we provide our own 
    // js custom callback function 
    $output = array(
    '#type' => 'ajax', 
    '#commands' => array(
     array('command' => 'myjscallback', 'data' => $data), 
    ), 
); 

    return $output; 
} 

JS:

$(function() { 
    Drupal.ajax.prototype.commands.myjscallback = function (ajax, response, status) { 
    $('#save-btn-message').html('<span>' + response.data + '</span>'); 
    }; 
}); 
0

вы можете использовать увидеть по этой ссылке http://api.drupal.org/api/drupal/developer!topics!forms_api_reference.html/7#ajax

для получения дополнительной справки и примера загрузить этот модуль http://drupal.org/project/examples это все примеры пользовательского кода и «ajax_example», а

+0

Я знаком с этой страницей. Он не говорит, как устранить сгенерированный закрытый div. –

1

Так что, похоже, ответ «нет» (или, по крайней мере, не без взлома ядра, и у меня не будет мертвых котят на моей совести).

Разное/ajax.js содержит следующее:

var new_content_wrapped = $('<div></div>').html(response.data); 

Комментарии в нем идут объяснять, почему они требуют первый HTML элемент, чтобы быть на высшем уровне один. Если это так, обертка <div> не используется. В моем случае я заменяю <option> элементов, поэтому я получаю <div>.

Теперь я мог бы просто заменить весь <select>, но это вызывает другие проблемы в моем случае из-за скриптов, которые стилизуют вещи при загрузке страницы. Вместо того, чтобы находить их и перезапускать их, похоже, будет проще просто ajax_command_invoke запустить скрипт после загрузки моих параметров для удаления обертки div.

EDIT: Как обходной путь, я нашел, что могу сделать ajax_command_invoke($selector, 'html', array('<option...>'));, и он обходит код добавления div. Kinda sneaky, но он работает ...

+0

@ См. Мой комментарий в ответ на horlyk. Будьте осторожны с ajax_command_invoke, потому что Drupal.attachBehaviors не будет вызываться и сломать любую кнопку .use-ajax или другое поведение js для обработки в новом контенте. – titouille

2

Ответ да. Просто используйте вместо этого:

$commands[] = ajax_command_invoke('#mywrapper', 'html', array($output)); 
-1

Это работает для меня!

 
    $selector = '#my-select'; 
    $method = 'append'; 
    $opts = array('new option'); 

    $commands[] = ajax_command_invoke($selector, $method, $opts); 

    return array('#type' => 'ajax', '#commands' => $commands); 
+0

Использование ajax_command_invoke хорошо работает, чтобы избежать дополнительного div, но в этом случае Drupal.attachBehaviors() не вызывается (метод ввода и вызова @see ajax.js). Если добавляемый контент содержит кнопку .use-ajax, он не будет обработан и не будет работать ... – titouille