modx getResources - offset/limit 问题?
modx getResources - offset/limit issue?
我对此进行了设置,以便主博客页面显示最初的 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 个帖子下方的 "more posts" 按钮,无限滚动分页(已设置)开始。
<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
的代码,但似乎无法弄清楚。
有些帮助会很好。
已添加更新代码
前阵子我做了类似的事情,几乎完全一样 [一定是用谷歌搜索]
我最初的 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;
我对此进行了设置,以便主博客页面显示最初的 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 个帖子下方的 "more posts" 按钮,无限滚动分页(已设置)开始。
<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
的代码,但似乎无法弄清楚。
有些帮助会很好。
已添加更新代码
前阵子我做了类似的事情,几乎完全一样 [一定是用谷歌搜索]
我最初的 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;