在Modx Revolution的文章中显示“上一页”和“下一个”分页,即使在不活动的情况下也是如此


Display 'prev' and 'next' pagination, even when inactive, in Modx Revolution's Articles?

我有一个使用文章插件在modx革命中设置的博客,但是我在配置分页的某些部分时遇到了一些问题。我目前对分页的要求如下所示:

[[!+page.nav:notempty=`<nav>[[!+page.nav]]</nav>`]]

我已将以下列表参数添加到getPage调用中,以从分页中删除[[+first]]和[[+last]]模板,并插入一个静态的"返回顶部"链接:

&pageNavOuterTpl=`[[+prev]]<a href="#header">Back to top</a>[[+next]]`

但是,有一件事仍然没有按我的预期工作。默认情况下,如果没有上一页或下一页,则previousnext链接将消失。但是,在这种情况下,我宁愿显示它们并使它们处于非活动状态。这样,分页看起来始终相同,但非活动部分可能会灰显。

似乎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。