OSDN Git Service

Откорректированы сообщения и их перевод
[invent/invent.git] / controllers / LocationsController.php
1 <?php
2
3 namespace app\controllers;
4
5 use Yii;
6 use app\models\Locations;
7 use app\models\LocationsSearch;
8 use yii\web\Controller;
9 use yii\web\NotFoundHttpException;
10 use yii\filters\VerbFilter;
11 use app\models\User;
12
13 /**
14  * LocationsController implements the CRUD actions for Locations model.
15  */
16 class LocationsController extends Controller
17 {
18     /**
19      * {@inheritdoc}
20      */
21     public function behaviors()
22     {
23         return [
24             'verbs' => [
25                 'class'   => VerbFilter::className(),
26                 'actions' => [
27                     'delete' => [ 'POST' ],
28                 ],
29             ],
30         ];
31     }
32
33     /**
34      * Добавление места разположения
35      *
36      * @param array $options
37      *        string 'name'    - наименование места расположения
38      *        string|NULL  'region'    - наименование региона/подразделения
39      *        integer|NULL 'region_id' - идентификатор региона/подразделения
40      * @return integer|boolean - идентификатор записи места расположения или FALSE
41      */
42     public static function addIfNeed($options)
43     {
44         $result = [
45             'id'    => FALSE,
46             'error' => Yii::t('locations', 'Locations: Key field missing "location" and "region": ') . print_r($options, TRUE),
47         ];
48         if (is_array($options) && isset($options[ 'location' ]) && (isset($options[ 'region' ]) || isset($options[ 'region_id' ])))
49         {
50             if (isset($options[ 'region' ]))
51             {
52                 $region = RegionsController::addIfNeed($options);
53             }
54             else
55             {
56                 $region[ 'id' ] = $options[ 'region_id' ];
57             }
58             if ($region[ 'id' ] !== FALSE) {
59                 // Ищем расположение, совпадающее по наименованию и региону/подразделению
60                 $model = Locations::find()
61                     ->where([ 'like', 'name', $options[ 'location' ]])
62                     ->andWhere([ 'region_id' => $region[ 'id' ]])
63                     ->all();
64                 if (count($model) > 0)
65                 {
66                     // Если нашли, возвращаем идентификатор записи
67                     $result[ 'id' ] = $model[0]->id;
68                     $result[ 'error' ] = '';
69                 }
70                 else
71                 {
72                     // Не нашли, пробуем добавить место расположения
73                     $model = new Locations();
74                     $model->name = $options[ 'location' ];
75                     $model->region_id = $region[ 'id' ];
76                     if($model->validate() && $model->save())
77                     {
78                         // Если удалось сохранить, вернём идентификатор места расположения
79                         $result[ 'id' ] = $model->id;
80                         $result[ 'error' ] = '';
81                     }
82                     else
83                     {
84                         $result[ 'error' ] = Yii::t('locations', 'Error to create location "{location}": ', $options) . print_r($model->errors, TRUE);
85                     }
86                 }
87             }
88             else
89             {
90                 $result[ 'error' ] .= '<br />' . $region[ 'error' ];
91             }
92         }
93         return $result; // Записать не удалось, вернём FALSE
94     }
95
96     /**
97      * Список всех мест/размещений.
98      * @return mixed
99      */
100     public function actionIndex()
101     {
102         if (! User::canPermission('createRecord'))
103         {
104             return $this->redirect(['site/index']);
105         }
106
107         $searchModel = new LocationsSearch();
108         if (isset(Yii::$app->request->queryParams['id'])) {
109             $id = Yii::$app->request->queryParams['id'];
110             $dataProvider = $searchModel->search(Yii::$app->request->queryParams);
111             //$dataProvider->query->select([Locations::tableName() . '.id', Locations::tableName() . '.name']);
112             $pageSize = $dataProvider->pagination->pageSize;
113             $dataProvider->pagination = FALSE;
114             $rows = $dataProvider->getModels();
115             $page = 0;
116             foreach ($rows as $key => $val) {
117                 if ($id == $val->id) {
118                     $page = ceil(($key + 1) / $pageSize);
119                     break;
120                 }
121             }
122             return $this->redirect(['index', 'page' => $page]);
123         }
124         $dataProvider = $searchModel->search(Yii::$app->request->queryParams);
125
126         return $this->render('index', [
127             'searchModel'  => $searchModel,
128             'dataProvider' => $dataProvider,
129         ]);
130     }
131
132     /**
133      * Показ одного места размещения (не используется).
134      * @param integer $id
135      * @return mixed
136      * @throws NotFoundHttpException если отсутствует место/размещение
137      */
138     public function actionView($id)
139     {
140         if (! User::canPermission('updateRecord'))
141         {
142             return $this->redirect(['index']);
143         }
144         return $this->render('view', [
145             'model' => $this->findModel($id),
146         ]);
147     }
148
149     /**
150      * Создание нового места/размещения.
151      * В случае успешного создания,  происходит переход к списку всех мест/размещений.
152      * @return mixed
153      */
154     public function actionCreate()
155     {
156         if (! User::canPermission('createRecord'))
157         {
158             return $this->redirect(['site/index']);
159         }
160         $model = new Locations();
161
162         if ($model->load(Yii::$app->request->post()) && $model->save())
163         {
164             return $this->redirect([ 'index', 'id' => $model->id ]);
165         }
166
167         return $this->render('create', [
168             'model' => $model,
169         ]);
170     }
171
172     /**
173      * Изменение существующего места/размещения.
174      * В случаае успешного изменения, происходит переход к списку всех мест/размещений.
175      * @param integer $id
176      * @return mixed
177      * @throws NotFoundHttpException если отсутствует место/размещение
178      */
179     public function actionUpdate($id)
180     {
181         if (! User::canPermission('updateRecord'))
182         {
183             return $this->redirect(['site/index']);
184         }
185         $model = $this->findModel($id);
186
187         if ($model->load(Yii::$app->request->post()) && $model->save())
188         {
189             return $this->redirect([ 'index', 'id' => $model->id ]);
190         }
191
192         return $this->render('update', [
193             'model' => $model,
194         ]);
195     }
196
197     /**
198      * Удаение существующего места/размещения.
199      * В случае успешного удаления, происходит переход к списку всех мест/размещений.
200      * @param integer $id
201      * @return mixed
202      * @throws NotFoundHttpException Усли отсутствует место/размещение
203      */
204     public function actionDelete($id)
205     {
206         if (! User::canPermission('updateRecord'))
207         {
208             return $this->redirect(['index']);
209         }
210         $this->findModel($id)->delete();
211
212         return $this->redirect([ 'index' ]);
213     }
214
215     /**
216      * Finds the Locations model based on its primary key value.
217      * If the model is not found, a 404 HTTP exception will be thrown.
218      * @param integer $id
219      * @return Locations the loaded model
220      * @throws NotFoundHttpException if the model cannot be found
221      */
222     protected function findModel($id)
223     {
224         if (($model = Locations::findOne($id)) !== null)
225         {
226             return $model;
227         }
228
229         throw new NotFoundHttpException(Yii::t('locations', 'The requested page does not exist.'));
230     }
231 }