我遇到了问题:我无法对网格视图进行排序。
当我点击"产品名称":
在URL中我可以看到: index?sort = -product_name 但没有任何反应。我没有使用CRUD发电机。
的控制器
public function actionIndex()
{
$searchModel = new CompanyProductSearch();
$dataProvider = $searchModel->search(Yii::$app->request->queryParams);
return $this->render('index', [
'dataProvider' => $dataProvider,
'searchModel' => $searchModel,
]);
}
SearchModel
public $searchstring;
public function rules()
{
return [
[['date', 'product_name', 'searchstring'], 'safe'],
];
}
public function scenarios()
{
return Model::scenarios();
}
public function search($params)
{
$array = array();
$user = Yii::$app->user->identity;
$product_influencer = ProductInfluencer::find()->all();
foreach($product_influencer as $product){
$array[] .= $product->product_id;
}
$query = Product::find()->where(['company_id'=>$user->company_id])
->andWhere(['id'=>$array])
->andWhere(['is not', 'shop_price', null])
->andWhere(['is not', 'main_category_id', null])
->orderBy('date DESC');
$dataProvider = new ActiveDataProvider([
'query' => $query,
'pagination' => [
'pageSize' => 10
],
]);
$dataProvider->sort->attributes['product_name'] = [
'asc' => ['product_name' => SORT_ASC],
'desc' => ['product_name' => SORT_DESC],
];
$this->load($params);
if (!$this->validate()) {
return $dataProvider;
}
$query->andFilterWhere([
'product_name' => $this->product_name,
]);
$query->andFilterWhere(['like', 'product_name', $this->searchstring]);
return $dataProvider;
}
查看
<?php Pjax::begin(); ?>
<?= GridView::widget([
'summary'=>"",
'dataProvider' => $dataProvider,
'tableOptions' => [
'class' => 'table table-responsive',
'id' => 'sortable-table',
],
'pager' => [
'class' => 'common\widgets\CustomPager',
'prevPageLabel' => '<div style="border: none" class="glyphicon glyphicon-menu-left"></div>',
'nextPageLabel' => '<div style="border: none" class="glyphicon glyphicon-menu-right"></div>',
'maxButtonCount' => 0,
],
'columns' => [
['class' => 'yii\grid\CheckboxColumn',],
[
'class' => 'yii\grid\SerialColumn',
'header' => 'Nr.',
],
[
'format' => 'raw',
'label' => 'Product name',
'attribute' => 'product_name',
'value' => function($model){
return Html::a($model->product_name, ['detail-product'], ['data' => [
'params'=>['id'=>$model->id],
'method' => 'get',
]]);
}
],
[
'label' => 'Total earnings',
'value' => function($model){
return '$ 950 (test)';
}
],
[
'label' => 'Units available',
'value' => function($model){
$units = \common\models\ProductInfo::findOne(['product_id'=>$model->id]);
return $units->shop_units;
}
],
],
]); ?>
<?php Pjax::end(); ?>
谢谢!
答案 0 :(得分:13)
这可能是因为您已经在查询中设置了排序。 dataprovider
无法覆盖此内容。您应该删除查询中的orderBy
子句。
通常我更喜欢在dataprovider中设置这样的排序,因为它更清楚地允许对哪些属性进行排序;
$dataProvider->setSort([
'attributes' => [
'product_name' => [
'asc' => ['product_name' => SORT_ASC],
'desc' => ['product_name' => SORT_DESC],
'default' => SORT_ASC
],
'date' => [
'asc' => ['date' => SORT_ASC],
'desc' => ['date' => SORT_DESC],
'default' => SORT_ASC,
],
],
'defaultOrder' => [
'date' => SORT_ASC
]
]);