Answer the question
In order to leave comments, you need to log in
How to make ListView with custom filter (Ajax/Pjax) and pagination in Yii2?
Good afternoon. Prompt with the solution: It is necessary to connect ajax data update through a custom form with filters and dynamic pagination.
Now made through Pjax.
Performance:
<?php Pjax::begin(); ?>
<?= Html::beginForm(['fields/index'], 'post', ['data-pjax' => '', 'class' => 'form-inline']); ?>
<?= Html::input('text', 'string', '', ['class' => 'form-control']) ?>
<?= Html::submitButton('Search It', ['class' => 'btn btn-lg btn-primary', 'name' => 'hash-button']) ?>
<?= Html::endForm() ?>
<?= ListView::widget([
'dataProvider' => $dataProvider,
'itemView' => '_pjax',
'options' => [
'id' => 'listview'
]
]); ?>
<?php Pjax::end(); ?>
$query = Fields::find();
$query->where(['>=', 'field_value', Yii::$app->request->post('string') ?? 0]);
$dataProvider = new ActiveDataProvider([
'query' => $query,
]);
return $this->render('index', [
'dataProvider' => $dataProvider
]);
Answer the question
In order to leave comments, you need to log in
Well, firstly, you need to understand that Ajax is a technology that is maximally related to the javascript language
. To update information on Ajax, you need to create a field (DOM tree) with a certain id that will be tied to the function.
Pjax is just an auxiliary class, a tool for manipulating content, so the networks of the block with the Pjax class should be spread out exactly as much as it will concern updating the content.
In some cases, I had to capture the entire page of the action in view, paganization can be displayed separately, outside the ListView, and this technology is described in the Yii2 documentation the code is more convenient and simple:
public function actionMessages($id ='', $token ='')
{
$model = new Message(); // обращаемся к классу привязанному к таблице БД
if ($model->load(Yii::$app->request->post()) && $model->save()) // убеждаемся что передача данных проходит успешно
{
$model = new Message(); // возвращаем то что обновили
}
$send = Message::find()->where(['token' => $token])->orderBy(['id' => SORT_ASC ])->all(); // выводим всю переписку с конкретным пользователем
$col = Message::find()->where(['token' => $token])->count(); // выводим количество сообщений с конкретным пользователем (например, чтобы скрыть пустой код, если переписки ещё не было)
$getm = User::find()->where(['id' => $id])->one(); // так мы определим с кем мы переписываемся (имя, аватарка, возраст, что угодно)
return $this->render('messages', ['model' => $model, 'col' => $col, 'send' => $send, 'getm' => $getm, 'id' => $id, 'token' => $token,]); // рендерим всё к чему прикоснулись, чтобы работало.
}
<?php
use yii\data\Pagination;
?>
<?php
use yii\widgets\LinkPager;
?>
$query = Guestbook::find()->where(['level' => 1])->orderBy(['time' => SORT_DESC,]); // создаём конструкцию обращения
$pages = new Pagination(['totalCount' => $query->count(),'pageSize' => 5]); // обращаемся к классу чтобы сказать сколько записей за раз нужно отобразить, например 5
$pages->pageSizeParam = false; // отключаем самодеятельность параметров
$models = $query->offset($pages->offset)->limit($pages->limit)->all(); // теперь зная количество записей и лимиты, мы заставляем скрипт показывать нам ровно столько сколько нам нужно
Didn't find what you were looking for?
Ask your questionAsk a Question
731 491 924 answers to any question