En las secciones sobre [paginación](output-pagination.md) y [ordenación](output-sorting.md) se
describe como permitir a los usuarios finales elegir que se muestre una página de datos en
particular, y ordenar los datos por algunas columnas. Como la tarea de paginar y ordenar datos
es muy común, Yii proporciona un conjunto de clases *proveedoras de datos* para encapsularla.
Un proveedor de datos es una clase que implementa la interfaz [[yii\data\DataProviderInterface]].
Básicamente se encarga de obtener datos paginados y ordenados. Normalmente se usa junto con
[_widgets_ de datos](output-data-widgets.md) para que los usuarios finales puedan paginar y
ordenar datos de forma interactiva.
Yii incluye las siguientes clases proveedoras de datos:
* [[yii\data\ActiveDataProvider]]: usa [[yii\db\Query]] o [[yii\db\ActiveQuery]] para consultar datos de bases de datos y devolverlos como _arrays_ o instancias [Active Record](db-active-record.md).
* [[yii\data\SqlDataProvider]]: ejecuta una sentencia SQL y devuelve los datos de la base de datos como _arrays_.
* [[yii\data\ArrayDataProvider]]: toma un _array_ grande y devuelve una rodaja de él basándose en las especificaciones de paginación y ordenación.
El uso de todos estos proveedores de datos comparte el siguiente patrón común:
```php
// Crear el proveedor de datos configurando sus propiedades de paginación y ordenación
$provider = new XyzDataProvider([
'pagination' => [...],
'sort' => [...],
]);
// Obtener los datos paginados y ordenados
$models = $provider->getModels();
// Obtener el número de elementos de la página actual
$count = $provider->getCount();
// Obtener el número total de elementos entre todas las páginas
$totalCount = $provider->getTotalCount();
```
Se puede especificar los comportamientos de paginación y ordenación de un proveedor de datos
configurando sus propiedades [[yii\data\BaseDataProvider::pagination|pagination]] y
[[yii\data\BaseDataProvider::sort|sort]], que corresponden a las configuraciones para
[[yii\data\Pagination]] y [[yii\data\Sort]] respectivamente. También se pueden configurar a
`false` para inhabilitar las funciones de paginación y/u ordenación.
Los [_widgets_ de datos](output-data-widgets.md), como [[yii\grid\GridView]], tienen una
propiedad llamada `dataProvider` que puede tomar una instancia de un proveedor de datos y
mostrar los datos que proporciona. Por ejemplo,
```php
echo yii\grid\GridView::widget([
'dataProvider' => $dataProvider,
]);
```
Estos proveedores de datos varían principalmente en la manera en que se especifica la fuente de
datos. En las siguientes secciones se explica el uso detallado de cada uno de estos proveedores
de datos.
## Proveedor de datos activo <span id="active-data-provider"></span>
Para usar [[yii\data\ActiveDataProvider]], hay que configurar su propiedad
[[yii\data\ActiveDataProvider::query|query]].
Puede tomar un objeto [[yii\db\Query] o [[yii\db\ActiveQuery]]. En el primer caso, los datos
devueltos serán _arrays_. En el segundo, los datos devueltos pueden ser _arrays_ o instancias de
[Active Record](db-active-record.md). Por ejemplo:
```php
use yii\data\ActiveDataProvider;
$query = Post::find()->where(['state_id' => 1]);
$provider = new ActiveDataProvider([
'query' => $query,
'pagination' => [
'pageSize' => 10,
],
'sort' => [
'defaultOrder' => [
'created_at' => SORT_DESC,
'title' => SORT_ASC,
]
],
]);
// Devuelve un array de objetos Post
$posts = $provider->getModels();
```
En el ejemplo anterior, si `$query` se crea el siguiente código, el proveedor de datos
devolverá _arrays_ en bruto.
```php
use yii\db\Query;
$query = (new Query())->from('post')->where(['state' => 1]);
```
> Note: Si una consulta ya tiene la cláusula `orderBy`, las nuevas instrucciones de ordenación
dadas por los usuarios finales (mediante la configuración de `sort`) se añadirán a la cláusula
`orderBy` previa. Las cláusulas `limit` y `offset` que pueda haber se sobrescribirán por la
petición de paginación de los usuarios finales (mediante la configuración de `pagination`).
Por omisión, [[yii\data\ActiveDataProvider]] usa el componente `db` de la aplicación como
conexión con la base de datos. Se puede indicar una conexión con base de datos diferente
configurando la propiedad [[yii\data\ActiveDataProvider::db]].
## Proveedor de datos SQL <span id="sql-data-provider"></span>
[[yii\data\SqlDataProvider]] funciona con una sentencia SQL en bruto, que se usa para obtener
los datos requeridos.
Basándose en las especificaciones de [[yii\data\SqlDataProvider::sort|sort]] y
[[yii\data\SqlDataProvider::pagination|pagination]], el proveedor ajustará las cláusulas
`ORDER BY` y `LIMIT` de la sentencia SQL acordemente para obtener sólo la página de datos
solicitados en el orden deseado.
Para usar [[yii\data\SqlDataProvider]], hay que especificar las propiedades