Разбивка на страницы с добавленными элементами (установка смещения вручную или что-то в этом роде)

У меня есть страница, на которой я отображаю элементы из своей базы данных в обратном хронологическом порядке. Последний добавленный элемент — это первый элемент в верхней части страницы.

Я использую бесконечную прокрутку, поэтому каждый раз, когда пользователь достигает конца, я отправляю номер страницы и количество результатов на свой сервер. Там я использую propel paginate, чтобы получить следующую страницу.

Проблема в том, что когда пользователь добавляет новый элемент на страницу, он будет добавлен в мою базу данных и будет первым элементом на странице 1 в моих результатах. Таким образом, все остальные результаты сдвигаются на 1 позицию. Есть ли способ сообщить пропелю, что он должен начинаться со смещения +1, чтобы игнорировать новый добавленный элемент?

Небольшой пример:

У меня 5 элементов на странице. В этом примере каждый элемент имеет только номер, поэтому на странице вы видите 1,2,3,4,5. Теперь пользователь добавляет элемент 0. Результаты моей базы данных без разбиения на страницы теперь: 0,1,2,3,4,5, потому что добавлен новый элемент. Теперь пользователь попадает в нижнюю часть страницы, а нумерация страниц имеет атрибуты page = 2, элементов на странице = 5, и я получу 5,6,7,8,9. Теперь моя страница снова отображает 5. Если бы я мог сказать, что начальное смещение должно начинаться после первого элемента, результат был бы в порядке.


person Kasihasi    schedule 09.07.2012    source источник
comment
Это было задано некоторое время назад, вы решили эту проблему? Мне было бы интересно узнать как. Если это так, вы должны ответить на свой вопрос, а затем принять ответ!   -  person Jordan Kasper    schedule 10.01.2013
comment
Извините, но у меня нет хорошего решения проблемы, которое подходит к вопросу.   -  person Kasihasi    schedule 17.01.2013
comment
Как насчет добавления фильтра к критериям с текущим временем, используя метку времени Propel, вы можете ограничить результаты тем, когда поиск был первоначально создан... Я попытаюсь привести пример.   -  person Jordan Kasper    schedule 17.01.2013


Ответы (2)


Просто идея, сам не пробовал код, но вы можете добавить метку времени к критериям поиска и передать ее с пейджингом, чтобы все результаты поиска были ограничены записями, созданными до начала текущего поиска:

<?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>
person Jordan Kasper    schedule 17.01.2013
comment
Спасибо, дайте мне знать, если это работает для вас - или вам нужно настроить его; У меня есть пара проектов, где я могу это использовать. - person Jordan Kasper; 18.01.2013

Принятый ответ работает для добавления, но не для удаления. Это не лучший способ добиться этого. Если вы можете передать начальный индекс с количеством записей, вы не столкнетесь с такой проблемой, как описанная выше, поскольку вы всегда можете составить индекс, просмотрев имеющиеся у вас записи. Это может быть достигнуто с помощью уровня БД. Однако я не уверен, поддерживает ли это продвижение.

person Dilshan    schedule 01.03.2013