2017-02-03 2 views
2

Ich habe eine yii2 GridView, wie von gii CRUD generiert.yii2 gridview filtert mit beforeValidate() Werten

ich darauf mein Browser /model/index. I nicht enthalten alle Suchwerte in der GET-Zeichenfolge. Der GridView-Filter ist jedoch bereits mit Werten gefüllt. enter image description here

Auch wenn ich versuche, diese Filterwerte zu löschen oder zu ersetzen, springen die vorbelegten Werte zurück.

ich bemerken, dass diese vorbelegt-Werte aus dem beforeValidate() Methode des Modells kommen.

public function beforeValidate() 
{ 
    if (parent::beforeValidate()) { 
     if ($this->isNewRecord) { 
      $this->created_at = time(); 
      $this->b_soft_deleted = 0; 
     } 
     $this->updated_at = time(); 
     return true; 
    }   
    return false; 
} 

Offensichtlich der Gridview Filter ruft beforeValidate() und verwendet diesen Wert für einen Filter ...

  • Warum ist das passiert?
  • Was kann ich tun, um Filterwerte rein zu bekommen?

(Lauf yii2 2.0.10 auf PHP 7.0.14)

Update My Search Modell ist

<?php 

namespace common\models\generated; 

use Yii; 
use yii\base\Model; 
use yii\data\ActiveDataProvider; 
use common\models\Article; 

/** 
* ArticleSearch represents the model behind the search form about  `common\models\Article`. 
*/ 
class ArticleSearch extends Article 
{ 
/** 
* @inheritdoc 
*/ 
public function rules() 
{ 
    return [ 
     [['id', 'title', 'description', 'positive_keywords', 'negative_keywords'], 'safe'], 
     [['created_at', 'updated_at', 'b_soft_deleted'], 'integer'], 
    ]; 
} 

/** 
* @inheritdoc 
*/ 
public function scenarios() 
{ 
    // bypass scenarios() implementation in the parent class 
    return Model::scenarios(); 
} 

/** 
* Creates data provider instance with search query applied 
* 
* @param array $params 
* 
* @return ActiveDataProvider 
*/ 
public function search($params) 
{ 
    $query = Article::find(); 

    // add conditions that should always apply here 

    $dataProvider = new ActiveDataProvider([ 
     'query' => $query, 
    ]); 

    $this->load($params); 

    if (!$this->validate()) { 
     // uncomment the following line if you do not want to return any records when validation fails 
     // $query->where('0=1'); 
     return $dataProvider; 
    } 

    // grid filtering conditions 
    $query->andFilterWhere([ 
     'created_at' => $this->created_at, 
     'updated_at' => $this->updated_at, 
     'b_soft_deleted' => $this->b_soft_deleted, 
    ]); 

    $query->andFilterWhere(['like', 'id', $this->id]) 
     ->andFilterWhere(['like', 'title', $this->title]) 
     ->andFilterWhere(['like', 'description', $this->description]) 
     ->andFilterWhere(['like', 'positive_keywords', $this->positive_keywords]) 
     ->andFilterWhere(['like', 'negative_keywords', $this->negative_keywords]); 

    return $dataProvider; 
} 

}

+1

Können Sie Ihr Suchmodell anzeigen? – Bizley

Antwort

5

Sie setzen Attribute in beforeValidate(), die angewendet werden, wenn $this->validate() aufgerufen wird (unabhängig vom Validierungsergebnis).

Sie müssen diese woanders gesetzt bewegen oder ...

Wenn ich richtig vermute ich Sie created_at und updated_at gesetzt, weil diese Felder als nicht null in Ihrer Datenbank markiert sind und wegen dieser gii generierte required Regeln für sie.
Der richtige Weg, mit solchen Attributen umzugehen, ist die required Regel für sie zu entfernen und hinzufügen yii\behaviors\TimestampBehavior, die sie auf Modell kümmern Schritt speichern zu setzen.
Auf diese Weise sehen Sie keine Validierungsfehler für das Modell und müssen diese nicht manuell festlegen und die Datenbankspalten werden ordnungsgemäß ausgefüllt.

Und dieses ganze GridView Problem ist weg.

+0

Ja, Sie raten richtig. Ich werde dies zu einem 'TimestampBehavior' hinarbeiten. Danke vielmals! –

1

Basierend auf Bizley Lösung, können wir auch nicht TimestampBehavior verwenden, nur sollten wir die erforderliche abbrechen und dann diese Logik in beforeSave platzieren. Dies ist eine allgemeinere Lösung, wenn Sie irgendeine Logik ausführen oder einige vorgefertigte Werte erstellen möchten.