example - yii dataprovider y filtro de CGridView
cgridview yii example (2)
Sé que podemos mostrar una vista de cuadrícula con un modelo y su método de búsqueda y filtrar los resultados, pero ¿podemos hacer una vista de cuadrícula con otro proveedor de datos y otro modelo como este y filtrar sus resultados? ¿El filtro debe ser parte del proveedor de datos?
$attr = Yii::app()->request->getParam($name);
$model = new User(''search'');
$model->unsetAttributes();
$model->setAttributes($attr);
$this->widget(''zii.widgets.grid.CGridView'', array(
''dataProvider'' => $myDataProvider,
''filter'' => $model,
''columns'' => array(
array(
''name'' => ''username'',
''type'' => ''raw'',
''value'' => ''CHtml::encode($data->username)''
),
array(
''name'' => ''email'',
''type'' => ''raw'',
),
),
));
El código anterior no funciona y necesito agregar un filtro en un proveedor de datos previamente creado.
Btw $attr
tiene datos válidos, pero la cuadrícula no está filtrada.
$model
no afecta $myDataProvider
ya que el proveedor de datos no se obtiene utilizando este modelo.
$model->search()
devuelve un CActiveDataProvider
que contiene una instancia de CDbCriteria
. Diferentes CDbCriteria
se pueden combinar usando mergeWith()
. Entonces, si desea que los datos se filtren utilizando los valores del $model
...
$model->setAttributes($attr);
$newDataProvider=$model->search();
$myDataProvider->criteria->mergeWith($newDataProvider->criteria);
$this->widget(''zii.widgets.grid.CGridView'', array(
...
No es necesario que Filter forme parte del proveedor de datos, pero el proveedor de datos debe tener en cuenta el modelo, si desea usarlo para filtrar.
La forma en que esto se realiza de forma predeterminada es crear el proveedor de datos utilizando el método de search
en su modelo, que establece las condiciones de su proveedor de datos en función de los valores del modelo, de la siguiente manera:
''dataProvider'' => $model->search()
No hay nada que le impida crear un proveedor de datos diferente, por ejemplo:
''dataProvider'' => $model->createAnotherDataProvider()
Y en su modelo de Usuario:
public function createAnotherDataProvider() {
{
// create your second data provider here
// with filtering based on model''s attributes, e.g.:
$criteria = new CDbCriteria;
$criteria->compare(''someAttribute'', $this->someAttribute);
return new CActiveDataProvider(''User'', array(
''criteria'' => $criteria,
));
}