Эффективная нумерация уменьшающихся результатов - PullRequest
1 голос
/ 07 июня 2011

Я работаю для клиента, который просит меня подготовить модуль для его веб-сайта (написанный с использованием Yii) со следующими функциями:

  • Показывает 3 элемента из mysql_result, начиная со смещения = 0.
  • Пользователь может щелкнуть любой из них, чтобы пометить их как «прочитанные». Это заставляет нужный элемент исчезать и появляться то, что будет следующим элементом. То есть, если вы показываете элементы 3 4 5 и нажимаете 4, этот элемент исчезнет и появится число 6, означающее, что результатом будет 3 5 6.
  • Показанные элементы являются частичными видами, а кнопка, которая «удаляет» элемент, является виджетом в каждом частичном виде.
  • Пользователь может перемещаться по списку элементов, используя стрелки << и >>, чтобы перемещаться назад и вперед к результату.
  • Один из вариантов, который мне предоставил клиент, состоял в том, чтобы показать список страниц (1 | 2 | 3 | 4 ... и т. Д.), Но удаление элементов означает, что количество страниц в будущем будет уменьшаться Плюс, если сумма довольно большая, мне нужно что-то более гибкое, например, показывать только текущие и остальные 4 страницы максимум. Другой вариант - сохранить стрелки << и >>.
  • Я пытался убедить клиента, что нумерация страниц и «живой список» - довольно плохая идея, но он отверг идею ограничить визуализацию только первыми 3 элементами (имея в виду, что в конечном итоге вы их удалите) и, таким образом, сможет увидеть следующие элементы).

Я разрабатываю его с использованием Yii, MySQL и jQuery, и я не могу использовать CPagination из-за этого живого списка. Я не спрашиваю код, просто некоторые рекомендации, потому что я заблудился в третий раз, когда попытался это сделать.

Некоторые основы системы:

  • У меня есть контроллер, который загружает первые 3 элемента этого модуля.
  • У меня есть некоторые действия в этом контроллере, которые выбирают следующий элемент на странице (который может не совпадать с текущим объектом, хотя одна из моих проблем здесь), и полную страницу.
  • Каждый элемент может пометить себя как «прочитанный», что приведет к тому, что элемент не появится в следующий раз, когда вы получите какие-либо результаты.
  • Каждую 1 секунду я проверяю элементы, помеченные как прочитанные, удаляю из DOM и добавляю некоторые новые элементы, используя действие, которое я определил во втором пункте.
  • Каждый раз, когда пользователь нажимает << или >>, я перезагружаю предыдущую / следующую страницу (по-видимому, это не будет проблемой. Если вы находитесь на последней странице и больше элементов для добавления нет , вы просто остаетесь там. Однако, если вы очистите страницу, у меня не будет никакого способа обнаружить это и прокрутить одну страницу назад).

Как вы можете видеть, эта головная боль была бы легче без кнопок нумерации страниц, но клиент обязывает меня их поставить. Что бы вы сделали, ребята? Заранее спасибо

РЕДАКТИРОВАТЬ: Клиент решил получить результаты в случайном порядке. Нет больше нумерации страниц, поэтому проблема исчезла. Ответ @thaddeusmt, возможно, не очень помог мне, но я приведу его как действительный, так как он может быть очень полезным для других людей с похожими проблемами, чем у меня. Приветствия

1 Ответ

2 голосов
/ 08 июня 2011

Мне кажется, что CGridView или CListView должен делать это автоматически.Они поддерживают обновление / пейджинг AJAX из коробки.

Я предполагаю, что у вас есть действие AJAX, например «actionMarkRead ()», которое вы вызываете, когда пользователь нажимает.Я предполагаю, что это где-то устанавливает поле базы данных, говоря, что пользователь «прочитал» этот элемент Чтобы это работало с CListView, просто убедитесь, что у CDataProvider есть condition, который проверяет это поле "read" (возможно, потребуется присоединиться к таблице, я не знаю, как выглядит ваша БД).Затем, когда список перезагружается через AJAX, у него будет правильное количество страниц для представления меньшего числа страниц, возвращаемых запросом CDataProvier.

Я только что проверил это, и оно работает!

То, как я его протестировал, я настроил CGridView с 'ajaxUpdate'=>true,.Затем в моем CDataProvider я установил 'pagination'=>1, чтобы облегчить тестирование.Затем я использовал AJAX actionDelete по умолчанию в моем контроллере для удаления элементов.Каждый раз, когда я удалял элемент с помощью этой ссылки действия AJAX в CGridView, сетка обновлялась с помощью AJAX, а количество страниц уменьшалось на 1. Кажется, что это работает как очарование!

...