slo_nik
@slo_nik

Pjax, как переключить view для данных?

Добрый вечер.
Есть сайт объявлений.
Надо организовать вывод объявлений с двумя разными представлениями(списком, плиткой). Выбор представления должен осуществляться по нажатию на соответствующую ссылку.
Сейчас есть такой код
// ССЫЛКИ ДЛЯ ВЫБОРА ФОРМАТА ВЫВОДА.
<?= Html::a('List', ['car/view-mode'], ['data' => ['view-mode' => 1]]) ?>
<?= Html::a('Gallery', ['car/view-mode'], ['data' => ['view-mode' => 2]]) ?>

// ДЕЙСТВИЕ В КОНТРОЛЛЕРЕ УСТАНАВЛИВАЕТ COOKIE
// кроме этого действия в контроллере есть ещё одно действие actionSearchCar(), которое осуществляет поиск и вывод объявлений.
//но его использовать очень не удобно,
// много кода, куча условий, легко поломать, тяжело исправить.
<?php
    public function actionViewMode($id)
    {
        if(Yii::$app->request->isAjax){
            $viewModeCookie = Yii::$app->response->cookies;
            $viewModeCookie->add(new \yii\web\Cookie([
                    'name' => 'view-mode',
                    'value' => $id
                ])
            );
            $render_file = ($id == 1) ? '_gallery' : '_list';
            return $this->renderAjax('_includes/' . $render_file);
        }
    }
 ?>   

// ВЫВОД ДАННЫХ НА СТРАНИЦЕ
<?php Pjax::begin([
    'id' => 'view-mode-pjax',
    'timeout' => 10000,
    'enablePushState' => false,
    'enableReplaceState' => false,
    'linkSelector' => '.vmpjax'
]) ?>

<div id="view-mode-pjax">
    
    <!-- ВЫБОР ПОДКЛЮЧАЕМЫХ ФАЙЛОВ ДЛЯ ВЫВОДА ОБЪЯВЛЕНИЙ СПИСКОМ ИЛИ ГАЛЕРЕЕЙ -->
    <?php if($viewModeCookieValue == 2){ ?>

    <?= $this->render('_includes/_list', ['cars_res' => $cars_res, 'pages' => $pages]) ?>

    <?php }elseif ($viewModeCookieValue == 1){ ?>

    <?= $this->render('_includes/_gallery', ['cars_res' => $cars_res, 'pages' => $pages]) ?>

    <?php } ?>
    
</div>
<?php Pjax::end(); ?>

В зависимости от значения cookie должен подключаться определённый вид.
Получается, что мне необходимо в renderAjax() передать массив get параметров. Но этот массив может быть внушительных размеров. В него попадают данные по региону, городу, марке, модели, цене, пробегу, цвету, году выпуска и так далее и тому подобное.

Поэтому возник вопрос, правильно ли будет передать через ссылки этот get массив, в действии контроллера вытянуть нужные данные из базы и передать в view?

Изначально, при первом посещении страницы, данные уже есть. Выводятся с учётом того, что пользователь ввёл в форму поиска. И ради того, чтобы изменить вид необходимо опять тягать весь набор необходимых данных? Или есть какой-то более компактный способ?
p.s. Так же надо организовать вывод по выбранному количеству объявлений на странице. Задачи похожие, так что думаю можно будет использовать решения для двух задач? Или я ошибаюсь?

p.s.s. Ссылка на весь контроллер. Нужные действия actionViewMode() и actionSearchCar(). Код не мой, достался в наследство, так что сильно не ругайте)))
  • Вопрос задан
  • 133 просмотра
Решения вопроса 1
slo_nik
@slo_nik Автор вопроса, куратор тега Yii
Зря всех беспокоил, проблема решилась.
При клике на ссылку отправляется ajax запрос на действие, где устанавливаются cookie, и потом в success перегружается нужный блок при помощи PJAX.
$('a.vmpjax').click(function (e) {
        e.preventDefault();

        $(this).addClass('active').closest('li').siblings().find('a').removeClass('active');

        var viewMode = $(this).attr('data-view-mode');
        var url = $(this).attr('href');
            $.ajax({
                type: "GET",
                url: url,
                data: {
                    'id': viewMode
                },
                success: function (data) {
                    $.pjax.reload({container: "#view-mode-pjax", url: window.location.href, timeout: 0 });
                }
            });
    });

Добавился только этот код и class для ссылок, остальной остался без изменений.
Но если кто-то подскажет, как можно его улучшить - буду признателен.
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

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

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