Issues (46)

src/controllers/album/AlbumController.php (2 issues)

1
<?php
2
3
namespace Itstructure\MFUploader\controllers\album;
4
5
use Yii;
6
use yii\helpers\ArrayHelper;
7
use yii\data\Pagination;
8
use yii\base\UnknownMethodException;
9
use yii\web\{Controller, BadRequestHttpException, NotFoundHttpException};
10
use yii\filters\{VerbFilter, AccessControl};
11
use Itstructure\MFUploader\Module;
12
use Itstructure\MFUploader\models\album\{Album, AlbumSearch};
13
use Itstructure\MFUploader\traits\MediaFilesTrait;
14
15
/**
16
 * AlbumController implements the CRUD actions for Album model.
17
 */
18
19
/**
20
 * AlbumController implements the CRUD actions for Album model.
21
 *
22
 * @property Album $model Model object record.
23
 * @property Module $module
24
 * @property string $urlPrefix Url prefix for redirect and view links.
25
 * @property string $urlPrefixNeighbor Url prefix for redirect and view links of neighbor entity.
26
 *
27
 * @package Itstructure\MFUploader\controllers\album
28
 *
29
 * @author Andrey Girnik <[email protected]>
30
 */
31
abstract class AlbumController extends Controller
32
{
33
    use MediaFilesTrait;
0 ignored issues
show
The trait Itstructure\MFUploader\traits\MediaFilesTrait requires some properties which are not provided by Itstructure\MFUploader\c...s\album\AlbumController: $mediafileId, $storage
Loading history...
34
35
    /**
36
     * Url prefix for redirect and view links.
37
     *
38
     * @var string
39
     */
40
    protected $urlPrefix = '';
41
42
    /**
43
     * Url prefix for redirect and view links of neighbor entity.
44
     *
45
     * @var string
46
     */
47
    protected $urlPrefixNeighbor = '';
48
49
    /**
50
     * Model object record.
51
     *
52
     * @var Album
53
     */
54
    private $model;
55
56
    /**
57
     * Returns the name of the base model.
58
     *
59
     * @return string
60
     */
61
    abstract protected function getModelName():string;
62
63
    /**
64
     * Returns the type of album.
65
     *
66
     * @return string
67
     */
68
    abstract protected function getAlbumType():string;
69
70
    /**
71
     * Initializer.
72
     */
73
    public function init()
74
    {
75
        $this->view->params['user'] = \Yii::$app->user->identity;
76
77
        $this->viewPath = '@'.Module::MODULE_NAME.'/views/albums';
78
79
        parent::init();
80
    }
81
82
    /**
83
     * @param \yii\base\Action $action
84
     *
85
     * @return bool
86
     */
87
    public function beforeAction($action)
88
    {
89
        $this->view->params['urlPrefix']         = $this->urlPrefix;
90
        $this->view->params['urlPrefixNeighbor'] = $this->urlPrefixNeighbor;
91
92
        return parent::beforeAction($action);
93
    }
94
95
    /**
96
     * {@inheritdoc}
97
     */
98
    public function behaviors()
99
    {
100
        return [
101
            'access' => [
102
                'class' => AccessControl::class,
103
                'rules' => [
104
                    [
105
                        'allow' => true,
106
                        'roles' => $this->module->accessRoles,
107
                    ],
108
                ],
109
            ],
110
            'verbs' => [
111
                'class' => VerbFilter::class,
112
                'actions' => [
113
                    'delete' => ['POST'],
114
                ],
115
            ],
116
        ];
117
    }
118
119
    /**
120
     * Set model.
121
     *
122
     * @param Album $model
123
     */
124
    public function setModel(Album $model): void
125
    {
126
        $this->model = $model;
127
    }
128
129
    /**
130
     * Returns model.
131
     *
132
     * @return Album
133
     */
134
    public function getModel(): Album
135
    {
136
        return $this->model;
137
    }
138
139
    /**
140
     * Give ability of configure view to the module class.
141
     *
142
     * @return \yii\base\View|\yii\web\View
143
     */
144
    public function getView()
145
    {
146
        if (method_exists($this->module, 'getView')) {
147
            return $this->module->getView();
148
        }
149
150
        return parent::getView();
151
    }
152
153
    /**
154
     * Lists all Album models.
155
     *
156
     * @return mixed
157
     */
158
    public function actionIndex()
159
    {
160
        $searchModel = new AlbumSearch();
161
        $searchParams = ArrayHelper::merge(Yii::$app->request->queryParams, [
162
            $searchModel->formName() => [
163
                'type' => $this->getAlbumType()
164
            ]
165
        ]);
166
        $dataProvider = $searchModel->search($searchParams);
167
168
        return $this->render('index', [
169
            'searchModel' => $searchModel,
170
            'dataProvider' => $dataProvider,
171
        ]);
172
    }
173
174
    /**
175
     * Displays a single Album model.
176
     *
177
     * @param integer $id
178
     *
179
     * @throws NotFoundHttpException if the model cannot be found
180
     *
181
     * @return mixed
182
     */
183
    public function actionView($id)
184
    {
185
        $model = $this->findModel($id);
186
187
        $mediafilesQuery = $model->getMediaFilesQuery($model->getFileType($model->type));
188
        $pages = new Pagination([
189
            'defaultPageSize' => 6,
190
            'totalCount' => $mediafilesQuery->count()
191
        ]);
192
193
        return $this->render('view', [
194
            'model' => $model,
195
            'mediafiles' => $mediafilesQuery->offset($pages->offset)
196
                ->limit($pages->limit)
197
                ->all(),
198
            'pages' => $pages,
199
        ]);
200
    }
201
202
    /**
203
     * Creates a new Album model.
204
     * If creation is successful, the browser will be redirected to the 'view' page.
205
     *
206
     * @return mixed
207
     */
208
    public function actionCreate()
209
    {
210
        $this->setModelByConditions();
211
212
        if ($this->model->load(Yii::$app->request->post()) && $this->model->save()) {
213
            return $this->redirect([
214
                $this->urlPrefix.'view',
215
                'id' => $this->model->id
216
            ]);
217
        }
218
219
        return $this->render('create', [
220
            'model' => $this->model,
221
            'albumType' => $this->getAlbumType(),
222
        ]);
223
    }
224
225
    /**
226
     * Updates an existing Album model.
227
     * If update is successful, the browser will be redirected to the 'view' page.
228
     *
229
     * @param integer $id
230
     *
231
     * @throws NotFoundHttpException if the model cannot be found
232
     *
233
     * @return mixed
234
     */
235
    public function actionUpdate($id)
236
    {
237
        $this->setModelByConditions($id);
238
239
        $post = Yii::$app->request->post();
240
        if ($this->model->load($post) && $this->model->save()) {
241
            if (isset($post['delete']) && is_array($post)) {
242
                $this->deleteMediafileEntry($post['delete'], $this->module);
243
            }
244
245
            return $this->redirect([
246
                $this->urlPrefix.'view',
247
                'id' => $this->model->id
248
            ]);
249
        }
250
251
        $mediafilesQuery = $this->model->getMediaFilesQuery($this->model->getFileType($this->model->type));
252
        $pages = new Pagination([
253
            'defaultPageSize' => 6,
254
            'totalCount' => $mediafilesQuery->count()
255
        ]);
256
257
        return $this->render('update', [
258
            'model' => $this->model,
259
            'mediafiles' => $mediafilesQuery->offset($pages->offset)
260
                ->limit($pages->limit)
261
                ->all(),
262
            'pages' => $pages,
263
            'albumType' => $this->model->type,
264
            'ownerParams' => [
265
                'owner' => $this->model->type,
266
                'ownerId' => $this->model->primaryKey,
267
            ]
268
        ]);
269
    }
270
271
    /**
272
     * Deletes an existing Album model.
273
     * If deletion is successful, the browser will be redirected to the 'index' page.
274
     *
275
     * @param integer $id
276
     *
277
     * @throws NotFoundHttpException if the model cannot be found
278
     * @throws BadRequestHttpException
279
     *
280
     * @return mixed
281
     */
282
    public function actionDelete($id)
283
    {
284
        $model = $this->findModel($id);
285
286
        $this->deleteMediafiles($model->type, $model->id, $this->module);
287
288
        if (false !== $model->delete()) {
289
            return $this->redirect([$this->urlPrefix.'index']);
290
        }
291
292
        throw new BadRequestHttpException('Record is not deleted.');
293
    }
294
295
    /**
296
     * Finds the Album model based on its primary key value.
297
     *
298
     * @param $key
299
     *
300
     * @throws BadRequestHttpException
301
     * @throws NotFoundHttpException
302
     *
303
     * @return Album
304
     */
305
    protected function findModel($key): Album
306
    {
307
        if (null === $key) {
308
            throw new BadRequestHttpException('Key parameter is not defined in findModel method.');
309
        }
310
311
        $modelObject = $this->getNewModel();
312
313
        if (!method_exists($modelObject, 'findOne')) {
314
            $class = (new\ReflectionClass($modelObject));
0 ignored issues
show
The function ReflectionClass was not found. Maybe you did not declare it correctly or list all dependencies? ( Ignorable by Annotation )

If this is a false-positive, you can also ignore this issue in your code via the ignore-call  annotation

314
            $class = (/** @scrutinizer ignore-call */ new\ReflectionClass($modelObject));
Loading history...
315
            throw new UnknownMethodException('Method findOne does not exists in ' . $class->getNamespaceName() . '\\' .
316
                $class->getShortName().' class.');
317
        }
318
319
        $result = call_user_func([
320
            $modelObject,
321
            'findOne',
322
        ], $key);
323
324
        if ($result !== null) {
325
            return $result;
326
        }
327
328
        throw new NotFoundHttpException('The requested page does not exist.');
329
    }
330
331
    /**
332
     * Returns new object of main Album model.
333
     *
334
     * @return Album
335
     */
336
    protected function getNewModel(): Album
337
    {
338
        $modelName = $this->getModelName();
339
        return new $modelName;
340
    }
341
342
    /**
343
     * Returns an intermediate model for working with the main.
344
     *
345
     * @param int|string|null $key
346
     *
347
     * @return void
348
     */
349
    protected function setModelByConditions($key = null): void
350
    {
351
        $model = null === $key ? $this->getNewModel() : $this->findModel($key);
352
353
        $this->setModel($model);
354
    }
355
}
356