問題があります:グリッドビューを並べ替えることができません。
「製品名」をクリックすると: 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(); ?>
ありがとう!
クエリで並べ替えをすでに設定していることが原因である可能性があります。 dataprovider
はこれを上書きできません。クエリのorderBy
句を削除する必要があります。
通常、データプロバイダーでこのように並べ替えを設定することを好みます。これにより、並べ替えが許可されている属性が明確になります。
$dataProvider->setSort([
'attributes' => [you
'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
]
]);