Задать вопрос

Как сохранить данные в кэш в yii2 вместе с пагинацией страницы?

Добрый день! Проблема такая. Нужно сохранить страницу/компонент в кэш с пагинацией этой страницы.

Доки читал, все что там было перепробовал, к сожалению получается не тот результат, который нужно.

В общем, в контроллер добавляю behaviors,
Кэширование страниц

public function behaviors()
    {
        return [
            'pageCache' =>
                [
                    'class' => 'yii\filters\PageCache',
                    'only' => ['single'],
                    'duration' => 6000,
                    'variations' => [
                        [Yii::$app->request->get('page')],
                    ],
                    'dependency' => [
                        'class' => DbDependency::class,
                        'sql' => 'SELECT COUNT(*) FROM article',
                    ],
                ],
        ];
    }


все отлично работает, до момента, когда нужно воспользоваться аутентификацией пользователя. В данном виде кэширования сохраняется вся страница., вместе с кнопками входа/выхода. И когда я захожу под логином на сайт, я вроде зашел, по дебагеру, но в плане вида кнопок ничего не меняется, когда должно переключиться на ник человека и кнопку выйти, так как эта страница вся в кеше и он отдает последнее что туда добавилось.

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

Кэширование фрагментов

<?if($this->beginCache('artIndex', ['dependency' => $dependency])):?>
                        <?foreach ($articles as $article):?>
                            <div class="col-md-6">
                                <?= Html::a(Html::img("@web/".$article->image,
                                        ['alt' => 'картинка']) .

                                    "<div class='blog-content-body'>
                                                <div class='post-meta'>
                                                    <span class='category'>{$article->category->title}</span>
                                                    <span class='mr-2'>{$article->dateSave}</span> &bullet;
                                                    <span class='ml-2'><span class='fa fa-comments'></span> 3</span>
                                                </div>
                                                <h2>{$article->title}</h2>
                                            </div>",
                                    [
    //                                    'article/single', 'id' => $article->id
                                        'article/single', 'slug' => $article->slug
                                    ],
                                    [
                                        'class'=>'blog-entry element-animate', 'data-animate-effect'=>'fadeIn'
                                    ]
                                )
                                ?>
                            </div>
                        <?endforeach;?>
                    <?$this->endCache()?>
                    <?endif;?>



В модели артайкл идет
обновление кэша

public function behaviors()
    {
        return [
            'CachedBehavior' => [
                'class' => CachedBehavior::class,
                'cache_key' => [
                    'artIndex',
                ],
            ]
        ];
    }



Все тоже самое происходит и в Кэширование данных

ПРосто в какой то тупик меня загнали))) Конечно можно отказаться от авторизации, она нужна только для того, чтобы люди могли писать комменты и подключить готовые чаты, но что то мне подсказывает, потом будет проблема с кэшем с этим чатом... Подскажите как правильно кэшировать данные со страницы с пагинацией
  • Вопрос задан
  • 93 просмотра
Подписаться 1 Простой Комментировать
Решения вопроса 1
andreyNi
@andreyNi Автор вопроса
В общем разобрался, может кому пригодится, в

контроллере
public function actionIndex(){

        $query = Article::getArticleDesc();

        $data = $this->cacheGet('artIndex');

        if ($data === false) {
            
            $pages = new Pagination([
                'totalCount' => $query->count(),
                'pageSize' => 20,
                'forcePageParam' => false,
                'pageSizeParam' => false
            ]);
            $articles = $query->offset($pages->offset)->limit($pages->limit)->all();
            $this->cacheSet('artIndex', $articles, 10000);
            return $this->render('index', compact('articles', 'pages'));
        }


        $pages = new Pagination([
            'totalCount' => $query->count(),
            'pageSize' => 20,
            'forcePageParam' => false,
            'pageSizeParam' => false
        ]);
        $articles = $query->offset($pages->offset)->limit($pages->limit)->all();

        return $this->render('index', compact('articles', 'pages'));
    }


может кривенько, но работает
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

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

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