Нашел статью про ListView без листания и с подгрузкой контента по нажатию кнопки.
Ссыльк: www.elisdn.ru/blog/28/beskonechnaia-lenta-zapisei-s-ajax-dozagruzkoi-na-yii
Статья хорошая и понятная, но для первой версии фреймворка.
Начал переделывать и вроде получалось, пока не дошел до javascript
Мой немного переделанный код скрипта выглядит так:
// запоминаем текущую страницу и их максимальное количество
var page = parseInt('<?php echo Yii::$app->request->get("page", 1); ?>');
console.log(page);
var pageCount = parseInt('<?php echo (int)$dataProvider->pagination->pageCount; ?>');
var loadingFlag = false;
$('#showMore').click(function()
{
// защита от повторных нажатий
if (!loadingFlag)
{
// выставляем блокировку
loadingFlag = true;
// отображаем анимацию загрузки
$('#loading').show();
$.ajax({
type: 'get',
url: window.location.href,
data: {
// передаём номер нужной страницы методом POST
'page': page + 1,
'<?php echo Yii::$app->request->csrfTokenFromHeader ?>': '<?php echo Yii::$app->request->csrfToken ?>'
},
success: function(data)
{
// увеличиваем номер текущей страницы и снимаем блокировку
page++;
loadingFlag = false;
// прячем анимацию загрузки
$('#loading').hide();
// вставляем полученные записи после имеющихся в наш блок
$('#listView').append(data);
// если достигли максимальной страницы, то прячем кнопку
if (page >= pageCount)
$('#showMore').hide();
}
});
}
return false;
});
Но ни один php echo не возвращает желаемого, если вызвать в javascript, но отлично отображаются в пхп.
В javaScript я еще хуже чем в php, но довел скрипт до того, что он начал реагировать на клик, а вот данные получить никак не осилю.
Пожалуйста подскажите как это победить и как правильно получить эти echo?
На всякий привожу остальной код данного решения, который у меня получился:
Модель:
public function getNewDataProvider()
{
$query = Product::find()->where(['new' => 1]);
$dataProvider = new ActiveDataProvider([
'query' => $query,
'pagination' => [
'pageSize' => 2,
],
]);
return $dataProvider;
}
Контроллер:
public function actionNew()
{
$dataProvider = Product::getNewDataProvider();
if (\Yii::$app->request->isPjax){
return $this->renderPartial('_loop', [
'dataProvider' => $dataProvider,
]);
} else {
return $this->render('new', [
'dataProvider' => $dataProvider
]);
}
}
Вид index:
<?php Pjax::begin([
'id' => 'productList',
'enablePushState' => false,
// 'enableReplaceState' => false,
]); ?>
<?= $this->render('_loop', ['dataProvider' => $dataProvider]); ?>
<?php Pjax::end(); ?>
Вспмогалка _loop:
<?= ListView::widget([
'dataProvider' => $dataProvider,
'itemView' => '_view',
'layout' => "{items}\n{summary}",
]); ?>
<?php if ($dataProvider->totalCount > $dataProvider->pagination->pageSize): ?>
<p id="loading" style="display:none"><img src="<?php echo Yii::$app->request->baseUrl; ?>/images/loading.gif" alt="" /></p>
<p id="showMore">Показать ещё</p>
<?php endif; ?>
Вспомогалка _view:
<h2><?= Html::encode($model->title) ?></h2>
<?= HtmlPurifier::process($model->description) ?>