【问题标题】:Drupal. Use AJAX to update view's content德鲁巴。使用 AJAX 更新视图的内容
【发布时间】:2010-06-10 17:14:16
【问题描述】:

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

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

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

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


更新: 基本上,当我浏览 section/parameter1、section/parameter2... 时,此视图有效,但我想对 AJAX 执行相同操作,而无需重新加载页面。我希望现在更清楚了

【问题讨论】:

    标签: php javascript ajax drupal drupal-themes


    【解决方案1】:

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

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

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

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

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

    【讨论】:

    • 我们是否应该在每次想在同一个站点中使用 AJAX 时创建一个新模块?谢谢
    • Gracias Iván, estaba buscando exactamente lo mismo... lo voy a ver :)
    【解决方案2】:
    //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);
    }
    

    【讨论】:

      【解决方案3】:

      这是我最终使用 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);
      
      });
      

      【讨论】:

        【解决方案4】:

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

        【讨论】:

        • 基本上,当我浏览 section/parameter1、section/parameter2 时,此视图有效...但我想对 AJAX 执行相同操作,而无需重新加载页面。我希望现在更清楚了。
        • 是的,AJAX 不适用于参数。如果您要使用 AJAX 将它们全部加载到一个页面上,那么拥有单独的 URL 有什么意义?如果您希望 URL 保持不变,请使用公开的过滤器而不是参数。 AJAX 适用于暴露的过滤器。
        【解决方案5】:

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

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

        【讨论】:

          【解决方案6】:

          你也可以使用以下 从 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())
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2012-05-06
            • 1970-01-01
            • 1970-01-01
            • 2014-09-03
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多