2010-12-30 26 views
9

Estoy tratando de seleccionar algunas filas de la tabla y presentarlas en varias páginas (paginación). Se trata de un código en el modelo:yii CActiveDataProvider con límite y paginación

return new CActiveDataProvider('Downloads', 
     array(
      'criteria' => array(
       'select' => 'download_id,title,thumb_ext', 
       'order' => 'download_id DESC', 
       'limit' => $count, 
      ), 
      'pagination' => array('pageSize' => 5,), 
     ) 
    ); 

En la vista visualizo usando CGridView:

$this->widget('zii.widgets.grid.CGridView', array(
     'dataProvider'=>$dataProvider, 
     'columns' => array('download_id', 'title', 'thumb_ext'), 
    )); 

El problema es que ignora CActiveDataProvider límite de criterios y devuelve todas las filas de la tabla ...

Gracias.

+0

¿$ dataProvider contiene el objeto CActiveDataProvider? –

+0

Sí, no publiqué aquí el código de Controller ... – Savash

Respuesta

7

No soy positivo ... pero creo que Yii usa la cláusula LIMIT para hacer la paginación de resultados SQL, por lo que sobrescribirá/reemplazará su cláusula LIMIT. Puede comprobar esto activando la ruta de registro CWebLogRoute para ver exactamente qué SQL se está ejecutando.

No estoy muy seguro de cómo se supone que debe funcionar, de todos modos. ¿Cuál es la cláusula LIMIT que ha agregado? Si está paginating de todos modos, ¿por qué no dejar que el usuario pagine todos los registros? La solución probablemente sea cambiar sus criterios para deshacerse de la cláusula LIMIT.

¿Está tratando de establecer el número de resultados por página? Usted ya tiene el tamaño de página establecido en 5 ...

Otra cosa que debe intentar hacer que pueda hacer lo que quiera, es verificar la clase de Buscapersonas base, CPagination. Con CLinkPager, es posible que le permita paginar de forma más creativa que el CListPager que está utilizando con el CGridView.

¡Buena suerte!

+0

¡Gracias! ... – Savash

2

Una de las características básicas de un proveedor de datos es que puede anular el cálculo de la cantidad de filas especificando un "totalItemCount" en la configuración. Normalmente (no he probado) esto también funciona para el ActiveDataProvider:

return new CActiveDataProvider('Downloads', 
     array(
      'criteria' => array(
       'select' => 'download_id,title,thumb_ext', 
       'order' => 'download_id DESC', 
      ), 
      'pagination' => array('pageSize' => 5,), 
      'totalItemCount' => $count, 
     ) 
    ); 
5

que tenía el mismo problema y me encontré con una solución de la siguiente manera:

return new CActiveDataProvider('Downloads', 
    array(
     'criteria' => array(
      'select' => 'download_id,title,thumb_ext', 
      'order' => 'download_id DESC', 
     ), 
     'pagination' => array('pageSize' => 5,), 
     'totalItemCount' => $count, 
    ) 
); 

y establecer CGridView que se oculta la paginación :

$this->widget('zii.widgets.grid.CGridView', array(
    'dataProvider'=>$dataProvider, 
    'enablePagination' => false, 
    'columns' => array('download_id', 'title', 'thumb_ext'), 
));