Yii Framework Forum: gridview form filters and common strings - Yii Framework Forum

Jump to content

Page 1 of 1
  • You cannot start a new topic
  • You cannot reply to this topic

gridview form filters and common strings gridview automatically filtering common characters Rate Topic: -----

#1 User is offline   oceanscrashing 

  • Newbie
  • Yii
  • Group: Members
  • Posts: 13
  • Joined: 28-May 13

Posted 18 August 2017 - 09:22 AM

Hello, I'm looking for a solution to what I'm finding to be a fairly hard-to-search-for problem.

In gridviews, when a property I define for an active model (that doesn't come from a database column) contains a common string, the filter inputs reflect that string. For example, if I have a column "if1," and all interfaces contain " - ", the filter will show " - " pre-entered. Is there a way to clear that filter when the page first loads, or otherwise make it so that the filter is not pre-populated?

I dumped the searchmodel and don't see the string stored in it's properties.

Controller Action:
   
    public function actionIndex()
    {
        $searchModel = new VirtualMachineSearch();
        $dataProvider = $searchModel->search(Yii::$app->request->queryParams);
        $dataProvider = $searchModel->filter(Yii::$app->request->queryParams, $dataProvider->models);
        $dataProvider->sort = ['attributes' => ['vm_id', 'name', 'hostName', 'ipAddress', 'macAddress', 'json', 'if1', 'if$

        return $this->render('index', [
            'searchModel' => $searchModel,
            'dataProvider' => $dataProvider,
        ]);
    }



Model getter/setter:
    public function getIf1()
    {
        return $this->macAddress .' - '.$this->ipAddress;
    }

    public function setIf1($value)
    {
        return $this->if1 = $value;
    }



Search model filter function:
    public function filter($params, $models)
    {
        foreach($models as $index => $model)
        {
            if(!isset($params['VirtualMachineSearch'])){break;}
            foreach($params['VirtualMachineSearch'] as $property => $string)
            {
                if( !empty($string) ){
                        if(!stristr($model->$property, $string) || empty($model->$property)){unset($models[$index]);}
                }
            }
        }

        $provider = new ArrayDataProvider([
                'allModels' => $models,
        ]);
        return $provider;
    }


On the search model, the only other change I made from the gii auto-generated values were to mark if1 safe.


UPDATE: if I comment out the section where I use my filter function, and only mark if1 safe, I still get the form prepopulated with the string


UPDATE: I think I understand better what was happening; The search is happening from the perspective of a new model, and as that new model gets initialized, the "if1" property was getting the string concatenated onto the other empty properties. To fix, I just changed the getter function to something like:

    public function getIf1()
    {
        $mac = $this->macAddress;
        $separator = empty($mac) ? null : ' - ';
        return $mac.$separator.$this->ipAddress;
    }


Hope this helps someone down the line
1

Share this topic:


Page 1 of 1
  • You cannot start a new topic
  • You cannot reply to this topic

1 User(s) are reading this topic
0 members, 1 guests, 0 anonymous users