2

データベースのアイテムを時系列の逆順でレンダリングするページがあります。最後に追加されたアイテムは、ページの一番上にある最初のアイテムです。

私は無限スクロールを使用しているので、ユーザーが一番下に到達するたびに、ページ番号と結果カウントをサーバーに送信します。そこで、propel paginate を使用して次のページを取得します。

問題は、ユーザーがページに新しいアイテムを追加すると、それがデータベースに追加され、結果のページ 1 の最初のアイテムになることです。したがって、他のすべての結果は 1 桁シフトされます。新しく追加された要素を無視するためにオフセット+1から開始する必要があることをpropelに伝える方法はありますか?

ちょっとした例:

1 ページに 5 つの項目があります。この例では、すべての項目に数字しかないため、ページでは 1,2,3,4,5 と表示されます。ここで、ユーザーがアイテム 0 を追加します。新しいアイテムが追加されたため、ページネーションなしのデータベース結果は 0,1,2,3,4,5 になりました。ユーザーがページの下部にヒットすると、ページネーションの属性はページ = 2、ページあたりのアイテム数 = 5 になり、5、6、7、8、9 が得られます。これで、私のページは再び 5 をレンダリングします。最初のアイテムの後に初期オフセットを開始するように推進することができれば、結果は問題ありません。

4

2 に答える 2

1

コードを自分で試したことはありませんが、タイムスタンプを検索条件に追加してページングで渡すと、すべての検索結果が現在の検索の開始前に作成されたレコードに制限されます。

<?php
$page = (isset($_GET['page']))?$_GET['page']:1;
$timeFilter = (isset($_GET['time']))?$_GET['time']:date("Y-m-d H:i:s", time());

$posts = PostQuery::create()
  ->filterByCreatedAt($timeFilter, Criteria::LESS_THAN)
  // add other filters as necessary
  ->paginate($page, $limit);
// Obviously there is a lot of other things to include, just an example...
?>
<html>
<head>
  <title>Paging Example</title>
</head>
<body>
  <ul id='results'>
    <?php foreach ($posts as $post) {

      echo "<li>".$post->getTitle()."</li>";

    } ?>
  </ul>

  <div id='paging'>
    <?php
    if (!$pager->isFirstPage()) {
      echo "<a href='thisFile.php?page=".$pager->getPreviousPage()."&time=".$timeFilter."'>Previous Page</a>";
    }

    // may want to add a page list here...

    if (!$pager->isLastPage()) {
      echo "<a href='thisFile.php?page=".$pager->getNextPage()."&time=".$timeFilter."'>Next Page</a>";
    }

    ?>
  </div>
  </body>
</html>
于 2013-01-17T16:26:04.213 に答える
0

受け入れられた回答は追加には機能しますが、削除には機能しません。これは、これを達成するための良い方法ではありません。レコード数で開始インデックスを渡すことができれば、持っているレコードを見ていつでもインデックスを作成できるため、上記のような問題に直面することはありません。これは、DB レベルを使用して実現できます。ただし、推進がそれをサポートしているかどうかはわかりません。

于 2013-03-01T20:39:58.753 に答える