Issues (1177)

Security Analysis    not enabled

This project does not seem to handle request data directly as such no vulnerable execution paths were found.

  Cross-Site Scripting
Cross-Site Scripting enables an attacker to inject code into the response of a web-request that is viewed by other users. It can for example be used to bypass access controls, or even to take over other users' accounts.
  File Exposure
File Exposure allows an attacker to gain access to local files that he should not be able to access. These files can for example include database credentials, or other configuration files.
  File Manipulation
File Manipulation enables an attacker to write custom data to files. This potentially leads to injection of arbitrary code on the server.
  Object Injection
Object Injection enables an attacker to inject an object into PHP code, and can lead to arbitrary code execution, file exposure, or file manipulation attacks.
  Code Injection
Code Injection enables an attacker to execute arbitrary code on the server.
  Response Splitting
Response Splitting can be used to send arbitrary responses.
  File Inclusion
File Inclusion enables an attacker to inject custom files into PHP's file loading mechanism, either explicitly passed to include, or for example via PHP's auto-loading mechanism.
  Command Injection
Command Injection enables an attacker to inject a shell command that is execute with the privileges of the web-server. This can be used to expose sensitive data, or gain access of your server.
  SQL Injection
SQL Injection enables an attacker to execute arbitrary SQL code on your database server gaining access to user data, or manipulating user data.
  XPath Injection
XPath Injection enables an attacker to modify the parts of XML document that are read. If that XML document is for example used for authentication, this can lead to further vulnerabilities similar to SQL Injection.
  LDAP Injection
LDAP Injection enables an attacker to inject LDAP statements potentially granting permission to run unauthorized queries, or modify content inside the LDAP tree.
  Header Injection
  Other Vulnerability
This category comprises other attack vectors such as manipulating the PHP runtime, loading custom extensions, freezing the runtime, or similar.
  Regex Injection
Regex Injection enables an attacker to execute arbitrary code in your PHP process.
  XML Injection
XML Injection enables an attacker to read files on your local filesystem including configuration files, or can be abused to freeze your web-server process.
  Variable Injection
Variable Injection enables an attacker to overwrite program variables with custom data, and can lead to further vulnerabilities.
Unfortunately, the security analysis is currently not available for your project. If you are a non-commercial open-source project, please contact support to gain access.

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

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
(defined('BASEPATH')) OR exit('No direct script access allowed');
4
5
use CMSFactory\assetManager;
6
use Propel\Runtime\ActiveQuery\Criteria;
7
use Propel\Runtime\Exception\PropelException;
8
9
/**
10
 * Image CMS
11
 * Sample Module Admin
12
 * @property Cms_admin $cms_admin
13
 */
