Yii によって自動生成されたコードでは、管理インターフェイスに常に CGridView が表示されます。これは、データを表示するための非常に便利なテーブル コントロールです。うまく使用すると、開発の進行を大幅にスピードアップできます。 CGridView の基本的な使用法を見てみましょう:
わかりやすくするために、Yii デモのブログのサンプルを使用してコードを変更します。まず、変更された部分的な Mysql ステートメントを次に示します。
リーリー2 つのテーブルがあり、1 つは作成者情報を保存し、もう 1 つはログを保存します。ログにはユーザーに関連付けられた外部キーがあります。 2 つのテーブルの is_delete フィールドは、レコードが削除されたかどうかをマークします。0 は削除されていないことを意味し、1 は削除されたことを意味します。 gii で生成された Post クラスのリレーション メソッドを見てみましょう:
リーリー 著者の外部キーは BELONGS_TO 関係として存在しており、これは期待どおりです。
ここまで述べたので、自動生成された Post 内の admin.php の CGridView のコードを見てみましょう:
見てください!何も書いていませんが、これがこのコントロールの最も基本的な使い方です。 dataProvider は、モデル内の検索関数によって提供されるデータです。フィルター...現時点では、Columns が表示される各列を制御します。CButtonColumn の最後の項目には、View Update および View Update という 3 つのボタンが表示されます。消去。
次は少しずつ変形していきます
CGridView を使用して、実際に必要なデータ フォームを表示します。
多くの場合、データベース内の内容は、ユーザーに直接表示するのには適していません。読み取りに適するようになる前に、特定の処理を実行する必要があります。ただし、ここで変更を行わないと、CGridView はデータベース値を変更せずに表示するだけなので、対応するフィールドで値を変更する必要があります。たとえば、is_delete フィールドには 0 と 1 がデータベースに格納されていますが、ここを読み取るのはあまり良くありません。「はい」を表示するには 1 に、「いいえ」を表示するには 0 に変更する必要があります。以下のコードを見てください。2 つのキーはモデルが所有するフィールドに対応し、値は php ステートメントとして記述できます。コードが実行されました。これを見て、この値を使用して多くのことができると思いますか?学生の中には、実行したいコードが非常に長い場合、そのコードはすべて値で記述されているのかと疑問に思う人もいるかもしれません。 。 。 。私は、クラスメイト、どこか別の場所に関数を書いて、それをここで呼び出してみませんか、と言いました。 ?
さらに、配列に入力できる一般的に使用されるオプションがいくつかあります。以下はより一般的な使用法です (コードの他の部分は省略されています)。 リーリー
上記の名前を使用する場合、それはモデル内のオリジナルのフィールドです。自分で定義した新しいコンテンツを表示したい場合は、header:を使用します。 リーリー
CCheckBoxColumn を追加:
各行を選択するためにチェック ボックスが必要になる場合があります。この場合、列を追加して CCheckBoxColumn クラスを使用できます。
リーリー
リスト内の各項目の最後の 3 つの小さなアイコンに気づきましたか?もちろん、それらが必要ない場合は、直接削除してください。しかし、それらのうちのいくつかだけが必要な場合はどうすればよいでしょうか。テンプレートパラメータを追加できます:
リーリー
ボタンをカスタマイズすることもできます:
各検索後に Javascript をトリガーしたい場合、Yii にはこのオプションも用意されています。これを実行したい場合は、これを関数として記述し、afterAjaxUpdate を設定するだけです。ページの先頭 読み込み完了後に呼び出したい場合は、ページに追加の Javascript を追加する必要があります
リーリー
まず、ここでは「1 対多」関連の検索についてのみ話していることを言っておきます。忘れた場合は、ここをクリックしてください。 tbl_post に関連付けられた外部キー。作成者関連の情報を検索するために使用されます。データベースを構築した後、生成した Yii コードの POST モデルを見てください (コメントは無視してください)。
リーリー
POST テーブルと USER テーブルには、作成者キー (例: $model->author->nickname) を介してアクセスできることがわかります。ここに BELONGS_TO 関係があります。
ここまで述べてきましたが、私たちのニーズとは一体何でしょうか? ....
プロダクト マネージャーはメガネを押し上げました。「ログのバックエンド管理インターフェイスに、著者名で該当する記事を検索できる機能を追加したいと考えています。これは緊急であり、今夜完了する予定です
」
淡定淡定,不就是改需求吗。忽略进度要求,我们研究一下究竟要做什么。
其实很简单的,不就是在 POST 的 admin 界面中增加一列作者名称,然后可以通过作者名的 模糊搜索 去找到对应日志吗?看看代码,要是通过 作者 id 去搜索不就简单了吗?不过这样确实不太友好...如果是展示作者名字而已不也是很简单吗?加一个 header 然后 value 是 $data->author->username, 问题是这样只能展示,不能进行搜索...哎,好苦恼。
淡定淡定,不就是多个搜索吗?来,让我告诉你怎么做。
首先,我们进入 POST 的 model,在一开始的地方添加一个属性:
class Post extends CActiveRecord { public $name; //添加一个 public 属性,代表作者名 然后改一下 Model 里面 search 的代码,改动部分都已经加了注释: public function search() { // @todo Please modify the following code to remove attributes that should not be searched. $criteria=new CDbCriteria; $criteria->with = array('author'); //添加了和 author 的渴求式加载 $criteria->compare('post_id',$this->post_id); $criteria->compare('title',$this->title,true); $criteria->compare('content',$this->content,true); $criteria->compare('tags',$this->tags,true); $criteria->compare('status',$this->status); $criteria->compare('create_time',$this->create_time); $criteria->compare('update_time',$this->update_time); $criteria->compare('author_id',$this->author_id); //这里添加了一个 compare, username 是 User 表的字段,$this->name 是我们添加的属性,true 为模糊搜索 $criteria->compare('username',$this->name,true); return new CActiveDataProvider($this, array( 'criteria'=>$criteria, )); }
然后在 view 里面,就是 post 文件夹的 admin.php ,CGridView 改为下面代码:
<?php $this->widget('zii.widgets.grid.CGridView', array( 'id'=>'post-grid', 'dataProvider'=>$model->search(), 'filter'=>$model, 'columns'=>array( 'post_id', 'title', 'content', 'tags', 'status', 'create_time', 'update_time', 'author_id', /*下面就是添加的代码啊*/ array( 'name'=>'作者名称', 'value'=>'$data->author->username', //定义展示的 value 值 'filter'=>CHtml::activeTextField($model,'name'), //添加搜索 filter ), array( 'class'=>'CButtonColumn', ), ), )); ?>
你是不是发现现在有了搜索框但是不起作用呢?哈哈,所以我们说文章要坚持看到最后。我们要做的最后一步,就是在 rule 里面,把 name 属性加入到安全搜索字段中,要不然会被 Yii 认为是不安全字段而过滤掉的。看,就在下面函数的最后一行,safe 前面多了个 name ....
public function rules() { // NOTE: you should only define rules for those attributes that // will receive user inputs. return array( array('title, content, status, author_id', 'required'), array('status, create_time, update_time, author_id', 'numerical', 'integerOnly'=>true), array('title', 'length', 'max'=>128), array('tags', 'safe'), // The following rule is used by search(). // @todo Please remove those attributes that should not be searched. array('post_id, title, content, tags, status, create_time, update_time, author_id, name', 'safe', 'on'=>'search'), ); }