2015-02-10 5 views
7

Ich habe ein ArrayVerwendung Yii2 mit Anordnung von Daten und mit einem Gridview Sortier- und Filter

$resultData = [ 
    array("id"=>1,"name"=>"Cyrus","email"=>"[email protected]"), 
    array("id"=>2,"name"=>"Justin","email"=>"[email protected]"), 
    array("id"=>3,"name"=>"Mason","email"=>"[email protected]"), 
    array("id"=>4,"name"=>"Fulton","email"=>"[email protected]"), 
    array("id"=>5,"name"=>"Neville","email"=>"[email protected]"), 
    array("id"=>6,"name"=>"Jasper","email"=>"[email protected]"), 
    array("id"=>7,"name"=>"Neville","email"=>"[email protected]"), 
    array("id"=>8,"name"=>"Neville","email"=>"[email protected]"), 
    array("id"=>9,"name"=>"Ronan","email"=>"[email protected]"), 
    array("id"=>10,"name"=>"Raphael","email"=>"[email protected]"),  
    ]; 

ein Datenprovider:

$dataProvider = new ArrayDataProvider([ 
     'key'=>'id', 
     'allModels' => $resultData, 
     'sort' => [ 
      'attributes' => ['id', 'name', 'email'], 
     ], 
]);  

Und das Gridview:

echo GridView::widget([ 
     'dataProvider' => $dataProvider, 

     'columns' => [ 
      ['class' => 'yii\grid\SerialColumn'], 
      'id', 

      [ 
      'attribute' => 'name', 
      'value' => 'name', 
      ], 
      [ 
      "attribute" => "email", 
      'value' => 'email', 
      ] 

    ] 
]); 

Wie ist, der Code macht mich das Array in einem Raster anzeigen, und die Möglichkeit, es beim Klicken auf Spalten zu sortieren. Das ist ok.

Aber wie man filtert?

Ich habe versucht, mit den folgenden:

$searchModel = ['id' => null, 'name' => '', 'email' => '']; 

echo GridView::widget([ 
     'dataProvider' => $dataProvider, 
     'filterModel' => $searchModel, 

     'columns' => [ 
      ['class' => 'yii\grid\SerialColumn'], 
      'id', 

      [ 
      'attribute' => 'name', 
      'value' => 'name', 
      ], 
      [ 
      "attribute" => "email", 
      'filter' => '<input class="form-control" name="filteremail" value="da" type="text">', 
      'value' => 'email', 
      ] 

    ] 
]); 

Aber es funktioniert nicht. Muss ich das Objekt abhängig vom $ get-Wert filtern?

+0

Was meinst du mit "es funktioniert nicht"? Die Sucheingaben werden nicht angezeigt? – arogachev

+0

Was ich meine, wenn ich nicht arbeite ist, dass die Eingabe nur angezeigt wird, wenn ich den Filter wie im Sample anlege. 'filter' => '', 'wert' => 'email', Aber die Daten werden nicht gefiltert. – Ydakilux

Antwort

6

Meine Lösung mit vollständigem Code:

$resultData = [ 
    array("id"=>1,"name"=>"Cyrus","email"=>"[email protected]"), 
    array("id"=>2,"name"=>"Justin","email"=>"[email protected]"), 
    array("id"=>3,"name"=>"Mason","email"=>"[email protected]"), 
    array("id"=>4,"name"=>"Fulton","email"=>"[email protected]"), 
    array("id"=>5,"name"=>"Neville","email"=>"[email protected]"), 
    array("id"=>6,"name"=>"Jasper","email"=>"[email protected]"), 
    array("id"=>7,"name"=>"Neville","email"=>"[email protected]"), 
    array("id"=>8,"name"=>"Neville","email"=>"[email protected]"), 
    array("id"=>9,"name"=>"Ronan","email"=>"[email protected]"), 
    array("id"=>10,"name"=>"Raphael","email"=>"[email protected]"),  
    ]; 

function filter($item) { 
    $mailfilter = Yii::$app->request->getQueryParam('filteremail', ''); 
    if (strlen($mailfilter) > 0) { 
     if (strpos($item['email'], $mailfilter) != false) { 
      return true; 
     } else { 
      return false; 
     } 
    } else { 
     return true; 
    } 
} 

