2010-06-10 3 views
4

Я создал представление в Drupal, которое извлекает список узлов. Отображение этого представления - это страница, и она отлично работает. Это даже позволяет мне фильтровать его содержимое по аргументам.Drupal. Используйте AJAX для обновления содержимого представления

См конфигурации Просмотр текущей в (нажмите, чтобы увеличить):

alt text

Я хочу использовать AJAX использовать фильтр (по параметру) функциональность без перезагрузки страницы. Я включил опцию «Использовать AJAX», но я не уверен, как продолжить. Любые идеи о том, как это сделать?

Кстати, я строю свою собственную тему (в случае изменения чего-либо).


Update: В основном, это вид работы, когда я просматриваю через раздел/параметр1, раздел/параметр2 ... но я хочу сделать то же самое с помощью AJAX без перезагрузки страницы. Я надеюсь, теперь яснее

ответ

2

Несмотря на это, вероятно, было решено к этому времени, лучший «Drupalistic путь», чтобы сделать это объясняется в этом ролике:

http://seanbuscay.com/ajax-reader-demo

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

Согласно автору скринкаст (и я могу гарантировать вам, что все в порядке), это шаги, чтобы помнить:

  1. Написать меню обратного вызова.
  2. Верните Ajax форматированный контент в функцию обратного вызова страницы.
  3. Формат ссылки (добавить «не-JS» & «пользователь-Аякса» в тот момент обратного вызова меню.
  4. Убедитесь, что «jquery.form.js» в «drupal.ajax» библиотеки являются загружен на странице.
+0

Следует ли создавать новый модуль каждый раз, когда мы хотим использовать AJAX на одном сайте? Спасибо – ozke

+1

Gracias Iván, Estaba buscando exactamente lo mismo ... lo voy a ver :) –

0

Непонятно, что вы подразумеваете под «использовать фильтр (по параметру)». AJAX рассматривает обновление результатов при изменении критериев выбора на заданной странице. У вас нет критериев выбора, которые могут измениться, поэтому обновить AJAX нечего. Критерии выбора, которые могут быть изменены, включают страницу (у вас есть пэкинг) и открытые фильтры (ваш фильтр не отображается). Он не включает аргументы (которые у вас есть), поскольку они не изменяются на одной странице, а скорее между страницами.

+0

В принципе, это представление работает, когда я просматриваю раздел/параметр1, section/parameter2 ... но я хочу сделать то же самое с AJAX, не перезагружая страницу. Надеюсь, теперь яснее. – ozke

+0

Да, AJAX не работает с аргументами. Какой смысл иметь отдельные URL-адреса, если вы собираетесь загружать их на одной странице с помощью AJAX? Если вы хотите, чтобы URL-адрес остался прежним, используйте открытые фильтры, а не аргументы. AJAX работает с открытыми фильтрами. –

0

Хорошо, я нашел быстрое решение. Вы можете создать файл php, который отображает представление, а затем использовать ajax.load для печати в div.

Аякса вызов:

$('#output_div').load('path/ajax_all_projects.php?type=art'); 

Аякса файл (ajax_all_projects.php):

<?php 
include_once './includes/bootstrap.inc'; 
drupal_bootstrap(DRUPAL_BOOTSTRAP_FULL); 

$get_param = $_GET["type"]; 
$arguments = Array(); 
if(!empty($get_param)){ 
    array_push($arguments, $get_param); 
} 

$view = views_get_view('all_projects'); 
print $view->execute_display('Block', $arguments); 
?> 

Я думаю, что делает трюк. Надеюсь, это поможет кому-то другому. :)

0

вы также можете использовать следующие создать страницу с hook_menu и в функции меню, вызовите

views_embed_view($name, $display_id = 'default') 

делать, например, если у вас есть параметр,

print views_embed_view('my_test_view', 'block_1', $my_arg) 

вместо

view::execute_display($display_id = NULL, $args = array()) 

Вы также можете использовать

view::preview($display_id = NULL, $args = array()) 
1
//select required div area to refresh 
Drupal.behaviors.share_status = { 
      attach: function (context) { 
       var initialLoad = false; 
       // Drupal passes document as context on page load. 
       if (context == document) { 
        initialLoad = true; 
       } 
       // Make sure we can run context.find(). 
       var ctxt = $(context); 
        $('.empty-share-status').load('form-content',function(context) { 
        $(".view-share-status").load("share_status/get/ajax"); //call menu action 
       }); 
      } 
     } 

//get action in module page using MENU_CALLBACK 

function share_status_menu() { 
    $items['share_status/get/ajax'] = array(
    'page callback' => 'share_status_get_ajax', // Render HTML 
    'type' => MENU_CALLBACK, 
    'access arguments' => array('access content'), 
); 
    return $items; 
} 
// render HTML content 
function share_status_get_ajax() { 
    $block = module_invoke('views','block_view','share_status-block_1'); 
    print render($block); 
} 
1

Вот Javascript я в конечном итоге, используя для загрузки мнения блока с AJAX и передать контекстный фильтр из HREF значения списка ссылок, которые я создал на странице. Надеюсь, это поможет кому-то!

function getInfo(args) { 

    $.ajax({ 
    url: Drupal.settings.basePath + 'views/ajax', 
    type: 'post', 
    data: { 
     view_name: 'agent_lookup', 
     view_display_id: 'agent_lookup_block', //your display id 
     view_args: args, 
    }, 
    dataType: 'json', 
    success: function (response) { 
     if (response[1] !== undefined) { 
     var viewHtml = response[1].data; 
     $('#ajax-target').html(viewHtml); 
     //Drupal.attachBehaviors(); //check if you need this. 
     } 

    }, 
     error: function(data) { 
     alert('An error occured!'); 
     } 
    }); 
} 



$('.ajax_button').once().click(function(e){ 
    e.preventDefault(); 
    var the_id = $(this).attr('href'); 
    noSlashes = the_id.replace(/\//g,''); 
    getInfo(noSlashes); 

}); 
+0

Простая и легкая благодарность – luisnicg

Смежные вопросы