4

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

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

替代文字

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

顺便说一句,我正在构建自己的主题(以防万一发生任何变化)。


更新: 基本上,当我浏览 section/parameter1、section/parameter2 时,此视图有效...但我想对 AJAX 做同样的事情,而无需重新加载页面。我希望现在更清楚

4

6 回答 6

2

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

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

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

根据截屏视频的作者(我可以向您保证一切正常),以下是要记住的步骤:

  1. 编写菜单回调。
  2. 在页面回调函数中返回 Ajax 格式的内容。
  3. 格式化链接(将“no-js”和“user-ajax”添加到指向菜单回调的那个点。
  4. 确保页面中加载了“jquery.form.js”和“drupal.ajax”库。
于 2012-12-28T16:50:18.967 回答
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);
}
于 2013-10-08T05:04:20.147 回答
1

这是我最终使用 ajax 加载视图块并从我在页面上创建的链接列表的 href 值传入上下文过滤器的 javascript。希望这对某人有帮助!

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

});
于 2016-05-26T11:14:19.270 回答
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);
?>

我认为这可以解决问题。我希望它可以帮助别人。:)

于 2010-06-17T16:22:34.393 回答
0

我不清楚“使用过滤器(按参数)”是什么意思。当给定页面上的选择标准发生变化时,AJAX 视图会更新结果。您似乎没有可能改变的选择标准,所以没有什么可以用 AJAX 更新。可能会更改的选择标准包括页面(您已关闭分页)和公开过滤器(您的过滤器未公开)。它不包括参数(你有),因为它们不会在单个页面上更改,而是在页面之间更改。

于 2010-06-10T21:32:24.697 回答
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())
于 2012-09-15T09:01:47.177 回答