注:
本次事例會使用到關聯表操作(文章類表ArticleCate.php、文章表Article.php)
][1]
一、模型配置
事例會用到三個models。文章類別表和文章表用gii生成下即可,最後一個是搜索驗證模型。其中,只講下一個聯表和搜索驗證。其他不用操作。
1.文章表關聯
<?php
//...other code
//關聯
public function getCate(){
return $this->hasOne(ArticleCate::className(),['id' => 'cid']);
}
?>
2.搜索模型
common/models/search/創建 ArticleSearch.php
<?php
namespace common\models\search;
use Yii;
use yii\base\Model;
use yii\data\ActiveDataProvider;
use common\models\Article;
class ArticleSearch extends Article
{
//public $cname;//文章類別名
/**
* @inheritdoc
*/
public function rules()
{
return [
[['cid','created_at', 'updated_at'], 'integer'],
[['id', 'desc','title','cover','content'], 'safe'],
];
}
/**
* @inheritdoc
*/
public function scenarios()
{
// bypass scenarios() implementation in the parent class
return Model::scenarios();
}
//搜索
public function search($params)
{
$query = Article::find();
// $query->joinWith(['cate']);//關聯文章類別表
// $query->joinWith(['author' => function($query) { $query->from(['author' => 'users']); }]);
$dataProvider = new ActiveDataProvider([
'query' => $query,
'pagination' => [
'pageSize' => 2,
],
]);
// 從參數的數據中加載過濾條件,並驗證
$this->load($params);
if (!$this->validate()) {
// uncomment the following line if you do not want to any records when validation fails
// $query->where('0=1');
return $dataProvider;
}
// 增加過濾條件來調整查詢對象
$query->andFilterWhere([
// 'cname' => $this->cate.cname,
'title' => $this->title,
]);
$query->andFilterWhere(['like', 'title', $this->title]);
//$query->andFilterWhere(['like', 'cate.cname', $this->cname]) ;
return $dataProvider;
}
}
二、分頁使用
方式一
首先在控制器的動作中,創建分頁對象並且爲其填充數據:
<?php
//other code
use yii\data\Pagination;
public function actionArticlelist()
{
//分頁讀取類別數據
$model = Article::find()->with('cate');
$pagination = new Pagination([
'defaultPageSize' => 3,
'totalCount' => $model->count(),
]);
$model = $model->orderBy('id ASC')
->offset($pagination->offset)
->limit($pagination->limit)
->all();
return $this->render('index', [
'model' => $model,
'pagination' => $pagination,
]);
}
?>
其次在視圖中我們輸出的模板爲當前頁並通過分頁對象鏈接到該頁:
<?php
use yii\widgets\LinkPager;
use yii\helpers\Html;
use yii\helpers\Url;
//other code
foreach ($models as $model) {
// 在這裏顯示 $model
}
// 顯示分頁
echo LinkPager::widget([
'pagination' => $pagination,
'firstPageLabel'=>"First",
'prevPageLabel'=>'Prev',
'nextPageLabel'=>'Next',
'lastPageLabel'=>'Last',
]);
?>
方式二
控制器:
<?php
$query = Article::find()->with('cate');
$provider = new ActiveDataProvider([
'query' => $query,
'pagination' => [
'pageSize' => 3,
],
'sort' => [
'defaultOrder' => [
//'created_at' => SORT_DESC,
//'title' => SORT_ASC,
]
],
]);
return $this->render('index', [
'model' => $query,
'dataProvider' => $provider
]);
?>
視圖:
<?php
use yii\grid\GridView;
echo GridView::widget([
'dataProvider' => $dataProvider,
//每列都有搜索框 控制器傳過來$searchModel = new ArticleSearch();
//'filterModel' => $searchModel,
'layout'=> '{items}<div class="text-right tooltip-demo">{pager}</div>',
'pager'=>[
//'options'=>['class'=>'hidden']//關閉自帶分頁
'firstPageLabel'=>"First",
'prevPageLabel'=>'Prev',
'nextPageLabel'=>'Next',
'lastPageLabel'=>'Last',
],
'columns' => [
//['class' => 'yii\grid\SerialColumn'],//序列號從1開始
// 數據提供者中所含數據所定義的簡單的列
// 使用的是模型的列的數據
'id',
'username',
['label'=>'文章類別', /*'attribute' => 'cid',產生一個a標籤,點擊可排序*/ 'value' => 'cate.cname' ],
['label'=>'發佈日期','format' => ['date', 'php:Y-m-d'],'value' => 'created_at'],
// 更復雜的列數據
['label'=>'封面圖','format'=>'raw','value'=>function($m){
return Html::img($m->cover,['class' => 'img-circle','width' => 30]);
}],
[
'class' => 'yii\grid\DataColumn', //由於是默認類型,可以省略
'value' => function ($data) {
return $data->name;
// 如果是數組數據則爲 $data['name'] ,例如,使用
SqlDataProvider 的情形。
},
],
[
'class' => 'yii\grid\ActionColumn',
'header' => '操作',
'template' => '{delete} {update}',//只需要展示刪除和更新
/*'headerOptions' => ['width' => '80'],*/
'buttons' => [
'delete' => function($url, $model, $key){
return Html::a('<i class="glyphicon glyphicon-trash"></i> 刪除',
['artdel', 'id' => $key],
['class' => 'btn btn-default btn-xs',
'data' => ['confirm' => '你確定要刪除文章嗎?',]
]);
},
'update' => function($url, $model, $key){
return Html::a('<i class="fa fa-file"></i> 更新',
['artedit', 'id' => $key],
['class' => 'btn btn-default btn-xs']);
},
],
],
],
]);
?>
三、搜索帶分頁功能
-
創建搜索模型(前面己做)
-
控制傳入數據
-
視圖顯示控制器代碼:
<?php
public function actionIndex()
{
$searchModel = new ArticleSearch();
$dataProvider = $searchModel->search(Yii::$app->request->queryParams);
return $this->render('index', [
'searchModel' => $searchModel,
'dataProvider' => $dataProvider,
]);
}
?>
視圖:
<?php $form = ActiveForm::begin([
'action' => ['index'],
'method' => 'get',
'id' => 'cateadd-form',
'options' => ['class' => 'form-horizontal'],
]); ?>
<?= $form->field($searchModel, 'title',[
'options'=>['class'=>''],
'inputOptions' => ['placeholder' => '文章搜索','class' => 'input-sm form-control'],
])->label(false) ?>
<span class="input-group-btn">
<?= Html::submitButton('Go!', ['class' => 'btn btn-sm btn-primary']) ?>
</span>
<?php ActiveForm::end(); ?>
<?= GridView::widget([
'dataProvider' => $dataProvider,
'layout'=> '{items}<div class="text-right tooltip-demo">{pager}</div>',
'pager'=>[
//'options'=>['class'=>'hidden']//關閉自帶分頁
'firstPageLabel'=>"First",
'prevPageLabel'=>'Prev',
'nextPageLabel'=>'Next',
'lastPageLabel'=>'Last',
],
//這部分和上面的分頁是一樣的