Drupal的。使用AJAX更新视图的内容

时间:2010-06-10 17:14:16

标签: php javascript ajax drupal drupal-themes

我在Drupal中创建了一个视图,用于检索节点列表。此视图的显示是一个页面,它可以很好地工作。它甚至允许我通过参数过滤其内容。

查看当前的视图配置(点击放大):

alt text

我想使用AJAX来使用过滤器(按参数)功能,而无需重新加载页面。我启用了“使用AJAX”选项,但我不确定如何继续。 关于如何做到的任何想法?

顺便说一下,我正在构建自己的主题(如果有任何改变的话)。


更新 基本上,这个视图在浏览section / parameter1,section / parameter2时有效...但是我想用AJAX做同样的事情,而不重新加载页面。我希望现在更清楚

5 个答案:

答案 0 :(得分:2)

尽管这可能已经解决了,但是在这个截屏视频中解释了最好的“Drupalistic方式”:

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

它并不难,可以使用视图或渲染完整节点。

根据截屏视频的作者(我可以确保你没事),这是要记住的步骤:

  1. 编写菜单回调。
  2. 在页面回调函数中返回Ajax格式的内容。
  3. 格式化链接(将“no-js”和“user-ajax”添加到该点到 菜单回调。
  4. 确保“jquery.form.js”是“drupal.ajax”库 在页面中加载。

答案 1 :(得分: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);
}

答案 2 :(得分:1)

这是我最终使用javascript加载带有ajax的视图块的javascript,并从我在页面上创建的链接列表的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);

});

答案 3 :(得分:0)

我不清楚“使用过滤器(通过参数)”是什么意思。当选择标准在给定页面上更改时,AJAX视图会更新结果。您似乎没有可能更改的选择条件,因此无法使用AJAX进行更新。可能更改的选择条件包括页面(您有分页)和公开的过滤器(您的过滤器未公开)。它不包含参数(您有),因为它们不会在单个页面上更改,而是在页面之间更改。

答案 4 :(得分:0)

好的,我找到了一个快速的解决方案。您可以构建一个呈现视图的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);
?>

我认为这就是诀窍。我希望它可以帮助别人。 :)