Я создаю виджет, который показывает пункты повестки дня
Модель виджета:
<?php
namespace infoweb\agenda\widgets;
use Yii;
use yii\bootstrap\Widget;
class Agenda extends Widget
{
public $template = '_agenda';
public $pageSize = 4;
public function init()
{
parent::init();
}
/**
* @return null|string
*/
public function run()
{
$searchModel = new Search([
'pageSize' => $this->pageSize,
]);
$dataProvider = $searchModel->search(Yii::$app->request->queryParams);
return $this->render('agenda', ['dataProvider' => $dataProvider, 'template' => $this->template]);
}
}
Поиск модели:
<?php
namespace infoweb\agenda\widgets;
use Yii;
use yii\data\ActiveDataProvider;
use infoweb\agenda\models\Agenda as AgendaModel;
class Search extends AgendaModel
{
public $pageSize;
/**
* Creates data provider instance with search query applied
* @return ActiveDataProvider
*/
public function search($params)
{
$query = AgendaModel::find()->joinWith('translations')->where(['active' => 1]);
$query->andFilterWhere(['language' => Yii::$app->language]);
$dataProvider = new ActiveDataProvider([
'query' => $query,
'sort' => ['defaultOrder' => ['date' => SORT_DESC]],
'pagination' => [
'pageSize' => $this->pageSize,
],
]);
if (!($this->load($params) && $this->validate())) {
return $dataProvider;
}
return $dataProvider;
}
}
Виджет вид:
<?php
use yii\widgets\Pjax;
?>
<?php
Pjax::begin();
echo \yii\widgets\ListView::widget([
'dataProvider' => $dataProvider,
'itemView' => $template,
'summary' => false,
'itemOptions' => [
'class' => 'agenda',
],
]);
Pjax::end();
Просмотр списка:
<?php
use yii\helpers\Html;
?>
<div class="date">
<div class="day"><?= date('d', $model->date) ?></div>
<hr>
<div class="month"><?= date('m', $model->date) ?></div>
</div>
<div class="content">
<h3><?= $model->name ?></h3>
<p><?= $model->short_description ?></p>
<div class="pull-left"><strong>Plaats</strong>: Lorem ipsum</div>
<div class="pull-left hidden-xs"> • </div>
<div class="pull-left"><strong>Aanvangsuur</strong>: <?= date('H:i', strtotime($model->time)) ?> uur</div>
</div>
<div class="image hidden-xs hidden-sm">
<?= Html::img($model->getImage()->getUrl('200x'), ['class' => 'img-responsive']) ?>
</div>
<div class="clearfix"></div>
Проблема 1 (самая важная):
Когда я нажимаю на пейджер, URL-адрес site/index?page=2&per-page=4
но это должно быть без site/index
Проблема 2:
Я использую плагин jQuery matchHeight, когда я перехожу на другую страницу, плагин больше не работает.
Должен ли я инициализировать его снова? И как?
РЕДАКТИРОВАТЬ
$(document).on('pjax:complete', this.initMatchHeight);
Проблема 3: если я изменюсь &per-page=4
, это не работает.
Мне нужно значение по умолчанию для элементов на странице, но было бы неплохо изменить его и в URL
РЕДАКТИРОВАТЬ
использование 'defaultPageSize' => $this->pageSize,
не pagesize
Оказывается, это действительно легко:
'pagination' => [
'pageSize' => $this->pageSize,
'route' => '',
],
Других решений пока нет …