2016-12-21 7 views
1

私はCRUDテーブルを持ちたいと思います。具体的には、レコードを編集/削除する必要はなく、CRUD生成テーブルの一番上に表示されるフィルタリング結果の部分のみが私が持っていたい部分。私のテーブルにはデータベースの1つのテーブルからのデータが含まれていますが、私はデータベース内のこの他のテーブルに接続されていない1つのカラムを持っています(テーブルの1つのカラムに基づいて自動生成されるコメントです)。私はテーブルを手作業で生成しますが、フィルタリングでそのパーツを追加したいと思います。私はそれをどうやって行うのか分かりません。それはYii2で手動で行うことが可能ですか、CRUDジェネレータを使用する必要がありますか?Yii2手動で生成されたCRUD

+0

あなたがGridViewコントロールを意味するかを追加しますか? – Yupik

答えて

1

私はCRUDジェネレータを使用しません。私が望むコードを生成しないためです(また、フィルタも生成しないと思います)。私は表示する必要があるほぼすべてのグリッドビューに適合する基本テンプレートを使用します。

use yii\grid\GridView; 

/** @var array $userTypes All user types (classes) */ 
// ... 

echo GridView::widget([ 
    'dataProvider' => $modelProvider, 
    'filterModel' => $model, 
    'columns' => [ 
     [ 
      'attribute' => 'id', 
      'format' => 'raw', 
      'filter' => Html::input('text', 'User[id]', $model->id, ['class' => 'form-control', 'placeholder' => 'Filter ID']), 
     [ 
      'attribute' => 'type', 
      'format' => 'raw', 
      'filter' => Html::activeDropDownList($model, 'type', $userTypes, ['class' => 'form-control', 'prompt' => 'All types']), 
     ], 
]); 

ここでは、2つの異なる入力フィールドの種類(テキストとドロップダウン)を使用しています。

Html::inputの場合は、最初にタイプ(テキスト)、フル属性名(モデル名+属性名)、次にデフォルト値、最後に他のオプションです。

Html::activeDropDownListの場合は、まずモデル、属性名(のみ)、その項目リスト(配列)、最後に他のオプションがあります。

+0

あなたの質問に誤解があった場合は、何らかの説明をしてください。 –

0

あなたはGridViewについて話していると思います。はいの場合は、あなた自身の列を持つことができます。問題ありません。それをフィルタリングすることができるようにあなたが

を述べたように、あなたがGiiによって生成された基本的なテンプレートを使用する場合、その列commentを呼び出して、あなたはまた、そのモデルの検索クラスを生成し、その後、あなたはcomment安全な属性にし、そのコードのためのコードを追加することができます。

あなたが言及した列、可能な値か、より適切な答えを得る可能性がありますalgorythmに関するより詳細なことができれば...

はまたYii 2.0: Displaying, Sorting and Filtering Model Relations on a GridView

を見てとることは、あなたが行ったように、あなたのmodelXyzと呼ばれているとしましょう提供されていません。あなたが関係(それを定義するための具体的な名前を持つメソッド)を追加しますXyzまた、私は\app\models\

public function getComment() 
{ 
    $column_from_your_table = $this->column_from_your_table; 
    $comment = ''; 

    // your code to specify the relation 
    // ... 

    // this is value dislpayed in column grid 
    return $comment; 
} 

とファイルXyzSearch.phpであなたのモデルではcomment

としてcolumn_from_your_tableとしてあなたのテーブルとあなたの仮想列から列の名前

あなたは(ofcourseのニーズにエディット)

<?php 

namespace app\models; 

use Yii; 
use yii\base\Model; 
use yii\data\ActiveDataProvider; 
use yii\db\Expression; 

/** 
* XyzSearch represents the model behind the search form about `app\models\Xyz`. 
*/ 
class XyzSearch extends Xyz 
{ 
    public $comment; // your virtual column 

    /** 
    * @inheritdoc 
    */ 
    public function rules() 
    { 
     return [ 
      // add it to safe attributes 
      [['comment'], 'safe'], 
      // you will have more rules for your other columns from DB probably 
     ]; 
    } 

    /** 
    * @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 = Xyz::find(); 

     // add conditions that should always apply here 

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

     // I dont know your how it is your comment column autogenerated 
     // or what is the relation, so I give you just basic idea 
     // your algorythm needs to be able to be rewritten in SQL 
     // otherwise I dont know how you could possibly sort it 
     $dataProvider->sort->attributes['comment'] = [ 
      'asc' => [Xyz::tableName().'.column_from_your_table' => SORT_ASC], 
      'desc' => [Xyz::tableName().'.column_from_your_table' => SORT_DESC], 
      'default' => SORT_ASC, 
     ]; 

     $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; 
     } 

     // again, you will have more filtering conditions from your generated code 

     // then you will add your custom filtering condition 
     // I dont know your how it is your comment column autogenerated 
     // or what is the relation, so I give you just basic idea 
     $query->andFilterWhere(['like', Xyz::tableName().'.column_from_your_table', $this->comment]); 


     return $dataProvider; 
    } 
} 
をこのようなものを持っていますfinalyあなた viewファイル内

はあなたのVirutalの列

<?php echo GridView::widget([ 
    'dataProvider' => $dataProvider, 
    'filterModel' => $searchModel, 
    'columns' => [ 
     ['class' => 'yii\grid\SerialColumn'], 

     // other columns from database 
     // ... 

     'comment', 

     ['class' => 'yii\grid\ActionColumn'], 
    ] 
]); ?> 
関連する問題