Completed
Push — development ( c8f467...de45b7 )
by Andrij
10:53
created

application/modules/gallery/admin.php (1 issue)

Severity

Upgrade to new PHP Analysis Engine

These results are based on our legacy PHP analysis, consider migrating to our new PHP analysis engine instead. Learn more

1
<?php
2
3
if (!defined('BASEPATH')) {
4
    exit('No direct script access allowed');
5
}
6
7
/**
8
 * ImageCMS
9
 *
10
 * Gallery Module _Admin_
11
 */
12
//class Admin extends MY_Controller {
13
class Admin extends BaseAdminController
14
{
15
16
    // Gallery config
17
    public $conf = [
18
        'engine' => 'gd2', // Image library. Possible values: GD, GD2, ImageMagick, NetPBM
19
        'max_file_size' => 5, // Max file size for upload in Mb.
20
        'max_archive_size' => 50,
21
        'max_width' => 0, // Max image width.
22
        'max_height' => 0, // Max image height.
23
        'allowed_types' => 'gif|jpg|jpeg|png|zip', // Allowed image types.
24
        'allowed_archive_types' => 'zip',
25
        'upload_path' => './uploads/gallery/', // Image upload dir. With ending slash.
26
        'upload_url' => 'uploads/gallery/', // Image upload url. With ending slash.
27
        'cache_path' => './system/cache/',
28
        'quality' => '90%', // Image quality
29
        'thumb_width' => '100', // Thumb width. min. 20px; max 1000px;
30
        'thumb_height' => '100', // Thumb height min. 20px; max 1000px;
31
        'thumb_marker' => '', // Thumb suffix
32
        'thumbs_folder' => '_thumbs', // Thumbs folder name. ! Without ending slash.
33
        'prev_img_marker' => '_prev', // Preview image suffix
34
        'maintain_ratio' => TRUE, // Specifies whether to maintain the original aspect ratio when resizing.
35
        'maintain_ratio_prev' => TRUE, // Specifies whether to maintain the original aspect ratio when resizing prev image.
36
        'maintain_ratio_icon' => TRUE, // Specifies whether to maintain the original aspect ratio when resizing icon.
37
        'crop' => TRUE, // Specifies whether to crop image for save the original aspect ratio when resizing.
38
        'crop_prev' => TRUE, // Specifies whether to crop image for save the original aspect ratio when resizing prev image.
39
        'crop_icon' => TRUE, // Specifies whether to crop image for save the original aspect ratio when resizing icon.
40
        'prev_img_width' => '500', // Preview image width
41
        'prev_img_height' => '375', // Preview image height
42
        // Watermark params
43
        'watermark_text' => '', // Watermark text.
44
        'watermark_image' => '', // Path to watermark image.
45
        'watermark_image_opacity' => '', // Watermark image opacity.
46
        'watermark_type' => 'overlay', // Watermark type. Possible values: text/overlay.
47
        'wm_vrt_alignment' => 'bottom', // Watermark vertical position. Possible values: top, middle, bottom.
48
        'wm_hor_alignment' => 'right', // Watermark horizontal position. Possible values: left, center, right.
49
        'watermark_font_path' => './system/fonts/1.ttf', // Path to watermark font.
50
        'watermark_font_size' => 16, // Watermark font size.
51
        'watermark_padding' => '-5', // Watermark padding.
52
        'watermark_color' => 'ffffff', // Watermark font color.
53
        'watermark_min_width' => '10', // Min. image width to draw watermark.
54
        'watermark_min_height' => '10', // Min. image height to draw watermark.
55
        // Albums
56
        'order_by' => 'date', // Albums order. Posiible values: date/name/position.
57
        'sort_order' => 'desc'          // Sort order. Possible values: desc/asc.
58
    ];
59
60
    protected $lastnewid;
61
62
    public function __construct() {
63
        parent::__construct();
64
        $lang = new MY_Lang();
65
        $lang->load('gallery');
66
67
        if ($this->dx_auth->is_admin() == FALSE) {
68
            exit;
69
        }
70
71
        $this->lang->load('gallery');
72
73
        $this->load->model('gallery_m');
74
        $this->init_settings();
75
76
        $this->test_uploads_folder($this->conf['upload_path']);
77
        $this->load->helper('file');
78
        $this->load->helper('gallery');
79
    }
80
81
    /**
82
     * Test if gallery upload folder exists.
83
     */
84
    private function test_uploads_folder($path) {
85
        if (!file_exists($path)) {
86
            @mkdir($path);
87
            @chmod($path, 0777);
88
        }
89
90
        if (!is_really_writable($this->conf['upload_path']) OR !file_exists($this->conf['upload_path'])) {
91
92
            \CMSFactory\assetManager::create()
93
                ->setData(
94
                    [
95
                        'error' => lang('Create a directory to continue your work with the gallery', 'gallery') . $this->conf['upload_path'] . lang('Set the write access', 'gallery')
96
                    ]
97
                )
98
                ->renderAdmin('error');
99
            exit;
100
        }
101
    }
102
103
    /**
104
     * Load gallery settings
105
     */
106
    private function init_settings() {
107
        $settings = $this->gallery_m->load_settings();
108
109
        foreach ($settings as $k => $v) {
110
            $this->conf[$k] = $v;
111
        }
112
113
        return TRUE;
114
    }
115
116
    /**
117
     * Display categories list
118
     */
119
    public function index() {
120
121
        $categories = $this->gallery_m->get_categories('position', 'asc');
122
123
        \CMSFactory\assetManager::create()
124
            ->setData(
125
                [
126
                    'categories' => $categories,
127
                ]
128
            )
129
            ->renderAdmin('categories');
130
    }
131
132
    /**
133
     * Display category albums
134
     */
135
    public function category($id) {
136
        $albums = $this->gallery_m->get_albums('position', 'asc', $id);
137
138
        if ($albums != FALSE) {
139
            $cnt = count($albums);
140
141
            for ($i = 0; $i < $cnt; $i++) {
142
                // Create url to album cover
143
                $albums[$i]['cover_url'] = media_url($upload_url . $albums[$i]['id'] . '/' . $albums[$i]['cover_name'] . $albums[$i]['cover_ext']);
144
145
                $upload_url = $this->conf['upload_url'];
146
147
                if ($albums[$i]['cover_name'] == NULL) {
148
                    $image = $this->gallery_m->get_last_image($albums[$i]['id']);
149
150
                    if ($image != FALSE) {
151
                        $albums[$i]['cover_url'] = media_url($upload_url . $albums[$i]['id'] . '/' . $image['file_name'] . $image['file_ext']);
152
                    } else {
153
                        $albums[$i]['cover_url'] = 'empty';
154
                    }
155
                } else {
156
                    $albums[$i]['cover_url'] = media_url($upload_url . $albums[$i]['id'] . '/' . $albums[$i]['cover_name'] . $albums[$i]['cover_ext']);
157
                }
158
            }
159
160
            $this->template->add_array([]);
161
        }
162
163
        \CMSFactory\assetManager::create()
164
            ->setData(
165
                [
166
                    'albums' => $albums,
167
                    'category' => $this->gallery_m->get_category($id)
168
                ]
169
            )
170
            ->renderAdmin('album_list');
171
    }
172
173
    /**
174
     * Display settings.tpl and update seetings.
175
     */
176
    public function settings($action = 'show') {
177
178
        switch ($action) {
179
            case 'show':
180
                \CMSFactory\assetManager::create()
181
                    ->setData(
182
                        [
183
                            'settings' => $this->gallery_m->load_settings()
184
                        ]
185
                    )
186
                    ->renderAdmin('settings');
187
                break;
188
189
            case 'update':
190
191
                $this->load->library('Form_validation');
192
                $val = $this->form_validation;
193
194
                $val->set_rules('max_image_size', lang('File size', 'gallery'), 'required|is_natural');
195
                $val->set_rules('max_width', lang('Maximum width', 'gallery'), 'required|is_natural');
196
                $val->set_rules('max_height', lang('Maximum height', 'gallery'), 'required|is_natural');
197
                $val->set_rules('quality', lang('Quality', 'gallery'), 'required|is_natural');
198
                $val->set_rules('prev_img_width', lang('Pre-image width', 'gallery'), 'required|is_natural');
199
                $val->set_rules('prev_img_height', lang('pre-image height', 'gallery'), 'required|is_natural');
200
                $val->set_rules('thumb_width', lang('Icon width', 'gallery'), 'required|is_natural');
201
                $val->set_rules('thumb_height', lang('Icon height', 'gallery'), 'required|is_natural');
202
                $val->set_rules('watermark_text', lang('Watermark text', 'gallery'), 'max_length[100]');
203
                $val->set_rules('watermark_font_size', lang('Font size', 'gallery'), 'required|is_natural');
204
                $val->set_rules('watermark_image_opacity', lang('Transparency', 'gallery'), 'required|is_natural|min_length[1]|max_length[3]');
205
206
                if ($this->form_validation->run($this) == FALSE) {
207
                    showMessage(validation_errors(), false, 'r');
208
                    break;
209
                }
210
211
                // Check if watermark image exists.
212
                if ($this->input->post('watermark_type') == 'overlay' && !file_exists('./uploads/' . $this->input->post('watermark_image')) && !file_exists($this->input->post('watermark_image'))) {
213
                    showMessage(lang('Specify the correct path to watermark image', 'gallery'), false, 'r');
214
                    break;
215
                }
216
217
                if (file_exists('./uploads/' . $this->input->post('watermark_image'))) {
218
                    $imagePath = './uploads/' . trim($this->input->post('watermark_image'));
219
                } elseif (file_exists($this->input->post('watermark_image'))) {
220
                    $imagePath = trim($this->input->post('watermark_image'));
221
                }
222
223
                // Check if watermark font exists.
224
                $params = [
225
                    'max_image_size' => $this->input->post('max_image_size'),
226
                    'max_width' => $this->input->post('max_width'),
227
                    'max_height' => $this->input->post('max_height'),
228
                    'quality' => $this->input->post('quality'),
229
                    'maintain_ratio' => (bool) $this->input->post('maintain_ratio'),
230
                    'maintain_ratio_prev' => (bool) $this->input->post('maintain_ratio_prev'),
231
                    'maintain_ratio_icon' => (bool) $this->input->post('maintain_ratio_icon'),
232
                    'crop' => (bool) $this->input->post('crop'),
233
                    'crop_prev' => (bool) $this->input->post('crop_prev'),
234
                    'crop_icon' => (bool) $this->input->post('crop_icon'),
235
                    'prev_img_width' => $this->input->post('prev_img_width'),
236
                    'prev_img_height' => $this->input->post('prev_img_height'),
237
                    'thumb_width' => $this->input->post('thumb_width'),
238
                    'thumb_height' => $this->input->post('thumb_height'),
239
                    // watermark settings
240
                    'watermark_text' => trim($this->input->post('watermark_text')),
241
                    'wm_vrt_alignment' => $this->input->post('wm_vrt_alignment'),
242
                    'wm_hor_alignment' => $this->input->post('wm_hor_alignment'),
243
                    'watermark_font_size' => trim($this->input->post('watermark_font_size')),
244
                    'watermark_color' => trim($this->input->post('watermark_color')),
245
                    'watermark_padding' => trim($this->input->post('watermark_padding')),
246
                    'watermark_image' => $imagePath,
247
                    'watermark_image_opacity' => trim($this->input->post('watermark_image_opacity')),
248
                    'watermark_type' => trim($this->input->post('watermark_type')),
249
                    'order_by' => $this->input->post('order_by'),
250
                    'sort_order' => $this->input->post('sort_order'),
251
                ];
252
                $uploadPath = './uploads/';
253
                $this->load->library(
254
                    'upload',
255
                    [
256
                        'upload_path' => $uploadPath,
257
                        'max_size' => 1024 * 1024 * 2, //2 Mb
258
                        //'allowed_types' => 'ttf|fnt|fon|otf'
259
                        'allowed_types' => '*'
260
                    ]
261
                );
262
                // saving font file, if specified
263
                if (isset($_FILES['watermark_font_path'])) {
264
                    $uploadPath = './uploads/';
265
                    // TODO: there are no mime-types for fonts in application/config/mimes.php
266
                    $allowedTypes = ['ttf', 'fnt', 'fon', 'otf'];
267
                    $ext = pathinfo($_FILES['watermark_font_path']['name'], PATHINFO_EXTENSION);
268
                    if (in_array($ext, $allowedTypes)) {
269 View Code Duplication
                        if (!$this->upload->do_upload('watermark_font_path')) {
270
                            $this->upload->display_errors('', '');
271
                        } else {
272
                            $udata = $this->upload->data();
273
                            // changing value in the DB
274
                            $params['watermark_font_path'] = $uploadPath . $udata['file_name'];
275
                        }
276
                    }
277
                } else {
278
                    $params['watermark_font_path'] = trim($this->input->post('watermark_font_path_tmp'));
279
                }
280
281
                $postData = $this->input->post();
282
                if ($postData['watermark']['delete_watermark_font_path'] == 1) {
283
                    $path = trim($this->input->post('watermark_font_path_tmp'));
284
                    if (file_exists($path) && !is_dir($path)) {
285
                        chmod($path, 0777);
286
                        unlink($path);
287
                    }
288
289
                    $params['watermark_font_path'] = '';
290
                }
291
292
                $this->db->where('name', 'gallery');
293
                $this->db->update('components', ['settings' => serialize($params)]);
294
295
                $this->lib_admin->log(lang('Gallery settings was edited', 'gallery'));
296
                showMessage(lang('Settings have been saved', 'gallery'));
297
298
                break;
299
        }
300
    }
301
302
    // --------------------------------------------------------------------
303
304
    /**
305
     * Create album
306
     */
307
    public function create_album() {
308
        $this->load->library('Form_validation');
309
310
        $this->form_validation->set_rules('name', lang('Name', 'gallery'), 'required|min_length[3]|max_length[250]');
311
        $this->form_validation->set_rules('email', lang('Description', 'gallery'), 'max_length[500]');
312
        $this->form_validation->set_rules('category_id', lang('Categories', 'gallery'), 'required');
313
314
        if ($this->form_validation->run($this) == FALSE) {
315
            showMessage(validation_errors(), false, 'r');
316
        } else {
317
            $album_id = $this->gallery_m->create_album();
318
319
            // Create album folder
320
            @mkdir($this->conf['upload_path'] . $album_id);
321
322
            chmod($this->conf['upload_path'] . $album_id, 0777);
323
324
            // Create thumbs folder
325
            @mkdir($this->conf['upload_path'] . $album_id . '/' . $this->conf['thumbs_folder']);
326
327
            // Create folder for admin thumbs
328
            @mkdir($this->conf['upload_path'] . $album_id . '/_admin_thumbs');
329
330
            $this->lib_admin->log(lang('Gallery album was created', 'gallery'));
331
            showMessage(lang('Album created', 'gallery'));
332
333
            $this->input->post('action') ? $action = $this->input->post('action') : $action = 'edit';
334
335
            if ($action == 'edit') {
336
                pjax(site_url('admin/components/cp/gallery/edit_album_params/' . $album_id));
337
            }
338
339
            if ($action == 'exit') {
340
                pjax('/admin/components/cp/gallery/category/' . $this->input->post('category_id'));
341
            }
342
        }
343
    }
344
345
    /**
346
     * Update album info
347
     */
348
    public function update_album($id, $locale) {
349
        $this->form_validation->set_rules('name', lang('Name', 'gallery'), 'required');
350
        $tpl_file = $this->input->post('tpl_file');
351
        if (!preg_match('/[a-z]/', $tpl_file) && !empty($tpl_file)) {
352
            showMessage('wrong tpl name', '', 'r');
353
            exit();
354
        }
355
        if ($this->form_validation->run() == false) {
356
            showMessage(validation_errors(), '', 'r');
357
            exit();
358
        } else {
359
            $this->lib_admin->log(lang('Gallery album was updated', 'gallery') . '. Id: ' . $id);
360
            showMessage(lang('Changes have been saved', 'gallery'));
361
        }
362
363
        $data = [
364
            'category_id' => (int) $this->input->post('cat_id'),
365
            // 'name' => $this->input->post('name'),
366
            // 'description' => trim($this->input->post('description')),
367
            'position' => (int) $this->input->post('position'),
368
            'tpl_file' => $this->input->post('tpl_file')
369
        ];
370
371
        $this->gallery_m->update_album($id, $data);
372
373
        $data_locale = [
374
            'id' => $id,
375
            'locale' => $locale,
376
            'name' => $this->input->post('name'),
377
            'description' => trim($this->input->post('description')),
378
        ];
379
380 View Code Duplication
        if ($this->db->where('id', $id)->where('locale', $locale)->get('gallery_albums_i18n')->num_rows()) {
381
            $this->db->where('id', $id)->where('locale', $locale);
382
            $this->db->update('gallery_albums_i18n', $data_locale);
383
        } else {
384
            $this->db->insert('gallery_albums_i18n', $data_locale);
385
        }
386
387
        $album = $this->gallery_m->get_album($id);
388
389
        $this->input->post('action') ? $action = $this->input->post('action') : $action = 'edit';
390
391
        if ($action == 'edit') {
392
            pjax('/admin/components/cp/gallery/edit_album_params/' . $id . '/'. $locale);
393
        }
394
395
        if ($action == 'close') {
396
            pjax('/admin/components/cp/gallery/category/' . $album['category_id']);
397
        }
398
    }
399
400
    public function edit_album_params($id, $locale = null) {
401
        if (null === $locale) {
402
            $locale = $this->gallery_m->chose_locale();
403
        }
404
405
        $album = $this->gallery_m->get_album($id, true, false, false, $locale);
406
407
        if ($album != FALSE) {
408
            \CMSFactory\assetManager::create()
409
                ->setData(
410
                    [
411
                        'locale' => $locale,
412
                        'languages' => $this->db->get('languages')->result_array(),
413
                        'album' => $album,
414
                        'categories' => $this->gallery_m->get_categories($album['category_id']),
415
                    ]
416
                )
417
                ->renderAdmin('album_params');
418
        } else {
419
            show_error(lang("Can't load album information", 'gallery'));
420
        }
421
    }
422
423
    /**
424
     * Delete album
425
     */
426
    public function delete_album($id = FALSE, $category = NULL) {
427
        if ($id == FALSE) {
428
            $id = (int) $this->input->post('album_id');
429
        }
430
431
        $album = $this->gallery_m->get_album($id);
432
433
        if ($album != FALSE) {
434
            //            if ($folder != FALSE) {
435
            $this->load->helper('file');
436
437
            // delete images.
438
            delete_files($this->conf['upload_path'] . $album['id'], TRUE);
439
440
            // delete album dir.
441
            exec('rmdir ' . $this->conf['upload_path'] . $album['id']);
442
            //            rmdir($this->conf['upload_path'] . $album['id'], TRUE);
443
            //            }
444
            $this->gallery_m->delete_album($album['id']);
445
            $this->lib_admin->log(lang('Gallery album was removed', 'gallery') . '. Id: ' . $id);
446
            pjax('/admin/components/cp/gallery/category/' . $category);
447
            //            echo 'deleted';
448
            //            exit;
449
        } else {
450
            showMessage(lang("Can't load album information", 'gallery'));
451
        }
452
    }
453
454
    /**
455
     * Display create_album template
456
     */
457
    public function show_crate_album() {
458
        // Select only category id and name for selectbox
459
        // $this->db->select('id, name');
460
        $cats = $this->gallery_m->get_categories('position', 'asc');
461
        $selectCategory = $this->input->get('category_id');
462
463
        \CMSFactory\assetManager::create()
464
            ->setData(
465
                [
466
                    'categories' => $cats,
467
                    'selectCategory' => $selectCategory,
468
                ]
469
            )
470
            ->renderAdmin('create_album');
471
    }
472
473
    /**
474
     * Show edit album template
475
     */
476
    public function edit_album($id = 0) {
477
        $album = $this->gallery_m->get_album($id);
478
479
        \CMSFactory\assetManager::create()
480
            ->setData(
481
                [
482
                    'album' => $album,
483
                    'category' => $this->gallery_m->get_category($album['category_id']),
484
                    'album_url' => $this->conf['upload_url'] . $id
485
                ]
486
            )
487
            ->renderAdmin('edit_album');
488
    }
489
490
    // --------------------------------------------------------------------
491
492
    public function edit_image($id, $locale = null) {
493
        if ($locale === null) {
494
            $locale = $this->gallery_m->chose_locale();
495
        }
496
        $image = $this->gallery_m->get_image_info($id, $locale);
497
498
        if ($image != FALSE) {
499
            $album = $this->gallery_m->get_album($image['album_id'], FALSE);
500
501
            \CMSFactory\assetManager::create()
502
                ->setData(
503
                    [
504
                        'locale' => $locale,
505
                        'languages' => $this->db->get('languages')->result_array(),
506
                        'image' => $image,
507
                        'album' => $album,
508
                        'category' => $this->gallery_m->get_category($album['category_id']),
509
                        'album_url' => $this->conf['upload_url'] . $album['id']
510
                    ]
511
                )
512
                ->renderAdmin('edit_image');
513
        } else {
514
            show_error(lang("Can't load image information", 'gallery'));
515
        }
516
    }
517
518
    /**
519
     * Rename image
520
     */
521
    public function rename_image($id) {
522
        $image = $this->gallery_m->get_image_info($id);
523
524
        if ($image != FALSE) {
525
            $this->load->library('Form_validation');
526
527
            $this->form_validation->set_rules('new_name', lang('New name', 'gallery'), 'trim|required');
528
529
            if ($this->form_validation->run($this) == FALSE) {
530
                showMessage(validation_errors(), false, 'r');
531
            } else {
532
                $album = $this->gallery_m->get_album($image['album_id'], FALSE);
533
                $new_name = $this->input->post('new_name');
534
535
                $file_path = $this->conf['upload_path'] . $album['id'] . '/';
536
537
                // Rename original file
538
                rename($file_path . $image['file_name'] . $image['file_ext'], $file_path . $new_name . $image['file_ext']);
539
540
                // Rename preview file
541
                rename($file_path . $image['file_name'] . $this->conf['prev_img_marker'] . $image['file_ext'], $file_path . $new_name . $this->conf['prev_img_marker'] . $image['file_ext']);
542
543
                // Rename thumb
544
                rename($file_path . $this->conf['thumbs_folder'] . '/' . $image['file_name'] . $image['file_ext'], $file_path . $this->conf['thumbs_folder'] . '/' . $new_name . $image['file_ext']);
545
546
                // Rename admin thumb
547
                rename($file_path . '_admin_thumbs/' . $image['file_name'] . $image['file_ext'], $file_path . '_admin_thumbs/' . $new_name . $image['file_ext']);
548
549
                // Update file name in db
550
                $this->gallery_m->rename_image($id, $new_name);
551
552
                pjax('/admin/components/cp/gallery/edit_image/' . $image['id']);
553
                showMessage(lang('Changes have been saved', 'gallery'));
554
            }
555
        } else {
556
            showMessage(lang("Can't load image information", 'gallery'), false, 'r');
557
        }
558
    }
559
560
    /**
561
     * Delete image files
562
     */
563
    public function delete_image($ids = 0) {
564
        if ($this->input->post('id')) {
565
            $ids = $this->input->post('id');
566
        }
567
568
        foreach ($ids as $key => $id) {
569
            $image = $this->gallery_m->get_image_info($id);
570
            if ($image != FALSE) {
571
                $album = $this->gallery_m->get_album($image['album_id'], FALSE);
572
                $path = $this->conf['upload_path'] . $album['id'] . '/';
573
574
                // Delete image.
575
                //./uploads/gallery/13/53e96a8b7146a2976f6dd3e064de61db.jpeg
576
                unlink($path . $image['file_name'] . $image['file_ext']);
577
578
                // Delete thumb.
579
                //./uploads/gallery/13/_thumbs/53e96a8b7146a2976f6dd3e064de61db.jpeg
580
                unlink($path . $this->conf['thumbs_folder'] . '/' . $image['file_name'] . $image['file_ext']);
581
582
                // Delete preview file.
583
                unlink($path . $image['file_name'] . $this->conf['prev_img_marker'] . $image['file_ext']);
584
585
                // Delete admin thumb.
586
                unlink($path . '_admin_thumbs/' . $image['file_name'] . $image['file_ext']);
587
588
                // Delete image info.
589
                $this->gallery_m->delete_image($image['id']);
590
                $this->lib_admin->log(lang('Album image deleted.', 'gallery') . '. Id: ' . $image['id']);
591
                showMessage(lang('Photos removed', 'gallery'));
592
            }
593
        }
594
    }
595
596
    /**
597
     * Update image description/position
598
     */
599
    public function update_info($id, $locale = null) {
600
601
        if (null === $locale) {
602
            $locale = $this->gallery_m->chose_locale();
603
        }
604
        $image = $this->gallery_m->get_image_info($id);
605
606
        if ($image != FALSE) {
607
            $album = $this->gallery_m->get_album($image['album_id'], FALSE);
608
609
            $data = [
610
                'description' => trim($this->input->post('description')),
611
                'title' => trim($this->input->post('title')),
612
            ];
613
614
            $this->gallery_m->update_description($id, $data, $locale);
615
616
            $this->gallery_m->update_position($id, trim((int) $this->input->post('position')));
617
618
            if ($this->input->post('cover') == 1) {
619
                $this->gallery_m->set_album_cover($image['album_id'], $image['id']);
620
            } elseif ($this->input->post('cover') != 1 AND $album['cover_id'] == $image['id']) {
621
                $this->gallery_m->set_album_cover($image['album_id'], NULL);
622
            }
623
624
            //showMessage(lang('Changes are saved', 'gallery'));
625
626
            pjax('/admin/components/cp/gallery/edit_album/' . $image['album_id']);
627
        } else {
628
            showMessage(lang("Can't load image information", 'gallery'), false, 'r');
629
        }
630
    }
631
632 View Code Duplication
    public function update_positions() {
633
        $positions = $this->input->post('positions');
634
        foreach ($positions as $key => $value) {
635
            $this->db->where('id', (int) $value)->set('position', $key)->update('gallery_category');
636
        }
637
        showMessage(lang('Positions updated', 'gallery'));
638
    }
639
640 View Code Duplication
    public function update_album_positions() {
641
        $positions = $this->input->post('positions');
642
        foreach ($positions as $key => $value) {
643
            $this->db->where('id', (int) $value)->set('position', $key)->update('gallery_albums');
644
        }
645
        showMessage(lang('Positions updated', 'gallery'));
646
    }
647
648 View Code Duplication
    public function update_img_positions() {
649
        $positions = $this->input->post('positions');
650
        foreach ($positions as $key => $value) {
651
            $this->db->where('id', (int) $value)->set('position', $key)->update('gallery_images');
652
        }
653
        showMessage(lang('Positions updated', 'gallery'));
654
    }
655
656
    /**
657
     * Add uploaded image to album
658
     */
659
    private function add_image($album_id = 0, $file_data = []) {
660
        $this->load->helper('number');
661
662
        $size = $this->get_image_size($file_data['full_path']);
663
664
        $size = byte_format(filesize($file_data['full_path']));
665
666
        $size = str_replace(
667
            ['bytes', 'kilobyte_abbr', 'megabyte_abbr' , 'gigabyte_abbr' , 'terabyte_abbr'],
668
            ['B', 'kB','MB', 'GB', 'TB'],
0 ignored issues
show
Expected one space after the comma, 0 found
Loading history...
669
            $size
670
        );
671
672
        $image_info = [
673
            'album_id' => $album_id,
674
            'file_name' => $file_data['raw_name'],
675
            'file_ext' => $file_data['file_ext'],
676
            'file_size' => $size,
677
            'width' => $size['width'],
678
            'height' => $size['height'],
679
            'uploaded' => time(),
680
            'views' => 0
681
        ];
682
683
        $this->gallery_m->add_image($image_info);
684
    }
685
686
    /**
687
     * Get image width and height
688
     */
689
    private function get_image_size($file_path) {
690
        if (function_exists('getimagesize')) {
691
            $image = @getimagesize($file_path);
692
693
            $size = [
694
                'width' => $image[0],
695
                'height' => $image[1]
696
            ];
697
698
            return $size;
699
        }
700
701
        return FALSE;
702
    }
703
704
    // --------------------------------------------------------------------
705
    // Categories
706
    // --------------------------------------------------------------------
707
708
    public function show_create_category() {
709
        \CMSFactory\assetManager::create()->renderAdmin('create_category');
710
    }
711
712
    public function create_category() {
713
714
        $locale = $this->gallery_m->chose_locale();
715
716
        $this->load->library('Form_validation');
717
        $val = $this->form_validation;
718
719
        $val->set_rules('name', lang('Name', 'gallery'), 'trim|required|max_length[250]|min_length[1]');
720
        $val->set_rules('position', lang('Position', 'gallery'), 'numeric');
721
722
        if ($val->run() == FALSE) {
723
            showMessage(validation_errors(), false, 'r');
724
        } else {
725
            $data = [
726
                //'name' => $this->input->post('name'),
727
                //'description' => trim($this->input->post('description')),
728
                'position' => $this->input->post('position'),
729
                'created' => time(),
730
            ];
731
732
            $last_id = $this->gallery_m->create_category($data);
733
734
            $data_locale = [
735
                'id' => $last_id,
736
                'locale' => $locale,
737
                'name' => $this->input->post('name'),
738
                'description' => trim($this->input->post('description')),
739
            ];
740
741
            $this->db->insert('gallery_category_i18n', $data_locale);
742
743
            $this->lib_admin->log(lang('Gallery category was created', 'gallery'));
744
            //updateDiv('page', site_url('admin/components/cp/gallery'));
745
            //$this->input->post('action') ? $action = $this->input->post('action') : $action = 'edit';
746
747
            if ($this->input->post('action') == 'close') {
748
                pjax('/admin/components/cp/gallery/index');
749
            } else {
750
                pjax('/admin/components/cp/gallery/edit_category/' . $last_id);
751
            }
752
        }
753
    }
754
755
    public function edit_category($id, $locale = null) {
756
757
        if (null === $locale) {
758
            $locale = $this->gallery_m->chose_locale();
759
        }
760
        $category = $this->gallery_m->get_category($id, $locale);
761
762
        \CMSFactory\assetManager::create()
763
            ->setData(
764
                [
765
                    'category' => $category,
766
                    'locale' => $locale,
767
                    'languages' => $this->db->get('languages')->result_array()
768
                ]
769
            )
770
            ->renderAdmin('edit_category');
771
    }
772
773
    public function update_category($id, $locale) {
774
        $this->load->library('Form_validation');
775
        $val = $this->form_validation;
776
777
        $val->set_rules('name', lang('Name', 'gallery'), 'trim|required|max_length[250]|min_length[1]');
778
        $val->set_rules('position', lang('Position', 'gallery'), 'numeric');
779
780
        if ($val->run() == FALSE) {
781
            showMessage(validation_errors(), false, 'r');
782
        } else {
783
            $data = [
784
                'position' => $this->input->post('position')
785
            ];
786
787
            $this->gallery_m->update_category($data, $id);
788
789
            $data_locale = [
790
                'id' => $id,
791
                'locale' => $locale,
792
                'name' => $this->input->post('name'),
793
                'description' => trim($this->input->post('description')),
794
            ];
795
796 View Code Duplication
            if ($this->db->where('id', $id)->where('locale', $locale)->get('gallery_category_i18n')->num_rows()) {
797
                $this->db->where('id', $id)->where('locale', $locale);
798
                $this->db->update('gallery_category_i18n', $data_locale);
799
            } else {
800
                $this->db->insert('gallery_category_i18n', $data_locale);
801
            }
802
803
            $this->lib_admin->log(lang('Gallery category was edited', 'gallery') . '. Id: ' . $id);
804
            showMessage(lang('Changes have been saved', 'gallery'));
805
806
            //updateDiv('page', site_url('admin/components/cp/gallery'));
807
            $this->input->post('action') ? $action = $this->input->post('action') : $action = 'edit';
808
809
            if ($action == 'close') {
810
                pjax('/admin/components/cp/gallery/index');
811
            }
812
            if ($action == 'edit') {
813
                pjax('/admin/components/cp/gallery/edit_category/' . $id .'/' . $locale);
814
            }
815
        }
816
    }
817
818
    public function delete_category() {
819
        foreach ($this->input->post('id') as $id) {
820
821
            // Delete category albums
822
            $albums = $this->gallery_m->get_albums('date', 'desc', $id);
823
824
            if (count($albums) > 0) {
825
                foreach ($albums as $album) {
826
                    $this->delete_album($album['id']);
827
                }
828
            }
829
            $this->gallery_m->delete_category($id);
830
        }
831
        $this->lib_admin->log(lang('Gallery category was removed', 'gallery') . '. Ids: ' . implode(', ', $this->input->post('id')));
832
    }
833
834
    /**
835
     * In CI's class Upload not provided the input's files array (name='somefile[]')
836
     * So the structure of $_FILES must be
837
     * Array (
838
     *      [somefile] => Array (
839
     *            [name] => qwe.jpg
840
     *               ...
841
     *  ))
842
     * But in case of many file it is like this:
843
     * Array (
844
     *      [somefile] => Array (
845
     *            [name] => Array (
846
     *                  [0] => 'qwe.jpg',
847
     *                  [1] => 'asd.jpg',
848
     *                  ...
849
     *            )
850
     *               ...
851
     *  ))
852
     * There is a need to transform $_FILES like each file come from his own input
853
     *
854
     * @param string $field name of the input[name]
855
     */
856
    private function transform_FILES($field = 'userfile') {
857
        if (!array_key_exists($field, $_FILES)) {
858
            return FALSE;
859
        }
860
861
        $newFiles = [];
862
        $count = count($_FILES[$field]['name']);
863
        for ($i = 0; $i < $count; $i++) {
864
            $oneFileData = [];
865
            foreach ($_FILES[$field] as $assocKey => $fileDataArray) {
866
                $oneFileData[$assocKey] = $fileDataArray[$i];
867
            }
868
            $newFiles[$field . '_' . $i] = $oneFileData;
869
        }
870
        $_FILES = $newFiles;
871
        return TRUE;
872
    }
873
874
    /**
875
     * Upload image
876
     *
877
     * Upload image to album folder.
878
     *
879
     */
880
    public function upload_image($album_id = 0) {
881
        $temp_conf = $this->conf;
882
        if (is_array($_FILES['newPic'])) {
883
884
            if (count($_FILES['newPic']['name']) > ini_get('max_file_uploads')) {
885
                showMessage(langf('You can upload only |max_file_uploads| images at once', 'admin', ['max_file_uploads' => ini_get('max_file_uploads')]), lang('Error', 'admin'), 'r');
886
                exit;
887
            }
888
889
            // making transformation of $_FILES array for CodeIgniter's Upload class
890
            $this->transform_FILES('newPic');
891
892
            // configs for Upload
893
            $this->conf['upload_path'] = $this->conf['upload_path'] . $album_id;
894
            if (!is_dir($this->conf['upload_path'])) {
895
                mkdir($this->conf['upload_path']);
896
            }
897
            $config['upload_path'] = $this->conf['upload_path'];
898
899
            $config['allowed_types'] = $this->conf['allowed_types'];
900
            $config['max_size'] = 1024 * 1024 * $this->max_image_size;
901
            $config['encrypt_name'] = TRUE;
902
903
            // init Upload
904
            $this->load->library('upload', $config);
905
906
            // saving each file
907
            $data = [];
908
            $i = 0;
909
            foreach ($_FILES as $fieldName => $filesData) {
910
                if (!$this->upload->do_upload($fieldName)) {
911
                    $error = $filesData['name'] . ' - ' . $this->upload->display_errors('', '') . '<br /> ';
912
                    $data['error'] .= $error;
913
                } else {
914
                    $data[$i] = ['upload_data' => $this->upload->data()];
915
916
                    // Resize Image and create thumb
917
                    $this->resize_and_thumb($data[$i]['upload_data']);
918
                    $this->add_image($album_id, $data[$i]['upload_data']);
919
                }
920
                $buf = $this->conf['upload_path'];
921
                $this->conf = $temp_conf;
922
                $this->conf['upload_path'] = $buf;
923
                $i++;
924
            }
925
926
            if (isset($data['error'])) {
927
                showMessage($data['error'], '', 'r');
928
            } else {
929
                showMessage(lang('Upload success', 'gallery'));
930
                pjax('');
931
            }
932
        }
933
        $this->lib_admin->log(lang('Photos in gallery the album are saved', 'gallery'));
934
    }
935
936
    /**
937
     * Resize image and create thumb
938
     */
939
    private function resize_and_thumb($file = []) {
940
        $this->load->library('image_lib');
941
942
        // Resize image
943
        if ($this->conf['max_width'] > 0 AND $this->conf['max_height'] > 0) {
944
            if ($file['image_width'] > $this->conf['max_width'] OR $file['image_height'] > $this->conf['max_height']) {
945
                $config = [];
946
                $config['image_library'] = $this->conf['engine'];
947
                $config['source_image'] = $file['full_path'];
948
                $config['create_thumb'] = FALSE;
949
                $config['maintain_ratio'] = $this->conf['maintain_ratio'];
950
                $config['width'] = $this->conf['max_width'];
951
                $config['height'] = $this->conf['max_height'];
952
                $config['quality'] = $this->conf['quality'];
953
954 View Code Duplication
                if (($this->conf['maintain_ratio']) AND ($this->conf['crop'])) { // Уменьшаем изображение и обрезаем края
955
                    $size = $this->get_image_size($file['full_path']); // Получаем размеры сторон изображения
956
957
                    $size['width'] >= $size['height'] ? $config['master_dim'] = 'height' : $config['master_dim'] = 'width'; // Задаем master_dim
958
959
                    $this->image_lib->clear();
960
                    $this->image_lib->initialize($config);
961
                    $this->image_lib->resize();
962
963
                    $config['image_library'] = $this->conf['engine'];
964
                    $config['source_image'] = $file['full_path'];
965
                    $config['maintain_ratio'] = FALSE;
966
                    $config['width'] = $this->conf['max_width'];
967
                    $config['height'] = $this->conf['max_height'];
968
969
                    $this->image_lib->clear();
970
                    $this->image_lib->initialize($config);
971
                    $this->image_lib->crop();
972
                } else { // Только уменьшаем
973
                    $this->image_lib->clear();
974
                    $this->image_lib->initialize($config);
975
                    $this->image_lib->resize();
976
                }
977
            }
978
        }
979
        // Create image preview
980
        $config = [];
981
        $prev_img_name = $file['raw_name'] . '_prev' . $file['file_ext'];
982
983
        if ($file['image_width'] > $this->conf['prev_img_width'] OR $file['image_height'] > $this->conf['prev_img_height']) {
984
            $config['image_library'] = $this->conf['engine'];
985
            $config['source_image'] = $file['full_path'];
986
            $config['new_image'] = $prev_img_name;
987
            $config['create_thumb'] = FALSE;
988
            $config['maintain_ratio_prev'] = $this->conf['maintain_ratio_prev'];
989
            $config['width'] = $this->conf['prev_img_width'];
990
            $config['height'] = $this->conf['prev_img_height'];
991
            $config['quality'] = $this->conf['quality'];
992
993 View Code Duplication
            if (($this->conf['maintain_ratio_prev']) AND ($this->conf['crop_prev'])) { // Уменьшаем изображение и обрезаем края
994
                $size = $this->get_image_size($file['full_path']); // Получаем размеры сторон изображения
995
996
                $size['width'] >= $size['height'] ? $config['master_dim'] = 'height' : $config['master_dim'] = 'width'; // Задаем master_dim
997
998
                $this->image_lib->clear();
999
                $this->image_lib->initialize($config);
1000
                $this->image_lib->resize();
1001
1002
                $config['image_library'] = $this->conf['engine'];
1003
                $config['source_image'] = $prev_img_name;
1004
                $config['maintain_ratio'] = FALSE;
1005
                $config['width'] = $this->conf['prev_img_width'];
1006
                $config['height'] = $this->conf['prev_img_height'];
1007
1008
                $this->image_lib->clear();
1009
                $this->image_lib->initialize($config);
1010
                $this->image_lib->crop();
1011
            } else { // Только уменьшаем
1012
                $this->image_lib->clear();
1013
                $this->image_lib->initialize($config);
1014
                $this->image_lib->resize();
1015
            }
1016
        } else {
1017
            $this->load->helper('File');
1018
            $file_data = read_file($file['full_path']);
1019
            write_file($file['file_path'] . $prev_img_name, $file_data);
1020
        }
1021
1022
        // Create thumb file
1023
        $config = [];
1024
        $thumb_name = $this->conf['upload_path'] . '/' . $this->conf['thumbs_folder'] . '/' . $file['raw_name'] . $this->conf['thumb_marker'] . $file['file_ext'];
1025
1026
        if ($file['image_width'] > $this->conf['thumb_width'] OR $file['image_height'] > $this->conf['thumb_height']) {
1027
            $config['image_library'] = $this->conf['engine'];
1028
            $config['source_image'] = $file['full_path'];
1029
            $config['new_image'] = $thumb_name;
1030
            $config['create_thumb'] = FALSE;
1031
            $config['maintain_ratio'] = $this->conf['maintain_ratio_icon'];
1032
            $config['width'] = $this->conf['thumb_width'];
1033
            $config['height'] = $this->conf['thumb_height'];
1034
            $config['quality'] = $this->conf['quality'];
1035
1036
            if (($this->conf['maintain_ratio_icon']) AND ($this->conf['crop_icon'])) { // Уменьшаем изображение и обрезаем края
1037
                $size = $this->get_image_size($file['full_path']); // Получаем размеры сторон изображения
1038
1039
                $size['width'] >= $size['height'] ? $config['master_dim'] = 'width' : $config['master_dim'] = 'height'; // Задаем master_dim
1040
1041
                $this->image_lib->clear();
1042
                $this->image_lib->initialize($config);
1043
                if (!$this->image_lib->resize()) {
1044
                    echo 'fck';
1045
                }
1046
1047
                $config['image_library'] = $this->conf['engine'];
1048
                $config['source_image'] = $thumb_name;
1049
                $config['maintain_ratio'] = FALSE;
1050
                $config['width'] = $this->conf['thumb_width'];
1051
                $config['height'] = $this->conf['thumb_height'];
1052
1053
                $this->image_lib->clear();
1054
                $this->image_lib->initialize($config);
1055
                $this->image_lib->crop();
1056
            } else { // Только уменьшаем
1057
                $this->image_lib->clear();
1058
                $this->image_lib->initialize($config);
1059
                if (!$this->image_lib->resize()) {
1060
                    echo $this->image_lib->display_errors();
1061
                }
1062
            }
1063 View Code Duplication
        } else {
1064
            // copy file to thumbs folder
1065
            $this->load->helper('File');
1066
            $file_data = read_file($file['full_path']);
1067
            write_file($thumb_name, $file_data);
1068
        }
1069
1070
        // Create admin thumb file
1071
        $config = [];
1072
        $thumb_name = $this->conf['upload_path'] . '/_admin_thumbs/' . $file['raw_name'] . $this->conf['thumb_marker'] . $file['file_ext'];
1073
1074
        if ($file['image_width'] > 100 OR $file['image_height'] > 100) {
1075
            $config['image_library'] = $this->conf['engine'];
1076
            $config['source_image'] = $file['full_path'];
1077
            $config['new_image'] = $thumb_name;
1078
            $config['create_thumb'] = FALSE;
1079
            $config['maintain_ratio'] = TRUE;
1080
            $config['width'] = 100;
1081
            $config['height'] = 100;
1082
            $config['quality'] = '80%';
1083
1084
            $this->image_lib->clear();
1085
            $this->image_lib->initialize($config);
1086
            $this->image_lib->resize();
1087 View Code Duplication
        } else {
1088
            $this->load->helper('File');
1089
            $file_data = read_file($file['full_path']);
1090
            write_file($thumb_name, $file_data);
1091
        }
1092
1093
        // Draw watermark.
1094
        if ($file['image_width'] > $this->conf['watermark_min_width'] AND $file['image_height'] > $this->conf['watermark_min_height']) {
1095
            $this->make_watermark($file['full_path']);
1096
            $this->make_watermark($file['file_path'] . $prev_img_name);
1097
        }
1098
1099
        return TRUE;
1100
    }
1101
1102
    /**
1103
     * Watermarking an Image if watermark_text is not empty
1104
     */
1105
    private function make_watermark($file_path) {
1106
        if (!$this->conf['watermark_font_path']) {
1107
            $this->conf['watermark_font_path'] = './uploads/defaultFont.ttf';
1108
        }
1109
1110
        $config = [];
1111
        $config['source_image'] = $file_path;
1112
        $config['wm_vrt_alignment'] = $this->conf['wm_vrt_alignment'];
1113
        $config['wm_hor_alignment'] = $this->conf['wm_hor_alignment'];
1114
        $config['wm_padding'] = $this->conf['watermark_padding'];
1115
1116
        if ($this->conf['watermark_type'] == 'overlay') {
1117
            $config['wm_type'] = 'overlay';
1118
            $config['wm_opacity'] = $this->conf['watermark_image_opacity'];
1119
            $config['wm_overlay_path'] = $this->conf['watermark_image'];
1120
        } else {
1121
            if ($this->conf['watermark_text'] == '') {
1122
                return FALSE;
1123
            }
1124
1125
            $config['wm_text'] = $this->conf['watermark_text'];
1126
            $config['wm_type'] = 'text';
1127
            $config['wm_font_path'] = $this->conf['watermark_font_path'];
1128
            $config['wm_font_size'] = $this->conf['watermark_font_size'];
1129
            $config['wm_font_color'] = $this->conf['watermark_color'];
1130
        }
1131
1132
        $this->image_lib->clear();
1133
        $this->image_lib->initialize($config);
1134
        $this->image_lib->watermark();
1135
    }
1136
1137
}
1138
1139
/* End of file admin.php */