Yii2. Подгрузка старых старых сообщений через ajax. Как?

Делаю чат. В начале пользователь видит 20 последних сообщений. Прокручивая скролл кверху, ajax-ом подгружаются еще 20 сообщений более старые. И т.д.
Тут вот начались проблемы. Вытащить 20 последних, а потом еще 20 следующих за ними... Все это усугубляется тем, что id сообщений идут не по порядку (например: 1,2,3,7,9,15). Стандартными функциями Yii тут не обойтись. Может есть какое-то элегантное решение?
Я еще вспомнил про пагинацию. Может через неё как-то можно нужный функционал реализовать?
  • Вопрос задан
  • 2139 просмотров
Пригласить эксперта
Ответы на вопрос 2
@Akellacom
CTO
Да, через пагинацию можно.
Сделайте хидден поле с номером текущей страницы, как пользователь начинает делать прокрутку, иницилизируете ajax запрос, берете номер страницы и прибавляете к нему 1, таким образом получаете данные для след. страницы.

Выводите результат, а хидден поле с номером текущей страницы обновляете.

upd.

Ну смотрите.

Для начала создаете hidden поле (оно нам нужно, для определения текущей страницы)
<input type="hidden" name="currentPage" id="currentPage" value="">


Далее в нужном вам экшне иницилизируете пагинацию, что-то типо:
$query = ... запрос к БД

        $countQuery = clone $query;
        $pages = new Pagination(['totalCount' => $countQuery->count()]);
        $pages->setPageSize(10);
        
        $model = $query->offset($pages->offset)->limit($pages->limit)->all();

		return $this->render('index', [
            'model' => $model,
            'pages' => $pages,
        ]);


И не забывайте про
use yii\data\Pagination;

Далее, создаете еще один экшн, который как раз отвечает за подгрузку материалов

public function actionPage()
    {
        if(Yii::$app->getRequest()->getIsAjax()):
            $query = ...запрос к бд...;
            $countQuery = clone $query;
            $pages = new Pagination(['totalCount' => $countQuery->count()]);
            $pages->setPageSize(10);
            $models = $query->offset($pages->offset)->limit($pages->limit)->all();
            $max_pages = $countQuery->count() / 10;
            if($_POST['current_page'] > ceil($max_pages)) {
                return false;
            } else {
                return $this->renderPartial('_page', [
                    'model' => $models,
                    'pages' => $pages,
                ]);
            }
        endif;
    }


И останется дело за малым, нужно иницилизировать AJAX запрос к эшну page при прокрутке страницы.

Как-то так, извините за форматирование кода. Если кто знает решение элегантней, то подскажите

P.S Это пример для Yii 2, для первого принцип такой же, но реализация другая, думаю разберетесь
Ответ написан
www.elisdn.ru/blog/28/beskonechnaia-lenta-zapisei-...
При желание можно оптимизировать под Yii2.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы