代码之家  ›  专栏  ›  技术社区  ›  cab

modx getResources-偏移/限制问题?

  •  1
  • cab  · 技术社区  · 10 年前

    我已经将其设置为,主博客页面显示最初的3篇文章,在完全加载时带有标签。

                [[!getResourcesTag? 
                    &element=`getResources` 
                    &elementClass=`modSnippet`
                    &tpl=`blog-item`
                    &tplFirst=`blog-item-featured`
                    &limit=`3`
                    &hideContainers=`1` 
                    &parents=`5` 
                    &tagKey=`blog-tags`
                    &includeTVs=`1`
                    &tvPrefix=``
                ]]
    

    最初显示的3篇文章在主登录页上按日期顺序排序(最近的第一篇),例如文章1、文章2和文章3;第3条。

    单击显示的3个帖子下方的“更多帖子”按钮,无限滚动分页(已设置)开始。

    <button class="load-more" data-parent="5" data-current-page="1">More Posts</button>
    

    但当点击更多帖子-文章3(再次)&返回第4条,而不是第4条和;第5条。

     $method   = $modx->getOption('method', $scriptProperties, 'initial');
     $limit    = $modx->getOption('limit', $scriptProperties, 3);
     $parent   = $modx->getOption('parent', $scriptProperties);
     $tpl      = $modx->getOption('tpl', $scriptProperties);
     $tplFirst = $modx->getOption('tplFirst', $scriptProperties);
    
     $load   = (int) $_GET['page'];
    $offset = 0;
    
    if($method == "initial") {
        if($load != 0) {
            $limit = $limit * $load;
        }
    } elseif($method == "pagination") {
        $offset = $limit * ($load - 1);
    }
    
    $page = $modx->runSnippet('getResources', array(
        'parents'        => $parent,
        'limit'          => $limit,
        'offset'         => $offset,
        'includeTVs'     => '1',
        'tvPrefix'       => '',
        'includeContent' => '1',
        'tpl'            => $tpl,
        'tplFirst'       => $tplFirst
    ));
    

    我玩过参数&尝试更改处理 offset 但似乎想不出来。

    有些帮助会很好。

    1 回复  |  直到 10 年前
        1
  •  1
  •   Sean Kimball    10 年前

    已添加更新的代码

    我不久前也做过类似的事情,实际上几乎完全是这样[一定是在谷歌上搜索过]

    在我的初始getResources调用中唯一的区别是我使用了0的偏移量

    <div id="posts">
    <!-- get first few articles -->
    [[!getResources?
         &parents=`10,22`
         &depth=`999`
         &limit=`6`
         &offset=`0`
         &includeTVs=`1`
         &processTVs=`1`
         &includeContent=`1`
         &tpl=`infiniteHomePageTpl`
         &sortby=`publishedon`
         &showHidden=`1`
         &hideContainers=`1`
    ]]
    
    </div>
    
    <button id="scroller" class="btn btn-primary load-more" data-parents="10,22" data-offset="6" data-posts="3">Show More Articles</button>
    <button id="scolltotop" class="btn btn-primary scrollToTop" style="display:none;">Back to Top</button>
    

    为了简洁起见,下面是代码片段和js:

    <?php
        $output = array(
          'status' => 'success',
          'msg' => 'message',
          'data' => 'blaaaaaaaah',
          'lastpost' => FALSE,
        );
    
        $properties = $scriptProperties['data'];
    
        $modx->log(modX::LOG_LEVEL_ERROR,'Running processor: ajax.generic, scriptProperties = '. print_r($properties, TRUE));
    
        $limit  = $properties['limit'];
        $parents = $properties['parents'];
        $tpl    = $properties['tpl'];
        $offset = $properties['offset'];
        $depth = $properties['depth'];
        $sortby = $properties['sortby'];
        $debug = $properties['debug'];
        $showHidden = $properties['showHidden'];
        $hideContainers = $properties['hideContainers'];
    
        $modx->log(modX::LOG_LEVEL_ERROR, 'tpl = ' . $tpl);
    
        $posts = $modx->runSnippet('getResources', array(
            'parents'       => $parents,
            'depth'         => $depth,
            'limit'         => $limit,
            'offset'        => $offset,
            'includeTVs'    => '1',
            'processTVs'    => '1',
            'includeContent' => '1',
            'tpl'           => $tpl,
            'debug'         => $debug,
            'sortby'        => $sortby,
            'showHidden'    => $showHidden,
            'hideContainers'=> $hideContainers,
        ));
    
       $output['posts'] = '<div class="post-group" style="display:none" >' . $posts . '</div>';
    
       if(strlen($posts) == 0){
    
       $output['lastpost'] = TRUE;
    
       }
    
       $output = $modx->toJSON($output);
    
        return $output;
    

    以及JS:

    // infinite scrolling on homepage
        // use: <button id="scroller" class="btn btn-primary load-more" data-parents="10,22" data-offset="0" data-posts="5">Show More Articles</button>
        $('.load-more').click(function(e) {
    
            var $this = $(this);
    
            var offset = $this.data('offset'); // the current offset for get resources
    
            var posts = $this.data('posts'); // the number of posts to get
    
            var parents = $this.data('parents'); // the parent ids to pull resources from
    
            var myProperties = {
                snippet: 'infiniteScroll',
                limit: posts,
                offset: offset,
                parents: parents,
                depth: 999,
                sortby: 'publishedon',
                showHidden: 1,
                debug: 1,
                tpl: 'infiniteHomePageTpl',
                hideContainers: 1
                };
    console.log('props = ' + JSON.stringify(myProperties));
            $.ajax({
                type: "POST",
                url: "/ajax.processor",
                data: myProperties,
                dataType: "json",
    
                success: function(response) {
    
                    var newposts = response.posts;
    
                    var $div = $("div#posts");
    
                    $div.append(newposts);
    
                    $div.find(".post-group:last").fadeIn();
    
                    $('body').stop().animate({scrollTop:$div.prop("scrollHeight") + $div.height()},1000);
    
                    if(response.lastpost){
                        console.log('nodata');
                        $this.attr('disabled', 'disabled');
                        $this.html('no more posts');
                        $('.scrollToTop').show();
                    }
    
                    $this.data('offset', (offset + posts));
    
                },
    
                error: function(response){
                    console.log(response);
                },
    
            }).fail(function(jqXHR,textStatus,errorThrown) {
                console.log(errorThrown);
            }); // ajax
    
        }); // load more
    
        // scroll back to top on finished resources.
    
        $('.scrollToTop').click(function(){
            $('html, body').animate({scrollTop : 0},800);
            return false;
        });
    

    Ajax处理器

    <?php
    //$modx->log(modX::LOG_LEVEL_ERROR,'Running processor: ajax.generic, snippet = '. print_r($_POST, TRUE));
    
    $output = $modx->runSnippet($_POST['snippet'], array('data' => $_POST));
    
    header('Content-type: application/json');
    
    return $output;
    
    推荐文章