Как фильтровать с помощью Yii gridView?

0

Я полностью потерял фильтрацию в Yii gridView. Я пытаюсь сделать фильтрацию с помощью CArrayDataProvider. Я проверяю все форумы, и они сказали, что я должен использовать этот расширенный фильтр, но на данный момент я застрял в этой ошибке: Изображение 174551

Может кто-то помочь мне с этим? выполнить фильтрацию с использованием 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;
}

}

  • 0
    кто-нибудь, есть идеи?
Теги:
gridview
yii

1 ответ

0

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;

    }

Ещё вопросы

Сообщество Overcoder
Наверх
Меню