2011-02-08 4 views
3

하나의 인수와 노출 된 필터 집합이있는보기가 있습니다. 사용자가보기를 필터링하면 양식이 Ajax를 사용하여 제출되고 필터는 location.hash를 사용하여 url에 추가됩니다.AJAX를 사용하여보기 삽입

내 목표는 필터가 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()가 어떤 이유로 실행되지 않는 것 같습니다. 수동으로 실행하면 모든 것이 작동합니다.

답변

8

좋아, 답변을 찾았습니다.

내 콜백에서보기를로드하는 대신 일반 아약스 콜백에서보기를로드하고 있습니다.

내 페이지에서 뷰 객체를 만들고 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'); 

그런 다음 location.hash의 현재 필터를 설정에 추가하는 js를로드합니다. 마지막으로보기를로드합니다. 예상대로

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' 
}); 

이 방법, 정규 흐름을 통해보기로드, 모든 것이) =

+0

그물에 이것에 너무 작은 정보 (드루팔에 대한이 어떤 놀라움이 최고) 덕분에 작동 –

관련 문제