我有一个使用文章插件在modx革命中设置的博客,但是我在配置分页的某些部分时遇到了一些问题。我目前对分页的要求如下所示:
[[!+page.nav:notempty=`<nav>[[!+page.nav]]</nav>`]]
我已将以下列表参数添加到getPage调用中,以从分页中删除[[+first]]和[[+last]]模板,并插入一个静态的"返回顶部"链接:
&pageNavOuterTpl=`[[+prev]]<a href="#header">Back to top</a>[[+next]]`
但是,有一件事仍然没有按我的预期工作。默认情况下,如果没有上一页或下一页,则previous
和next
链接将消失。但是,在这种情况下,我宁愿显示它们并使它们处于非活动状态。这样,分页看起来始终相同,但非活动部分可能会灰显。
似乎include.getpage.php包含以下行(当没有要导航到的页面时,这些行会阻止显示上一个和下一个链接(:
// lines 16 - 18
if (!empty($pagePrevTpl) && ($page - 1) >= 1) {
$nav['prev'] = getpage_makeUrl($modx, $properties, $page - 1, $pagePrevTpl);
}
// and lines 29 - 31
if (!empty($pageNextTpl) && ($page + 1) <= $pageCount) {
$nav['next'] = getpage_makeUrl($modx, $properties, $page + 1, $pageNextTpl);
}
这是有道理的,但禁止我根据需要显示占位符。所以我想要实现的是这样的:
// example for lines 16 - 18
if (!empty($pagePrevTpl)) {
if (($page - 1) >= 1) {
$nav['prev'] = getpage_makeUrl($modx, $properties, $page - 1, $pagePrevTpl);
} else {
$nav['prev'] = x // where x = default value for prev (set with :default)
}
}
像上面这样的简单 else 或 elseif 就可以解决问题,但升级后会消失。有人对解决这个问题的最佳方法有任何想法吗?有没有办法实现我想做的事情,而不会在升级时覆盖更改?有属性集什么的?我希望有人知道如何做到这一点。
你可以做几件事。 您可以将其从文章中分解出来,只使用 getPages 代码段,尽管这将使您必须修改代码段参数来更改设置,而不是使用文章选项。 这可能是最好的方法,因为如果您升级文章,它将替换您对文件所做的任何更改(因此您必须重复修改后的更改。
但是,如果您希望继续使用容器中"高级设置"中的选项,也可以修改以下文件:
核心/组件/文章/模型/文章/文章容器.class.php
搜索此代码:
<div class="paging">
<ul class="pageList">
[[!+page.nav]]
</ul>
</div>
您可以在此处修改此设置。 请记住,如果您更新文章,它将覆盖此处所做的任何更改。
一个可能的解决方案可能是使用 javascript 来检查页面上是否存在下一个和上一个元素。如果它们不存在,请添加非活动占位符。
第一步是将 [[+prev]] 和 [[+next]] 占位符包装在 ModX 模板中,例如
<span id="prevwrapper">[[+prev]]</span>
<span id="nextwrapper">[[+next]]</span>
接下来添加一些javascript在页面加载时运行,类似于(假设链接具有id的"prev"和"next"(:
if(!document.getElementById("prev")){
document.getElementById('prevwrapper').innerHTML = "<span class='inactive'>Prev</span>";
}
if(!document.getElementById("next")){
document.getElementById('nextwrapper').innerHTML = "<span class='inactive'>Next</span>";
}
显然,这只有在启用javascript的情况下才有效,但它会使您的代码远离插件的核心和ModX本身的核心,从而避免未来升级的问题。
为清楚起见:此答案由OP发布。我这样做是因为其他答案都达不到标准(海报甚至从未回应过我的评论/建议(,而且我不想为一个不好的答案提供 150pt. 赏金。由于 SO 会自动奖励给定答案的赏金(甚至不提供不将其授予 OP 的选择(,我决定这样做。我宁愿不奖励赏金,也不愿把它交给那些不为此付出努力的人。
因此,由于这是文章包含.getpage.php片段中的一个错误,因此我决定也使用php来解决它。因此,我使用了一个名为nav.placeholder的代码片段在必要时插入占位符。它是从文章模板调用的,如下所示:
<!-- Secondary Navigation -->
<!-- Insert the nav tag only when there is pagination -->
[[!+page.nav:notempty=`<nav>`]]
<!-- Call nav.placeholder snippet and test if placeholder is needed -->
[[!nav.placeholder? &nav=`[[!+page.nav]]` &before=`1`]]
<!-- Display regular pagination, without surrounding tags -->
[[!+page.nav:notempty=`[[!+page.nav]]`]]
<!-- Call nav.placeholder snippet and test if placeholder is needed -->
[[!nav.placeholder? &nav=`[[!+page.nav]]` &before=`0`]]
<!-- Insert the /nav tag only when there is pagination -->
[[!+page.nav:notempty=`</nav>`]]
此调用将 page.nav(带有 nav
变量(的内容传递给代码段,并告诉它与 before
变量一起位于菜单的哪个位置(因此它不会在错误的位置插入占位符(。
代码段本身如下所示:
if (strstr($nav, "Older") != false && $before == 1) {
return "insert 'newer' placeholder content here";
} elseif (strstr($nav, "Newer") != false && $before == 0) {
return "insert 'older' placeholder here";
}
我知道这一切都非常黑客,而且不是很动态,但它有效,不会在升级时被覆盖,并且全部在 cms 中完成,没有丑陋的 js 或 css 黑客攻击。
这在当前版本的getPage
中很难实现,这是文章用于分页的代码片段。在那里,我对getPage
希望基本上增加了两个新选项进行了一些更改。一个用于启用该功能,另一个用于选择性地将 CSS 类应用于这些占位符。
在我的拉取请求得到处理之前,请随时在此处获取源代码 https://github.com/victorhaggqvist/getPage。