Drupal.Используйте AJAX для обновления содержимого представления - PullRequest
4 голосов
/ 10 июня 2010

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

См. Текущую конфигурацию вида (нажмите, чтобы увеличить):

alt text

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

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


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

Ответы [ 6 ]

2 голосов
/ 28 декабря 2012

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

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

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

По словам автора скринкаста (и я могу убедиться, что с вами все в порядке), следует запомнить следующие шаги:

  1. Написать отзыв в меню.
  2. Возвращает содержимое в формате Ajax в функции обратного вызова страницы.
  3. Отформатируйте ссылки (добавьте «no-js» и «user-ajax» к той точке, к которой обратный вызов меню.
  4. Убедитесь, что библиотеки "jquery.form.js" и "drupal.ajax" загружен на странице.
1 голос
/ 26 мая 2016

Вот javascript, который я в итоге использовал, чтобы загрузить блок views с помощью 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);

});
1 голос
/ 08 октября 2013
//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);
}
0 голосов
/ 15 сентября 2012

Вы также можете использовать следующую команду для создания страницы из 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())
0 голосов
/ 17 июня 2010

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

Вызов ajax:

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

Файл ajax (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 голосов
/ 11 июня 2010

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

...