$filteredresultData = array_filter($resultData, 'filter'); 


$mailfilter = Yii::$app->request->getQueryParam('filteremail', ''); 
$namefilter = Yii::$app->request->getQueryParam('filtername', ''); 

$searchModel = ['id' => null, 'name' => $namefilter, 'email' => $mailfilter]; 

$dataProvider = new ArrayDataProvider([ 
     'key'=>'id', 
     'allModels' => $filteredresultData, 
     'sort' => [ 
      'attributes' => ['id', 'name', 'email'], 
     ], 
]); 

echo GridView::widget([ 
     'dataProvider' => $dataProvider, 
     'filterModel' => $searchModel, 

     'columns' => [ 
      ['class' => 'yii\grid\SerialColumn'], 
      'id', 

      [ 
      'attribute' => 'name', 
      'value' => 'name', 
      ], 
      [ 
      "attribute" => "email", 
      'filter' => '<input class="form-control" name="filteremail" value="'. $searchModel['email'] .'" type="text">', 
      'value' => 'email', 
      ] 

    ] 
]); 
+0

Nur um klar zu sein. Die Filter werden nicht angezeigt, wenn der Filter nicht auf Model basiert –

1

Auf der vorherige soultion. Ich habe eine Schleife erstellt, um die Filter, Spalten und searchModel zu erstellen.

$items = [ 
    array("id" => 1, "name" => "Cyrus", "email" => "[email protected]"), 
    array("id" => 2, "name" => "Justin", "email" => "[email protected]"), 
    array("id" => 3, "name" => "Mason", "email" => "[email protected]"), 
    array("id" => 4, "name" => "Fulton", "email" => "[email protected]"), 
    array("id" => 5, "name" => "Neville", "email" => "[email protected]"), 
    array("id" => 6, "name" => "Jasper", "email" => "[email protected]"), 
    array("id" => 7, "name" => "Neville", "email" => "[email protected]"), 
    array("id" => 8, "name" => "Neville", "email" => "[email protected]"), 
    array("id" => 9, "name" => "Ronan", "email" => "[email protected]"), 
    array("id" => 10, "name" => "Raphael", "email" => "[email protected]"), 
]; 


$searchAttributes = ['id', 'name', 'email']; 
$searchModel = []; 
$searchColumns = []; 

foreach ($searchAttributes as $searchAttribute) { 
    $filterName = 'filter' . $searchAttribute; 
    $filterValue = Yii::$app->request->getQueryParam($filterName, ''); 
    $searchModel[$searchAttribute] = $filterValue; 
    $searchColumns[] = [ 
     'attribute' => $searchAttribute, 
     'filter' => '<input class="form-control" name="' . $filterName . '" value="' . $filterValue . '" type="text">', 
     'value' => $searchAttribute, 
    ]; 
    $items = array_filter($items, function($item) use (&$filterValue, &$searchAttribute) { 
     return strlen($filterValue) > 0 ? stripos('/^' . strtolower($item[$searchAttribute]) . '/', strtolower($filterValue)) : true; 
    }); 
} 

echo GridView::widget([ 
    'dataProvider' => new ArrayDataProvider([ 
     'allModels' => $items, 
     'sort' => [ 
      'attributes' => $searchAttributes, 
     ], 
      ]), 
    'filterModel' => $searchModel, 
    'columns' => array_merge(
      $searchColumns, [ 
     ['class' => 'yii\grid\ActionColumn'] 
      ] 
    ) 
]); 
0

ein Datenprovider:

if ($this->load($params)) { 
    $name = strtolower(trim($this->name)); 
    $resultData= array_filter($resultData, function ($role) use ($name){ 
     return (empty($name) || strpos((strtolower(is_object($role) ? $role->name : $role['name'])),$name) !== false); 
    }); 
} 

$dataProvider = new ArrayDataProvider([ 
     'key'=>'id', 
     'allModels' => $resultData, 
     'sort' => [ 
      'attributes' => ['id', 'name', 'email'], 
     ], 
]); 

https://getyii.com/topic/736

Verwandte Themen