Какой самый быстрый метод / реализация для обратного вызова Ajax?

18

У меня есть карта, которая загружает маркеры через ajax на различных / многочисленных событиях карты. В настоящее время я определяю пользовательский обратный вызов страницы для моего hook_menu()элемента, который печатает мой json / js.

Поскольку обратный вызов моей страницы не возвращает никакого содержимого и только печатает содержимое, Drupal не отображает полный шаблон, меню и т. Д., И, таким образом, позволяет мне возвращать страницу только с моим JavaScript.

Хотя это работает, я считаю, что Drupal по-прежнему полностью загружается, что означает, что он добавляет много накладных расходов, которые я хотел бы отбросить.

Я рассматривал высокопроизводительный обработчик обратного вызова JavaScript , который может похвастаться «высокопроизводительным обработчиком обратного вызова JavaScript» и, в общем, выглядит так, как будто он предлагает js.phpкомплимент index.phpдля направления ваших запросов и настройки / limit / оптимизировать загрузку по умолчанию делает Drupal.

К сожалению, проект js еще не выпустил D7 ( петиция за него здесь ), что приводит нас к началу ...

Какой самый быстрый способ реализовать обратный вызов Ajax в Drupal?

electblake
источник

Ответы:

8

Я определяю пользовательский обратный вызов страницы для моего hook_menu()элемента, который печатает мой JSON / JS.

Это то, что предложил Drupal 6. Платформа Drupal 7 AJAX может сделать немного больше, чем это. Да, он загружает Drupal, но он также предоставляет множество возможностей бесплатно. Короче говоря, вы можете использовать ajax_deliver () в качестве метода доставки страницы и отправлять команды в браузер.

... Ajax может быть включен путем добавления классов к кнопкам и ссылкам. При добавлении класса use-ajax к ссылке ссылка будет загружена с помощью вызова Ajax. При использовании этого метода href ссылки может содержать «/ nojs /» как часть пути. Когда Ajax Framework делает запрос, он преобразует это в '/ ajax /'. Затем сервер может легко определить, был ли этот запрос выполнен с помощью фактического запроса Ajax или в ухудшенном состоянии, и ответить соответствующим образом.

Однако, если вы хотите обойти фреймворк по соображениям производительности, ничто не помешает вам вызывать php-файлы в вашем модуле напрямую из javascript. Вы не получите ничего хорошего от Drupal, но у вас также будет полный контроль над страницей.

Джереми Френч
источник
Благодарность! Независимо от производительности, я действительно должен использовать Ajax Framework (теперь, когда я об этом знаю), потому что любые улучшения в процессе запроса страницы ajax, скорее всего, произойдут в этом контексте :)
electblake
2
Посмотрите на примеры модулей, они очень помогут, фреймворк ориентирован на формы, но может использоваться где угодно. Я отредактировал свой ответ немного о классе «use-ajax».
Джереми Френч
3
Вызов PHP-файлов напрямую иногда хорошо. Вы даже можете включить в этот файл файл bootstrap.inc, а затем вызвать api.drupal.org/api/drupal/includes--bootstrap.inc/function/… до нужного вам уровня.
greggles
4

Немного поздно, но особенно , если вы используете эту функцию обратного вызова AJAX для опроса (проверка на наличие новых сообщений, например), есть интересная альтернатива: Drupal Node.js интеграции .

Вместо опроса это позволяет вам создать систему, похожую на событие, где пользователи (также известные как JS на своей странице) поддерживают открытое соединение с вашим сервером node.js. Если что-то случится, вы можете напрямую уведомить всех пользователей через node.js.

Berdir
источник
Никогда не поздно для хороших предложений - никогда даже не думал об использовании node.js для такого рода вещей, но вдруг это имеет смысл, хе, спасибо!
электроблейк
3

Поскольку вы хотите реализовать обратный вызов Ajax в Drupal , использование JS-модуля выглядит как хорошая ставка. Я просто быстро взглянул на код, и это в основном то, что я бы предложил (но с гораздо большим вниманием к деталям). Сопровождающий также является одним из ведущих разработчиков Drupal.

Похоже, вам придется использовать module_load_include()или, возможно, более ручной include 'sites/all/modules/contrib/...';подход, если вам нужно использовать API из других модулей.

Самая проблема, о которой вы говорите, была в последнее время горячей темой. Основной доклад Дриса из DrupalCon Chicago рассказывал о том, что Drupal 8 нуждается в улучшенных API для выполнения обратных вызовов и выходных форматов, отличных от HTML.

Адам ДиКарло
источник
Итак, вкратце - продолжайте исследовать JS.php & do / project / js? Я начну ходатайствовать в очереди на выпуск D7. Спасибо за видео!
Electblake
Да, это настоящий позор, проект JS еще не был портирован на D7. Это позор, это так трудно получить легкий запрос страницы.
Мэтт Коллинз