ActiveDataProvider пагинация не работает

Общие вопросы по использованию второй версии фреймворка. Если не знаете как что-то сделать и это про Yii 2, вам сюда.
Ответить
kukuruku
Сообщения: 1318
Зарегистрирован: 2011.02.14, 11:36

ActiveDataProvider пагинация не работает

Сообщение kukuruku »

контроллер

Код: Выделить всё


$dataProvider = new ActiveDataProvider([
            'query' => $model->getProducts(),
            'pagination' => [
                'pageSize' => Yii::$app->params['pageSize']
            ]
        ]);
        
    
    
вью

Код: Выделить всё

<?php foreach ($dataProvider->models as $product) : ?>
    
    <?= LinkPager::widget([
                        'pagination' => $dataProvider->pagination,    
проблема в том что выводятся все записи и пейджер не работает
разве ActiveDataProvider не должен сам считать offset? в чем ошибка?
Medic84
Сообщения: 61
Зарегистрирован: 2017.01.28, 17:48

Re: ActiveDataProvider пагинация не работает

Сообщение Medic84 »

Что возвращает метод $model->getProducts() ?
rak
Сообщения: 2181
Зарегистрирован: 2010.11.02, 23:40
Контактная информация:

Re: ActiveDataProvider пагинация не работает

Сообщение rak »

что в Yii::$app->params['pageSize'] и какой генерируется sql запрос?
kukuruku
Сообщения: 1318
Зарегистрирован: 2011.02.14, 11:36

Re: ActiveDataProvider пагинация не работает

Сообщение kukuruku »

Код: Выделить всё

public function getProducts()
    {
        $query = Product::findBySql('SELECT product.* FROM product JOIN product_tag ON product.id=product_tag.product_id WHERE tag_id in (SELECT tag_id FROM product_page_tag WHERE product_page_id=:id) GROUP BY id HAVING COUNT(id) = (SELECT COUNT(tag_id) FROM product_page_tag WHERE product_page_id=:id)', [':id' => $this->id]);
        $query->multiple = true;
        return $query;
    }
Yii::$app->params['pageSize'] тут число
rak
Сообщения: 2181
Зарегистрирован: 2010.11.02, 23:40
Контактная информация:

Re: ActiveDataProvider пагинация не работает

Сообщение rak »

так а какой запрос генерируется в итоге?
kukuruku
Сообщения: 1318
Зарегистрирован: 2011.02.14, 11:36

Re: ActiveDataProvider пагинация не работает

Сообщение kukuruku »

отладка идет на сервере там счас нету дебаг панели
да и не понятно как может помочь текст запроса?
счас возвращаются все объекты,пейджер всегда на 1 странице
Nerf
Сообщения: 780
Зарегистрирован: 2015.01.29, 00:37

Re: ActiveDataProvider пагинация не работает

Сообщение Nerf »

Note that because the SQL statement is already specified, calling additional query modification methods (such as where(), order()) on the created yii\db\ActiveQuery instance will have no effect. However, calling with(), asArray() or indexBy() is still fine.
http://www.yiiframework.com/doc-2.0/yii ... l()-detail
limit() к первым попадает, судя по всему. Нужно запрос смотреть.
rak
Сообщения: 2181
Зарегистрирован: 2010.11.02, 23:40
Контактная информация:

Re: ActiveDataProvider пагинация не работает

Сообщение rak »

kukuruku писал(а): 2017.02.28, 18:48 да и не понятно как может помочь текст запроса?
ну а как дебажить пагинацию, если не видно что генерируется. если б это был хотя бы не findBySql, то возможно было б проще, а так кто знает что там генерируется в итоге
вообще этот запрос нужно просто на Query Builder переписать, и все ок будет
kukuruku
Сообщения: 1318
Зарегистрирован: 2011.02.14, 11:36

Re: ActiveDataProvider пагинация не работает

Сообщение kukuruku »

заменил query на Model::find(), плюс включил listview- все равно пагинация не работает
rak
Сообщения: 2181
Зарегистрирован: 2010.11.02, 23:40
Контактная информация:

Re: ActiveDataProvider пагинация не работает

Сообщение rak »

kukuruku писал(а): 2017.02.28, 20:37 заменил query на Model::find(), плюс включил listview- все равно пагинация не работает
опять же, нужно врубать дебаг панель ну и код в студию
Loveorigami
Сообщения: 977
Зарегистрирован: 2014.08.27, 21:54

Re: ActiveDataProvider пагинация не работает

Сообщение Loveorigami »

kukuruku писал(а): 2017.02.28, 18:26
Yii::$app->params['pageSize'] тут число
Какое число? 100500?
Последний раз редактировалось Loveorigami 2017.02.28, 21:06, всего редактировалось 2 раза.
kukuruku
Сообщения: 1318
Зарегистрирован: 2011.02.14, 11:36

Re: ActiveDataProvider пагинация не работает

Сообщение kukuruku »

Yii::$app->params['pageSize'] 30, неважно пейджер отрисовывается при этом
дебаг включил, запросы вижу, нигде нету offset как и предполагалось
Loveorigami
Сообщения: 977
Зарегистрирован: 2014.08.27, 21:54

Re: ActiveDataProvider пагинация не работает

Сообщение Loveorigami »

kukuruku писал(а): 2017.02.28, 18:26

Код: Выделить всё

public function getProducts()
    {
        $query = Product::findBySql('SELECT product.* FROM product JOIN product_tag ON product.id=product_tag.product_id WHERE tag_id in (SELECT tag_id FROM product_page_tag WHERE product_page_id=:id) GROUP BY id HAVING COUNT(id) = (SELECT COUNT(tag_id) FROM product_page_tag WHERE product_page_id=:id)', [':id' => $this->id]);
        $query->multiple = true;
        return $query;
    }
Yii::$app->params['pageSize'] тут число
C таким запросом Вам нужен SqlDataProvider
+
Info: The totalCount property is required only if you need to paginate the data. This is because the SQL statement specified via sql will be modified by the provider to return only the currently requested page of data. The provider still needs to know the total number of data items in order to correctly calculate the number of pages available.
http://www.yiiframework.com/doc-2.0/gui ... iders.html
kukuruku
Сообщения: 1318
Зарегистрирован: 2011.02.14, 11:36

Re: ActiveDataProvider пагинация не работает

Сообщение kukuruku »

я уже отключил getProducts
использую Model::find тоже самое
отключил urlmanager все равно не работает
kukuruku
Сообщения: 1318
Зарегистрирован: 2011.02.14, 11:36

Re: ActiveDataProvider пагинация не работает

Сообщение kukuruku »

вобщем нашел такой кусок кода

Код: Выделить всё

<div style="text-align: right; margin: 10px">
                            <?php $count = 100 * ($dataProvider->pagination->page + 1); ?>
                            <?php if ($count > $dataProvider->totalCount) : ?>
                            <div>На странице <?= $dataProvider->totalCount ?> 
                                <?php else : ?>
                                    <?= $count ?>
                                <?php endif; ?>
                                <span>из</span>
                                <?= $dataProvider->totalCount ?> товаров</div>
                        </div>
удалил его и пейджер заработал
отсюда вопрос- почему ломалось?
Nerf
Сообщения: 780
Зарегистрирован: 2015.01.29, 00:37

Re: ActiveDataProvider пагинация не работает

Сообщение Nerf »

Без получения количества записей(getTotalCount(), getCount(), getModels() и прочее, что зависит от prepareTotalCount()), пагинанация не работает. Давнишний баг\фича.
Добавьте до "куска кода" $dataProvider->prepare(), все заработает.
vkponomarev
Сообщения: 13
Зарегистрирован: 2019.11.08, 12:15

Re: ActiveDataProvider пагинация не работает

Сообщение vkponomarev »

Так же, если кому интересно пагинация может не работать если не правильно настроек например nginx:

Вот так будет работать:

Код: Выделить всё

location / {
		try_files $uri $uri/ /index.php$is_args$args;		
	}
Вот так не будет:

Код: Выделить всё

location / {
		#try_files $uri $uri/ /index.php$is_args$args;		
	}
Настраивал доступы на разные папки для разных людей в итоге в одной из location упустил этот код:

Код: Выделить всё

try_files $uri $uri/ /index.php$is_args$args;
Все работало кроме пагинации.
Ответить