1

我使用文章插件在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 就可以解决问题,但升级后就会消失。有人对解决此问题的最佳方法有任何想法吗?有没有办法在升级时不覆盖更改的情况下实现我想要做的事情?有一个属性集还是什么?我希望有人知道如何做到这一点。

4

4 回答 4

2

你可以做几件事。您可以将其从文章中拆分出来,只使用 getPages 片段,尽管这样做会导致您必须修改片段参数以更改设置,而不是使用文章选项。这可能是最好的方法,因为如果您升级文章,它将替换您对文件所做的任何更改(因此您必须重复修改过的更改。)

不过,如果您希望继续使用容器中高级设置中的选项,您也可以修改以下文件:

核心/组件/文章/模型/文章/articlescontainer.class.php

搜索此代码:

<div class="paging">
<ul class="pageList">
  [[!+page.nav]]
</ul>
</div>

你可以在那里修改它。请记住,如果您更新文章,它将覆盖此处所做的任何更改。

于 2013-07-21T17:40:11.050 回答
1

一个可能的解决方案可能是使用 javascript 检查页面上是否存在 next 和 prev 元素。如果它们不存在,请添加您的非活动占位符。

第一步是在 ModX 模板中包装 [[+prev]] 和 [[+next]] 占位符,例如

<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 本身的核心移开,从而避免未来升级的问题。

于 2013-07-24T13:49:24.503 回答
0

为清楚起见:此答案由 OP 发布。我这样做是因为其他答案都没有达到标准(海报甚至从未回应我的评论/建议),而且我不想给 150 分。赏金的答案不好。由于 SO 自动奖励给定答案的奖励(甚至没有提供奖励给 OP 的选择),我决定这样做。我宁愿不奖励赏金,也不愿把它交给不为此付出努力的人。

所以,由于这是文章 include.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";
}

我知道这一切都很hacky,而且不是很动态,但是它可以工作,不会在升级时被覆盖,并且全部在cms中完成,没有丑陋的js或css hacking。

于 2013-07-30T14:36:16.140 回答
0

getPage使用当前版本的文章用于分页的片段,这有点难以完成。其中我做了一些更改,getPage希望基本上添加两个新选项。一个用于启用该功能,另一个用于选择性地将 CSS 类应用于这些占位符。

在处理我的拉取请求之前,请随时在此处获取源代码https://github.com/victorhaggqvist/getPage

于 2013-12-25T22:21:09.913 回答