1

我正在为一位客户工作,他要求我为其网站准备一个模块(使用 Yii 编写),该模块具有以下功能:

  • 它显示了 mysql_result 中的 3 个元素,从 offset=0 开始。
  • 用户可以单击其中任何一个以将它们标记为“已读”。这使得所需的项目消失并出现下一个项目。也就是说,如果您正在显示项目3 4 5并单击4,则该项目将消失并出现数字6,这意味着结果将是3 5 6
  • 显示的元素是局部视图,“删除”项目的按钮是每个局部视图中的小部件。
  • 用户可以使用一些<<>>箭头在项目列表中来回移动结果。
  • 客户给我的选项之一是显示页面列表( 1 | 2 | 3 | 4... 等等),但删除项目意味着页面数量在未来某个时间会减少,再加上如果数量很大,我需要更灵活的东西,比如最多只显示当前页面和其他 4 页。另一种选择是保留 << 和 >> 箭头。
  • 我试图说服客户分页和“实时列表”是一个非常糟糕的主意,但他拒绝了将可视化限制为前 3 个项目的想法(请记住,最终您将删除它们,因此将能够看到以下项目)。

我正在使用 Yii、MySQL 和 jQuery 开发它,但由于这个活动列表,我无法使用 CPagination。我不是在问代码,只是一些指导方针,因为我第三次尝试这样做时迷路了。

关于系统的一些基础知识:

  • 我有一个控制器,它加载了这个模块的前 3 个项目。
  • 我在此控制器中执行了一些操作,用于获取页面中的下一个项目(但可能与当前对象不同。我的一个问题在这里)和整个页面。
  • 每个项目都能够将自己标记为“已读”,这将使该项目在您下次获取某些结果时不会出现。
  • 每隔 1 秒,我检查已标记为已读的项目,从 DOM 中删除并使用我在第二个项目符号中定义的操作附加一些新项目。
  • 每次用户点击<<or>>时,我都会重新加载上一页/下一页(这显然不是问题。如果你在最后一页并且没有更多要添加的项目,你就留在那儿。但是,如果你清空页面,我没有任何方法可以检测到并向后滚动一页)。

如您所见,如果没有分页按钮,这种头痛会更容易,但客户强迫我放它们。你们会怎么做?提前致谢

编辑:客户决定以随机方式获得结果。没有更多的分页,所以问题就消失了。@thaddeusmt 的答案可能对我没有太大帮助,但我会认为它是有效的,因为它可能对与我有类似问题的其他人非常有用。干杯

4

1 回答 1

2

在我看来,CGridViewCListView基本上应该自动执行此操作。它们支持开箱即用的AJAX 更新/分页。

我假设您有一个 AJAX 操作,类似于用户单击时调用的“actionMarkRead()”。我假设这在某处设置了一些数据库字段,表示用户已“读取”该项目。要使用 CListView 进行这项工作,只需确保 CDataProvider 有一个condition检查“读取”字段的内容(可能必须加入表,我不知道您的数据库是什么样的)。然后,当列表通过 AJAX 重新加载时,它将具有正确的页数,以表示 CDataProvier 查询返回的页数较少。

我刚刚对此进行了测试,它可以工作!

我测试它的方式是我用'ajaxUpdate'=>true,. 然后在我的 CDataProvider 中,我设置'pagination'=>1为使其易于测试。然后我在我的控制器中使用默认的 AJAXactionDelete来删除这些项目。每次我通过 CGridView 中的 AJAX 操作链接删除一个项目时,网格都会通过 AJAX 刷新,并且页数减少 1。似乎工作起来就像一个魅力!

干杯和好运!

于 2011-06-07T20:40:59.643 回答