Вставить представление с помощью AJAX - PullRequest
3 голосов
/ 08 февраля 2011

У меня есть представление с одним аргументом и набором открытых фильтров.Когда пользователь фильтрует представление, форма отправляется с использованием Ajax, а фильтры добавляются к URL-адресу с помощью location.hash.

Моя цель - отфильтровать представление при начальной загрузке страницы, если фильтры присутствуют.в location.hash.

В настоящее время я загружаю представление с помощью обратного вызова Ajax, который прекрасно работает.Но большая проблема в том, что Ajax для представления не работает.

Это обратный вызов, который загружает представление.

// Load the view object.
$view = views_get_view('taxonomy_term');
$view->set_display('page');
$view->set_use_ajax(TRUE);

// Pass the current tid as the argument.
$view->set_arguments(array($tid));
// Set the current page.
$view->set_current_page($page);
// Set the exposed filters.
$view->get_exposed_input();

// Execute.
return $view->execute_display();

Когда я перехожу непосредственно к этому обратному вызову, все работает.Но не тогда, когда я загружаю его через Ajax.

Есть идеи?

Обновление: кажется, что Drupal.behaviors.ViewsAjaxView () по какой-то причине не выполняется.Если я выполню это вручную, все будет работать.

1 Ответ

9 голосов
/ 11 февраля 2011

Хорошо, я нашел ответ.

Вместо того, чтобы загружать View из моего собственного обратного вызова, я теперь загружаю View из обычного обратного вызова ajax.

На моемНа странице я создаю объект представления и добавляю конфигурацию в Drupal.settings.

$view = views_get_view('taxonomy_term');
$view->set_display('page');
$view->set_use_ajax(TRUE);
$view->set_arguments(array($tid));
$settings = array(
  'views' => array(
    'ajax_path' => url('views/ajax'),
    'ajaxViews' => array(
      array(
        'view_name' => $view->name,
        'view_display_id' => $view->current_display,
        'view_args' => check_plain(implode('/', $view->args)),
        'view_path' => check_plain($_GET['q']),
        'view_base_path' => $view->get_path(),
        'view_dom_id' => 1,
        'pager_element' => $view->pager['element'],
      ),
    ),
  ),
);
drupal_add_js($settings, 'setting');
views_add_js('ajax_view');

Затем загружаю js, который добавляет текущий фильтр из location.hash в настройки.И, наконец, загружает представление.

var data = {};
// Add view settings to the data.
for (var key in Drupal.settings.views.ajaxViews[0]) {
  data[key] = Drupal.settings.views.ajaxViews[0][key];
}
// Get the params from the hash.
if (location.hash) {
  var q = decodeURIComponent(location.hash.substr(1));
  var o = {'f':function(v){return unescape(v).replace(/\+/g,' ');}};
  $.each(q.match(/^\??(.*)$/)[1].split('&'), function(i,p) {
    p = p.split('=');
    p[1] = o.f(p[1]);
    data[p[0]] = data[p[0]]?((data[p[0]] instanceof Array)?(data[p[0]].push(p[1]),data[p[0]]):[data[p[0]],p[1]]):p[1];
  });
}
$.ajax({
  url: Drupal.settings.views.ajax_path,
  type: 'GET',
  data: data,
  success: function(response) {
    var viewDiv = '.view-dom-id-' + data.view_dom_id;
    $('#content > div.limiter').html(response.display);
    // Call all callbacks.
    if (response.__callbacks) {
      $.each(response.__callbacks, function(i, callback) {
        eval(callback)(viewDiv, response);
      });
    }
  },
  error: function(xhr) {
    $('#content > div.limiter').html('<p id="artist-load-error">Error text.</p>');
    $('#block-request-0').hide();
  },
  dataType: 'json'
});

Таким образом, представление загружается через обычный поток, и все работает как ожидалось =)

...