Yii、yiicgridviewにおけるCGridView関連テーブルの検索・ソート方法の詳細例
この記事の例では、Yii での CGridView 関連テーブルの検索とソート方法を説明します。参考のためにみんなで共有してください。具体的な実装方法は以下の通りです
Yii CGridView での関連テーブルの検索とソートの実装方法は少し複雑ですが、今日は外国人が書いたゲームを読んで整理して友達に共有したいと思います。 Yii フレームワークを学習します。
まず、ブログ デモの protectedmodelsComment.php をチェックして、コメント モデルに検索メソッドがあることを確認します。ない場合は、gii を使用して生成します。ダウンロードしたブログ デモには検索メソッドがありません。
次に、コードを記述します。まず CommentController に actionList を追加します。
コードをコピーします コードは次のとおりです:
public function actionList()
{
$model=new コメント('検索');
$model->unsetAttributes();
If(isset($_GET['コメント']))
$model->attributes=$_GET['コメント'];
$this->render('リスト',array(
「モデル」=>$model,
));
}
これは特別なもののようには見えません。gii で生成した粗雑なコードと同じです。次に、ビューを作成して、/protected/views/comment/ ディレクトリに list.php を作成し、次のコードを貼り付けます
コードをコピーします コードは次のとおりです:
breadcrumbs=array(
「コメント」
);
?>
コメントを管理
widget('zii.widgets.grid.CGridView', array(
)
'dataProvider'=>$model->search(),
'フィルター'=>$model,
'列' => 配列(
「コンテンツ」、
'post.title',
「ステータス」、
「著者」
)、
));
?>
コメント一覧
コメントの「内容」「ステータス」「作成者」と記事のタイトルのみを表示する基本的なCGridViewです。このリストに記事タイトルの列を追加したいとします。post.title:
を追加するだけです。
コードをコピーします コードは次のとおりです:
'columns'=>array(
「コンテンツ」、
‘post.title’,
「ステータス」、
「著者」、
)、
次のページにアクセスすると、確かに記事のタイトルが表示されていることがわかります
質問:
このページをよく見てみると、記事のタイトルで検索できず、記事のタイトルで並べ替えることもできないことがわかります。これは、CGridView が指定された列名 (post.title) に「.」を見つけたためです。 。 ポイント。ドットがある場合、検索ボックスは生成されません。
解決策:
この問題を解決するには、私たちは一生懸命働かなければなりません。まず、Commen モデルにゲッターとセッターを追加する必要があります。例:
コードをコピーします コードは次のとおりです:
private $_postTitle = null;
パブリック関数 getPostTitle()
{
If ($this->_postTitle === null && $this->post !== null)
{
$this->postTitle = $this->post->title;
}
$this->_postTitle;
を返す
}
パブリック関数 setPostTitle($value)
{
$this->_postTitle = $value;
}
次に、この属性をルール関数に追加します:
コードをコピーします コードは次のとおりです:パブリック関数ルール()
{
// 注: ルールは、次の属性に対してのみ定義する必要があります
// ユーザー入力を受け取ります。
配列を返します(
array('コンテンツ, 著者, メールアドレス', '必須'),
array('作成者, メールアドレス, URL', '長さ', '最大'=>128),
array('電子メール','電子メール'),
配列('url','url')
array('content, postTitle, status, author', 'safe', 'on'=>'search'),
);
}
これだけでは不十分です。最も変更する必要があるのは検索機能です。まず基準を追加する必要があります:
コードをコピーします コードは次のとおりです:
$criteria=new CDbCriteria;
$criteria->with = "post" // 必ず post テーブルをクエリします
;
$criteria->compare('t.content',$this->content,true);
$criteria->compare('t.status',$this->status);
$criteria->compare('t.author',$this->author,true);
$criteria->compare('post.title', $this->postTitle,true);
次に並べ替えを追加します:
コードをコピーします コードは次のとおりです:
$sort = new CSort();
$sort->attributes = array(
'defaultOrder'=>'t.create_time DESC',
'コンテンツ'=>配列(
'asc'=>'t.content',
'desc'=>'t.content desc',
)、
'ステータス'=>配列(
'asc'=>'t.status',
'desc'=>'t.status desc',
)、
'著者'=>配列(
'asc'=>'t.author',
'desc'=>'t.author desc',
)、
'postTitle'=>array(
'asc'=>'post.title',
'desc'=>'post.title desc',
)、
);
完全な 'tablename'.'columnname' 構文を使用していることに気づいたかもしれませんが、これを行う理由は、mysql が 'column is曖昧なエラー' をスローするのを避けるためです。
これが適切に動作するためには、CSort インスタンスと CDbCriteria インスタンスを CActiveDataProvider に渡す必要があります:
コードをコピー コードは次のとおりです:
return new CActiveDataProvider('Comment', array(
)
'基準'=>$基準,
'並べ替え'=>$並べ替え
));
return new CActiveDataProvider('コメント', array(
)
'基準'=>$基準,
'並べ替え'=>$並べ替え
));
あとは、CGridView に表示したいプロパティが表示されるようにビューを変更するだけです。
コードをコピーします コードは次のとおりです:
'columns'=>array(
「コンテンツ」、
'投稿タイトル',
「ステータス」、
「著者」、
)、
更新すると、効果は以下のようになります:
この記事が、Yii フレームワークに基づいた PHP プログラムの設計に役立つことを願っています。
http://www.bkjia.com/PHPjc/920975.htmlwww.bkjia.comtruehttp://www.bkjia.com/PHPjc/920975.html技術記事 Yii、yiicgridviewにおけるCGridView関連テーブルの検索・ソート方法の詳細解説 この記事では、YiiにおけるCGridView関連テーブルの検索・ソート方法を例を用いて説明します。参考のためにみんなで共有してください。具体的な実装方法…