14
class Admin extends BaseAdminController
15
{
16
17
    protected $perPage = 10;
18
19
    public function __construct() {
20
        parent::__construct();
21
22
        $lang = new MY_Lang();
23
        $lang->load('callbacks');
24
        $this->perPage = $this->input->cookie('per_page') ?: $this->perPage;
25
        assetManager::create()->setData(['ADMIN_URL' => site_url('/admin/components/run') . '/']);
26
    }
27
28
    /**
29
     * Callbacks list
30
     */
31
    public function index() {
32
        /** Callbacks Pagination */
33
        if ($this->input->get('per_page')) {
34
            $callbacksSession = [
35
                                 'callback_url' => '?per_page=' . $this->input->get('per_page'),
36
                                ];
37
            $this->session->set_userdata($callbacksSession);
38
        } else {
39
            $this->session->unset_userdata('callback_url');
40
        }
41
        $offset = $this->input->get('per_page');
42
        $model = SCallbacksQuery::create()
43
            ->joinSCallbackStatuses(null, 'left join')
44
            ->joinSCallbackThemes(null, 'left join');
45
46
        if ($this->input->get('filterID') > 0) {
47
            $model = $model->filterById((int) $this->input->get('filterID'));
48
        }
49
50 View Code Duplication
        if ($user_name = $this->input->get('user_name')) {
51
            $user_name = (false !== strpos($user_name, '%')) ? $user_name : '%' . $user_name . '%';
52
            $model->condition('name', 'SCallbacks.Name LIKE ?', $user_name);
53
            $model->where(['name'], Criteria::LOGICAL_OR);
54
        }
55
56 View Code Duplication
        if ($phone = $this->input->get('phone')) {
57
            $phone = (false !== strpos($phone, '%')) ? $phone : '%' . $phone . '%';
58
            $model->condition('phone', 'SCallbacks.Phone LIKE ?', $phone);
59
            $model->where(['phone'], Criteria::LOGICAL_OR);
60
        }
61
62
        if ($this->input->get('ThemeId')) {
63
            if ($this->input->get('ThemeId') > 0) {
64
                $model = $model->filterByThemeId((int) $this->input->get('ThemeId'));
65
            }
66
67
            if ($this->input->get('ThemeId') === 'without') {
68
                $model = $model->where('SCallbacks.ThemeId = ?', 0);
69
            }
70
        }
71
72
        if ($this->input->get('StatusId') > 0) {
73
            $model = $model->filterByStatusId((int) $this->input->get('StatusId'));
74
        }
75
76 View Code Duplication
        if ($this->input->get('created_from')) {
77
            $model = $model->where('FROM_UNIXTIME(SCallbacks.Date, \'%Y-%m-%d\') >= ?', date('Y-m-d', strtotime($this->input->get('created_from'))));
78
        }
79
80 View Code Duplication
        if ($this->input->get('created_to')) {
81
            $model = $model->where('FROM_UNIXTIME(SCallbacks.Date, \'%Y-%m-%d\') <= ?', date('Y-m-d', strtotime($this->input->get('created_to'))));
82
        }
83
84
        $model->orderById(Criteria::DESC);
85
86
        // Count total orders
87
        $totalCallbacks = $model->count();
88
89
        $model = $model
90
            ->limit($this->perPage)
91
            ->offset((int) $offset)
92
            ->find();
93
94
        $callbackStatuses = SCallbackStatusesQuery::create()->setComment(__METHOD__)->joinWithI18n(MY_Controller::defaultLocale(), Criteria::RIGHT_JOIN)
95
            ->where('SCallbackStatusesI18n.Locale = "' . MY_Controller::defaultLocale() . '"')
96
            ->orderBy('IsDefault', Criteria::DESC)
97
            ->orderById()
98
            ->find();
99
        $callbackThemes = SCallbackThemesQuery::create()->setComment(__METHOD__)->joinWithI18n(MY_Controller::defaultLocale(), Criteria::JOIN)->orderByPosition()->find();
100
101
        // Create pagination
102
        $pagination = $this->initPagination($totalCallbacks);
103
104
        assetManager::create()
105
            ->setData(compact('model', 'pagination', 'totalCallbacks', 'callbackStatuses', 'callbackThemes'))
106
            ->renderAdmin('list');
107
    }
108
109
    /**
110
     * Create or update callback
111
     *
112
     * @param int|null $callbackId
113
     * @throws PropelException
114
     */
115
    public function update($callbackId = null) {
116
        $model = SCallbacksQuery::create()->setComment(__METHOD__)->findPk((int) $callbackId);
117
118
        $paginationBrand = $this->session->userdata('callback_url');
119
        $paginationBrand = $paginationBrand ?: null;
120
121
        if ($model === null) {
122
            $this->error404(lang('Error', 'admin'));
123
        }
124
125
        if ($this->input->post()) {
126
            $this->form_validation->set_rules($model->rules());
127
128
            if ($this->form_validation->run($this) == FALSE) {
129
                showMessage(validation_errors(), lang('Error'), 'r');
130
            } else {
131
                $model->fromArray($this->input->post());
132
                if ($model->getStatusId() !== $this->input->post('StatusId')) {
133
                    $model->setUserId($this->dx_auth->get_user_id());
134
                }
135
                $model->save();
136
137
                $this->lib_admin->log(lang('Callback edited', 'callbacks') . '. Id: ' . $callbackId);
138
                showMessage(lang('Changes have been saved', 'callbacks'));
139
140
                if ($this->input->post('action') == 'close') {
141
                    $redirect_url = '/admin/components/run/callbacks'. $paginationBrand;
142
                }
143
144
                if ($this->input->post('action') == 'edit') {
145
                    $redirect_url = '/admin/components/run/callbacks/update/' . $model->getId();
146
                }
147
148
                pjax($redirect_url);
149
            }
150
        } else {
151
152
            $statuses = SCallbackStatusesQuery::create()
153
                ->joinWithI18n(MY_Controller::defaultLocale(), Criteria::LEFT_JOIN)
154
                ->orderByIsDefault(Criteria::DESC)
155
                ->orderById()
156
                ->find();
157
158
            $themes = SCallbackThemesQuery::create()
159
                ->joinWithI18n(MY_Controller::defaultLocale(), Criteria::LEFT_JOIN)
160
                ->orderByPosition()->orderById()
161
                ->find();
162
163
            assetManager::create()
164
                ->setData(compact('model', 'statuses', 'themes', 'paginationBrand'))
165
                ->renderAdmin('edit');
166
        }
167
    }
168
169
    /**
170
     * Display list of callback statuses
171
     *
172
     * @return void
173
     */
174 View Code Duplication
    public function statuses() {
175
        $locale = self::defaultLocale();
176
        $model = SCallbackStatusesQuery::create()
177
            ->joinWithI18n($locale, Criteria::JOIN)
178
            ->orderBy('IsDefault', Criteria::DESC)
179
            ->orderById(Criteria::ASC)
180
            ->find();
181
182
        assetManager::create()
183
            ->setData(compact('model', 'locale'))
184
            ->renderAdmin('status_list');
185
    }
186
187
    /**
188
     * Create new status
189
     *
190
     * @throws PropelException
191
     */
192
    public function createStatus() {
193
        $model = new SCallbackStatuses();
194
        $locale = self::defaultLocale();
195
196
        if ($this->input->post()) {
197
            $this->form_validation->set_rules($model->rules());
198
199
            if ($this->form_validation->run($this) == FALSE) {
200
                showMessage(validation_errors(), '', 'r');
201
            } else {
202
                $postData = $this->input->post();
203
                if (!$postData['IsDefault']) {
204
                    $postData['IsDefault'] = false;
205
                }
206
                $model->fromArray($postData);
207
                $model->save();
208
209
                $this->lib_admin->log(lang('Status callback created', 'callbacks') . '. Id: ' . $model->getId());
210
                showMessage(lang('Position created', 'callbacks'));
211
212
                if ($postData['action'] == 'new') {
213
                    $redirect_url = '/admin/components/run/callbacks/updateStatus/' . $model->getId();
214
                }
215
216
                if ($postData['action'] == 'exit') {
217
                    $redirect_url = '/admin/components/run/callbacks/statuses';
218
                }
219
220
                pjax($redirect_url);
221
            }
222
        } else {
223
            assetManager::create()
224
                ->setData(compact('model', 'locale'))
225
                ->renderAdmin('create_status');
226
        }
227
    }
228
229
    /**
230
     * Update new status
231
     *
232
     * @param int|null $statusId
233
     * @param null|string $locale
234
     * @throws PropelException
235
     */
236
    public function updateStatus($statusId = null, $locale = null) {
237
        $locale = $locale ?: self::defaultLocale();
238
239
        $model = SCallbackStatusesQuery::create()->setComment(__METHOD__)->findPk((int) $statusId);
240
241
        if ($model === null) {
242
            showMessage(lang('Such status does not exist', 'callbacks'), '404', 'r');
243
        }
244
245
        if ($this->input->post()) {
246
            $this->form_validation->set_rules($model->rules());
247
248
            if ($this->form_validation->run($this) == FALSE) {
249
                showMessage(validation_errors());
250
            } else {
251
                $postData = $this->input->post();
252
                if (!$postData['IsDefault']) {
253
                    unset($postData['IsDefault']);
254
                }
255
256
                $postData['Locale'] = $locale;
257
258
                $model->fromArray($postData);
259
                $model->save();
260
261
                $this->lib_admin->log(lang('Status callback edited', 'callbacks') . '. Id: ' . $statusId);
262
                showMessage(lang('Changes have been saved', 'callbacks'));
263
264
                if ($postData['action'] == 'close') {
265
                    $redirect_url = '/admin/components/run/callbacks/statuses';
266
                }
267
268 View Code Duplication
                if ($postData['action'] == 'edit') {
269
                    $redirect_url = '/admin/components/run/callbacks/updateStatus/' . $model->getId() . '/' . $locale;
270
271
                }
272
273
                pjax($redirect_url);
274
            }
275 View Code Duplication
        } else {
276
            $model->setLocale($locale);
277
            $languages = $this->cms_admin->get_langs(true);
278
            assetManager::create()->setData(compact('model', 'languages', 'locale'))
279
                ->renderAdmin('edit_status');
280
        }
281
    }
282
283
    public function setDefaultStatus() {
284
        if ($this->input->post('id') && is_numeric($this->input->post('id'))) {
285
            $model = SCallbackStatusesQuery::create()->setComment(__METHOD__)->findPk($this->input->post('id'));
286
            if ($model) {
287
                if ($model->getIsDefault() == FALSE) {
288
                    showMessage(lang('Default status was changed', 'callbacks'));
289
                }
290
                $model->setIsDefault(true);
291
                $model->save();
292
293
                $message = lang('Callback default status changed. New default status ID:', 'callbacks') . ' ' . $model->getId();
294
                $this->lib_admin->log($message);
295
            }
296
        }
297
    }
298
299 View Code Duplication
    public function changeStatus() {
300
        $callbackId = (int) $this->input->post('CallbackId');
301
        $statusId = (int) $this->input->post('StatusId');
302
303
        $model = SCallbacksQuery::create()
304
            ->findPk($callbackId);
305
306
        $newStatusId = SCallbackStatusesQuery::create()->setComment(__METHOD__)->joinWithI18n(MY_Controller::defaultLocale())->findOneById((int) $statusId);
307
308
        if ($newStatusId && $model) {
309
            $model->setStatusId($statusId);
310
            $model->setUserId($this->dx_auth->get_user_id());
311
            $model->save();
312
313
            $message = lang('Callback status changed to', 'callbacks') . ' ' . $newStatusId->getText() . '. '
314
                . lang('Id:', 'callbacks') . ' '
315
                . $callbackId;
316
            $this->lib_admin->log($message);
317
318
            showMessage(lang("Callback's status was changed", 'callbacks'));
319
            pjax('/admin/components/run/callbacks#callbacks_' . $this->input->post('StatusId'));
320
321
        }
322
    }
323
324
    public function reorderThemes() {
325
        $positions = $this->input->post('positions');
326
        if (count($positions) > 0) {
327
            foreach ($positions as $pos => $id) {
328
                SCallbackThemesQuery::create()
329
                    ->filterById($id)
330
                    ->update(['Position' => (int) $pos]);
331
            }
332
            showMessage(lang('Positions saved successfully', 'callbacks'));
333
        }
334
    }
335
336 View Code Duplication
    public function changeTheme() {
337
        $callbackId = (int) $this->input->post('CallbackId');
338
        $themeId = (int) $this->input->post('ThemeId');
339
340
        $model = SCallbacksQuery::create()
341
            ->findPk($callbackId);
342
343
        if ($model !== null) {
344
            $model->setThemeId($themeId);
345
            $model->setUserId($this->dx_auth->get_user_id());
346
            $model->save();
347
348
            $theme = SCallbackThemesI18nQuery::create()->setComment(__METHOD__)->filterById($themeId)->filterByLocale(MY_Controller::defaultLocale())->findOne();
349
350
            $message = lang('Callback theme changed to', 'callbacks') . ' ' . ($theme ? $theme->getText() : lang('Does not have', 'callbacks')) . '. '
351
                . lang('Id:', 'callbacks') . ' '
352
                . $callbackId;
353
            $this->lib_admin->log($message);
354
355
            showMessage(lang('Callback theme is changed', 'callbacks'));
356
        }
357
    }
358
359
    /**
360
     * Delete callback
361
     *
362
     * @return void
363
     * @throws PropelException
364
     */
365
    public function deleteCallback() {
366
        $id = $this->input->post('id');
367 View Code Duplication
        if (is_numeric($id)) {
368
            SCallbacksQuery::create()->setComment(__METHOD__)->findPk($id)->delete();
369
370
            $this->lib_admin->log(lang('Callback was removed', 'callbacks') . '. Id: ' . $id);
371
            showMessage(lang('Callback was removed', 'callbacks'));
372
        }
373
374 View Code Duplication
        if (is_array($id)) {
375
            SCallbacksQuery::create()->setComment(__METHOD__)->findBy('id', $id)->delete();
376
            $this->lib_admin->log(lang('Callback(s) was removed', 'callbacks') . '. Id: ' . implode(', ', $id));
377
            showMessage(lang('Callback(s) was removed', 'callbacks'));
378
        }
379
380
        pjax('/admin/components/run/callbacks');
381
    }
382
383
    /**
384
     * Delete status and related callbacks
385
     *
386
     * @return void
387
     */
388
    public function deleteStatus() {
389
        $id = (int) $this->input->post('id');
390
        $model = SCallbackStatusesQuery::create()->setComment(__METHOD__)->findPk($id);
391
        $mainStatId = $this->db->where('is_default', '1')->get('shop_callbacks_statuses')->row()->id;
392
393
        if ($model !== null) {
394
            if ($model->getIsDefault() == true) {
395
                showMessage(lang('Unable to remove default status', 'callbacks'), lang('Error', 'callbacks'), 'r');
396
                exit;
397
            }
398
            $this->db->where('status_id', $model->getId())
399
                ->update('shop_callbacks', ['status_id' => $mainStatId]);
400
401
            $model->delete();
402
            SCallbackStatusesI18nQuery::create()->setComment(__METHOD__)->findById($id)->delete();
403
404
            $this->lib_admin->log(lang('Status callback was removed', 'callbacks') . '. Id: ' . $id);
405
            showMessage(lang('Status was removed', 'callbacks'));
406
            pjax('/admin/components/run/callbacks/statuses');
407
        }
408
    }
409
410
    /**
411
     * Display list of callback themes
412
     *
413
     * @return void
414
     */
415 View Code Duplication
    public function themes() {
416
        $model = SCallbackThemesQuery::create()
417
            ->joinWithI18n(\MY_Controller::defaultLocale(), Criteria::JOIN)
418
            ->orderByPosition()
419
            ->orderById(Criteria::ASC)
420
            ->find();
421
        $locale = self::defaultLocale();
422
423
        assetManager::create()->setData(compact('model', 'locale'))->renderAdmin('themes_list');
424
    }
425
426
    public function createTheme() {
427
        $model = new SCallbackThemes;
428
429
        if ($this->input->post()) {
430
            $this->form_validation->set_rules($model->rules());
431
432
            if ($this->form_validation->run($this) == FALSE) {
433
                showMessage(validation_errors());
434
            } else {
435
                $postData = $this->input->post();
436
                $locale = array_key_exists('Locale', $postData) ? $postData['Locale'] : self::defaultLocale();
437
                $postData['Locale'] = $locale;
438
439
                $model->fromArray($postData);
440
                $model->save();
441
442
                $last_theme_id = $this->db->order_by('id', 'desc')->get('shop_orders')->row()->id;
443
                $this->lib_admin->log(lang('Topic callbacks created', 'callbacks') . '. Id: ' . $last_theme_id);
444
                showMessage(lang('Topic started', 'callbacks'));
445
446
                if ($postData['action'] == 'close') {
447
                    $redirect_url = '/admin/components/run/callbacks/themes';
448
                }
449
450
                if ($postData['action'] == 'edit') {
451
                    $redirect_url = '/admin/components/run/callbacks/updateTheme/' . $model->getId();
452
                }
453
454
                pjax($redirect_url);
455
            }
456
        } else {
457
            $locale = self::defaultLocale();
458
            assetManager::create()
459
                ->setData(compact('model', 'locale'))->renderAdmin('create_theme');
460
        }
461
    }
462
463
    /**
464
     * @param null|int $themeId
465
     * @param null|string $locale
466
     * @throws PropelException
467
     */
468
    public function updateTheme($themeId = null, $locale = null) {
469
        $locale = $locale ?: self::defaultLocale();
470
471
        $model = SCallbackThemesQuery::create()->setComment(__METHOD__)->findPk((int) $themeId);
472
473
        if (!$model) {
474
            $this->error404(lang('Error', 'callbacks'));
475
        }
476
477
        if ($this->input->post()) {
478
            $this->form_validation->set_rules($model->rules());
479
480
            if ($this->form_validation->run($this) == FALSE) {
481
                showMessage(validation_errors());
482
            } else {
483
                $postData = $this->input->post();
484
                $postData['Locale'] = $locale;
485
486
                $model->fromArray($postData);
487
                $model->save();
488
489
                $this->lib_admin->log(lang('Topic callbacks edited', 'callbacks') . '. Id: ' . $themeId);
490
                showMessage(lang('Changes have been saved', 'callbacks'));
491
492
                if ($postData['action'] == 'close') {
493
                    $redirect_url = '/admin/components/run/callbacks/themes';
494
                }
495
496 View Code Duplication
                if ($postData['action'] == 'edit') {
497
                    $redirect_url = '/admin/components/run/callbacks/updateTheme/' . $model->getId() . '/' . $locale;
498
                }
499
500
                pjax($redirect_url);
501
            }
502 View Code Duplication
        } else {
503
            $model->setLocale($locale);
504
            $languages = $this->cms_admin->get_langs(true);
505
506
            assetManager::create()
507
                ->setData(compact('model', 'languages', 'locale'))
508
                ->renderAdmin('edit_theme');
509
        }
510
    }
511
512
    /**
513
     * Delete status and related callbacks
514
     *
515
     * @return void
516
     * @throws PropelException
517
     */
518
    public function deleteTheme() {
519
        $id = (int) $this->input->post('id');
520
        $model = SCallbackThemesQuery::create()->setComment(__METHOD__)->findPk($id);
521
522
        if ($model !== null) {
523
            $this->db
524
                ->where('status_id', $model->getId())
525
                ->update('shop_callbacks', ['theme_id' => '0']);
526
            $model->delete();
527
            $this->lib_admin->log(lang('Topic callbacks deleted', 'callbacks') . '. Id: ' . $id);
528
            showMessage(lang('Topic deleted', 'callbacks'));
529
            pjax('/admin/components/run/callbacks/themes');
530
        }
531
    }
532
533
    protected function initPagination($totalCallbacks) {
534
        $this->load->library('pagination');
535
        $config['base_url'] = site_url('/admin/components/run/callbacks/index?') . http_build_query($this->input->get());
0 ignored issues
show
Coding Style Comprehensibility introduced by
$config was never initialized. Although not strictly required by PHP, it is generally a good practice to add $config = array(); before regardless.

Adding an explicit array definition is generally preferable to implicit array definition as it guarantees a stable state of the code.

Let’s take a look at an example:

foreach ($collection as $item) {
    $myArray['foo'] = $item->getFoo();

    if ($item->hasBar()) {
        $myArray['bar'] = $item->getBar();
    }

    // do something with $myArray
}

As you can see in this example, the array $myArray is initialized the first time when the foreach loop is entered. You can also see that the value of the bar key is only written conditionally; thus, its value might result from a previous iteration.

This might or might not be intended. To make your intention clear, your code more readible and to avoid accidental bugs, we recommend to add an explicit initialization $myArray = array() either outside or inside the foreach loop.

Loading history...
536
        $config['container'] = 'shopAdminPage';
537
        $config['uri_segment'] = 6;
538
        $config['page_query_string'] = true;
539
        $config['total_rows'] = $totalCallbacks;
540
        $config['per_page'] = $this->perPage;
541
        $config['separate_controls'] = true;
542
        $config['full_tag_open'] = '<div class="pagination pull-left"><ul>';
543
        $config['full_tag_close'] = '</ul></div>';
544
        $config['controls_tag_open'] = '<div class="pagination pull-right"><ul>';
545
        $config['controls_tag_close'] = '</ul></div>';
546
        $config['next_link'] = lang('Next', 'callbacks') . '&nbsp;&gt;';
547
        $config['prev_link'] = '&lt;&nbsp;' . lang('Prev', 'callbacks');
548
        $config['cur_tag_open'] = '<li class="btn-primary active"><span>';
549
        $config['cur_tag_close'] = '</span></li>';
550
        $config['prev_tag_open'] = '<li>';
551
        $config['prev_tag_close'] = '</li>';
552
        $config['next_tag_open'] = '<li>';
553
        $config['next_tag_close'] = '</li>';
554
        $config['num_tag_close'] = '</li>';
555
        $config['num_tag_open'] = '<li>';
556
        $config['num_tag_close'] = '</li>';
557
        $config['last_tag_open'] = '<li>';
558
        $config['last_tag_close'] = '</li>';
559
        $config['first_tag_open'] = '<li>';
560
        $config['first_tag_close'] = '</li>';
561
        $this->pagination->num_links = 6;
562
        $this->pagination->initialize($config);
563
        return $this->pagination->create_links_ajax();
564
    }
565
566
}