Я полностью потерял фильтрацию в Yii gridView. Я пытаюсь сделать фильтрацию с помощью CArrayDataProvider. Я проверяю все форумы, и они сказали, что я должен использовать этот расширенный фильтр, но на данный момент я застрял в этой ошибке:
Может кто-то помочь мне с этим? выполнить фильтрацию с использованием CArrayDataProvider и сетки Yii
Это моя модель:
class Common extends ActiveRecord{
private $connection_common;
private $connection_invetory;
/**
* @see db connections
*/
public function __construct(){
$this->connection_common = Yii::app()->dbcommon;
$this->connection_invetory = Yii::app()->db;
}
public static function model($className=__CLASS__){
return parent::model($className);
}
public function getAllUsers(){
$command = $this->connection_invetory->createCommand("
SELECT id, 'name', active, username, 'function', email ,active FROM users order by id desc;
")->queryAll();
$dataProvider = new CArrayDataProvider($command, array(
'id'=>'user',
'sort'=>array(
'defaultOrder'=>'id DESC',
),
'pagination'=>array(
'pageSize'=>15,
),
));
return $dataProvider;
}
}
это мой КОНТРОЛЛЕР:
class MainController extends Controller {
public function actionIndex() {
$getApplicationNames = Common::model()->getApplications();
$getAllRoleNames = Common::model()->getAllRoles();
$getAllUsers = Common::model()->getAllUsers();
$filtersForm = new FiltersForm;
if (isset($_GET['FiltersForm'])) {
$filtersForm->filters = $_GET['FiltersForm'];
}
$resultData = $filtersForm->filter($getAllUsers);
$this->render('index', array(
'users' => $getAllUsers,
'filtersForm' => $filtersForm
));
}
}
И ЭТО МОЕ ВИД:
$this->widget('GridView', array(
'dataProvider' => $users,
'id' => 'my_grid_view',
//'filter' => $filtersForm,
'itemsCssClass'=>'table',
'pager' => array(
'class' => 'CLinkPager',
'prevPageLabel' => 'Previous',
'nextPageLabel' => 'Next',
'header' => '',
'previousPageCssClass' => 'btn btn-info btn-sm',
'selectedPageCssClass' => 'btn btn-warning btn-sm',
'internalPageCssClass' => 'btn btn-info btn-sm',
'firstPageCssClass' => 'btn btn-info btn-sm',
'nextPageCssClass' => 'btn btn-info btn-sm',
),
'columns' => array(
array(
'name' => 'User ID',
'type' => 'raw',
'value' => 'CHtml::encode($data["id"])'
),
array(
'name' => 'Username',
'type' => 'raw',
'value' => 'CHtml::encode($data["username"])'
),
array(
'name' => 'Name',
'type' => 'raw',
'value' => 'CHtml::encode($data["name"])'
),
array(
'name' => 'Email',
'type' => 'raw',
'value' => 'CHtml::encode($data["email"])'
),
array(
'name' => 'Role',
'type' => 'raw',
'value' => 'CHtml::encode($data["function"])'
),
array(
'name' => 'Status',
'type' => 'raw',
'value' => 'CHtml::encode($data["active"])'
),
array(
'name' => 'Action',
'type' => 'raw',
'value' => 'CHtml::link("<button type=\'button\' class= \'btn btn-info user_ajax\' data-toggle=\'modal\' data-target=\'#myModal\'>Info</button>")',
),
),
));
и это контент класса фильтра Filtersform, который находится в модели:
/**
* Override magic getter for filters
*/
public function __get($name)
{
if(!array_key_exists($name, $this->filters))
$this->filters[$name] = null;
return $this->filters[$name];
}
public function rules()
{
return array(
array('username', 'required'),
);
}
/**
* Filter input array by key value pairs
* @param array $data rawData
* @return array filtered data array
*/
public function filter($data)
{
foreach($data AS $rowIndex => $row) {
foreach($this->filters AS $key => $value) {
// unset if filter is set, but doesn't match
if(array_key_exists($key, $row) AND !empty($value)) {
if(stripos($row[$key], $value) === false)
unset($data[$rowIndex]);
}
}
}
return $data;
}
}
Finnaly После 2-х дней отладки я решил:
Это полный код:
Посмотреть:
$this->widget('GridView', array(
'dataProvider' => $users,
'id' => 'my_grid_view',
'filter' => $filtersForm,
'itemsCssClass'=>'table',
'pager' => array(
'class' => 'CLinkPager',
'prevPageLabel' => 'Previous',
'nextPageLabel' => 'Next',
'header' => '',
'previousPageCssClass' => 'btn btn-info btn-sm',
'selectedPageCssClass' => 'btn btn-warning btn-sm',
'internalPageCssClass' => 'btn btn-info btn-sm',
'firstPageCssClass' => 'btn btn-info btn-sm',
'nextPageCssClass' => 'btn btn-info btn-sm',
),
'columns' => array(
array(
'name' => 'User ID',
'type' => 'raw',
'value' => 'CHtml::encode($data["id"])'
),
array(
'name' => 'Username',
'type' => 'raw',
'value' => 'CHtml::encode($data["username"])'
),
array(
'name' => 'Name',
'type' => 'raw',
'value' => 'CHtml::encode($data["name"])'
),
array(
'name' => 'Email',
'type' => 'raw',
'value' => 'CHtml::encode($data["email"])'
),
array(
'name' => 'Role',
'type' => 'raw',
'value' => 'CHtml::encode($data["function"])'
),
array(
'name' => 'Status',
'type' => 'raw',
'value' => 'CHtml::encode($data["active"])'
),
array(
'name' => 'Action',
'type' => 'raw',
'value' => 'CHtml::link("<button type=\'button\' class= \'btn btn-info user_ajax\' data-toggle=\'modal\' data-target=\'#myModal\'>Info</button>")',
),
),
));
Контроллер:
public function actionIndex() {
$getApplicationNames = Common::model()->getApplications();
$getAllRoleNames = Common::model()->getAllRoles();
$getAllUsers = Common::model()->getAllUsers();
$filtersForm = new FiltersForm;
if (isset($_GET['FiltersForm'])) {
$filtersForm->filters = $_GET['FiltersForm'];
//var_dump($filtersForm->filters);
}
$resultData = $filtersForm->filter($getAllUsers->rawData);
$dataProvider = new CArrayDataProvider($resultData);
$this->render('index', array(
'users' => $dataProvider,
'filtersForm' => $filtersForm
));
}
Класс filterForm:
<?php
class FiltersForm extends CFormModel
{
/**
* @var array filters, key => filter string
*/
public $filters = array();
/**
* Override magic getter for filters
* @param string $name
*/
public function __get($name)
{
if (!array_key_exists($name, $this->filters)) {
$this->filters[$name] = '';
}
return $this->filters[$name];
}
/**
* Override magic setter for filters
* @param string $name
* @param mixed $value
*/
public function __set($name, $value)
{
$this->filters[$name] = $value;
}
/**
* Filter input array by key value pairs
* @param array $data rawData
* @return array filtered data array
*/
public function filter(array $data)
{
foreach ($data AS $rowIndex => $row) {
foreach ($this->filters AS $key => $searchValue) {
if (!is_null($searchValue) AND $searchValue !== '') {
$compareValue = null;
if ($row instanceof CModel) {
// if (isset($row->$key) == false) {
// throw new CException("Property " . get_class($row) . "::{$key} does not exist!");
// }
$compareValue = $row->$key;
} elseif (is_array($row)) {
$key = strtolower($key);
if (!array_key_exists($key, $row)) {
throw new CException("Key {$key} does not exist in array!");
}
$compareValue = $row[$key];
} else {
throw new CException("Data in CArrayDataProvider must be an array of arrays or an array of CModels!");
}
if (stripos($compareValue, $searchValue) === false) {
unset($data[$rowIndex]);
}
}
}
}
return $data;
}
}
ОГРОМНОЕ ВНИМАНИЕ ЗДЕСЬ, посмотрите, будут ли клавиши соответствовать. как вы можете видеть, я использовал функцию строплера
и модельная функция
public function getAllUsers(){
$command = $this->connection_invetory->createCommand("
SELECT id, 'name', active, username, 'function', email ,active FROM users order by id desc;
")->queryAll();
$dataProvider = new CArrayDataProvider($command, array(
'id'=>'user',
'sort'=>array(
'defaultOrder'=>'id DESC',
),
'pagination'=>array(
'pageSize'=>15,
),
));
return $dataProvider;
}