Здравствуйте, я новичок в yii. Начал писать свой первый проект с минимальным ТЗ. Как и водится, в процессе ТЗ раздулось. В итоге получил четыре очень похожих метода:
"Индексный" метод
public function actionIndex(){
$sort = new Sort([
'attributes' => [
'number' => [
'asc' => ['number' => SORT_ASC],
'desc' => ['number' => SORT_DESC],
'default' => SORT_ASC,
'label' => 'По номеру',
],
'date' => [
'asc' => ['date' => SORT_ASC],
'desc' => ['date' => SORT_DESC],
'default' => SORT_ASC,
'label' => 'По дате',
],
],
]);
$stat = Yii::$app->request->get('stat');
if (!$stat){
$stat='0';
}
$session = Yii::$app->session;
$pageSize = Yii::$app->request->get('pagesize');
if($pageSize){
$session['pageSize'] = $pageSize;
}
$users = User::find()->all();
$query = Projects::find()->where(['status'=>$stat])->with(['materials','design','installing','building'])->orderBy($sort->orders);
$countQuery = clone $query;
$pages = new Pagination([
'totalCount'=>$countQuery->count(),
'pageSize'=>$session['pageSize'],
'forcePageParam'=>false,
'pageSizeParam'=>false,
'defaultPageSize'=>10]);
$status = $query->offset($pages->offset)
->limit($pages->limit)
->all();
return $this->render('index', [
'status' => $status,
'pages'=>$pages,
'users'=>$users,
'sort' => $sort
]);
}
Метод для поиска:
public function actionSearch(){
$sort = new Sort([
'attributes' => [
'number' => [
'asc' => ['number' => SORT_ASC],
'desc' => ['number' => SORT_DESC],
'default' => SORT_ASC,
'label' => 'По номеру',
],
'date' => [
'asc' => ['date' => SORT_ASC],
'desc' => ['date' => SORT_DESC],
'default' => SORT_ASC,
'label' => 'По дате',
],
],
]);
$stat = Yii::$app->request->get('stat');
if (!$stat){
$stat='0';
}
$session = Yii::$app->session;
$pageSize = Yii::$app->request->get('pagesize');
if($pageSize){
$session['pageSize'] = $pageSize;
}
$users = User::find()->all();
$search = Yii::$app->request->get('search');
$query = Projects::find()
->Where(['status'=>$stat])
->joinWith('materials')
->andWhere([
'or',
['like','materials.number',$search],
['like','materials.description',$search],
['like','projects.number',$search]
])
->with(['materials','design','installing','building'])
->distinct()
->orderBy($sort->orders);
/*$countQuery = clone $query;*/
$pages = new Pagination(['totalCount'=>$query->count(),'pageSize'=>$session['pageSize'],'forcePageParam'=>false,'pageSizeParam'=>false,'defaultPageSize'=>10]);
$status = $query->offset($pages->offset)
->limit($pages->limit)
->all();
return $this->render('index', [
'status' => $status,
'pages'=>$pages,
'users'=>$users,
'search'=>$search,
'sort'=>$sort
]);
}
Собственно, идеологию разделения методов по поиску черпнул из модуля CRUD. Но, во-первых, получилось очень много копипаста.
А во-вторых, есть проблема с вызовом этих методов из view.
Отсюда два вопроса:
1.
Как объединить эти методы?
2. В случае, если не объединять методы.
Для сортировки используется вот такая конструкция:
$sort = new Sort([
'attributes' => [
'number' => [
'asc' => ['number' => SORT_ASC],
'desc' => ['number' => SORT_DESC],
'default' => SORT_ASC,
'label' => 'По номеру',
],
'date' => [
'asc' => ['date' => SORT_ASC],
'desc' => ['date' => SORT_DESC],
'default' => SORT_ASC,
'label' => 'По дате',
],
],
]);
А во view всего-то достаточно
<?php echo $sort->link('number')?>
и эта ссылка будет работать для всех методов.
Как такую же конструкцию сделать для пагинации? Дело в том, что Pagination() не имеет в себе attributes.