1<?php
2/*
3 * You may not change or alter any portion of this comment or credits
4 * of supporting developers from this source code or any supporting source code
5 * which is considered copyrighted (c) material of the original comment or credit authors.
6 *
7 * This program is distributed in the hope that it will be useful,
8 * but WITHOUT ANY WARRANTY; without even the implied warranty of
9 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
10 */
11
12/**
13 * @copyright    XOOPS Project http://xoops.org/
14 * @license      GNU GPL 2 or later (http://www.gnu.org/licenses/gpl-2.0.html)
15 * @package
16 * @since
17 * @author       XOOPS Development Team, Kazumi Ono (AKA onokazu)
18 */
19
20// Check users rights
21if (!is_object($xoopsUser) || !is_object($xoopsModule) || !$xoopsUser->isAdmin($xoopsModule->mid())) {
22    exit(_NOPERM);
23}
24// Get Action type
25$op = system_CleanVars($_REQUEST, 'op', 'list', 'string');
26
27$filter = system_CleanVars($_GET, 'filter', 0, 'int');
28if ($filter) {
29    $method = $_GET;
30} else {
31    $method = $_REQUEST;
32}
33
34$sel = array(
35    'selmod' => -2,
36    'selgen' => -1,
37    'selgrp' => XOOPS_GROUP_USERS,
38    'selvis' => -1);
39foreach ($sel as $key => $value) {
40    $_{$key} = isset($_COOKIE[$key]) ? (int)$_COOKIE[$key] : $value;
41    ${$key}  = system_CleanVars($method, $key, $_{$key}, 'int');
42    setcookie($key, ${$key});
43}
44
45$type = system_CleanVars($method, 'type', '', 'string');
46if ($type === 'preview') {
47    $op = 'preview';
48}
49
50if (isset($_GET['op'])) {
51    if ($_GET['op'] === 'edit' || $_GET['op'] === 'delete' || $_GET['op'] === 'delete_ok' || $_GET['op'] === 'clone') {
52        $op  = $_GET['op'];
53        $bid = isset($_GET['bid']) ? (int)$_GET['bid'] : 0;
54    }
55}
56
57switch ($op) {
58
59    case 'list':
60        // Define main template
61        $GLOBALS['xoopsOption']['template_main'] = 'system_blocks.tpl';
62        // Call Header
63        xoops_cp_header();
64        // Define Stylesheet
65        $xoTheme->addStylesheet(XOOPS_URL . '/modules/system/css/admin.css');
66        // Define scripts
67        $xoTheme->addScript('browse.php?Frameworks/jquery/jquery.js');
68        $xoTheme->addScript('browse.php?Frameworks/jquery/plugins/jquery.ui.js');
69        $xoTheme->addScript('modules/system/js/admin.js');
70        $xoTheme->addScript('modules/system/js/blocks.js');
71        // Define Breadcrumb and tips
72        $xoBreadCrumb->addLink(_AM_SYSTEM_BLOCKS_ADMIN, system_adminVersion('blocksadmin', 'adminpath'));
73        $xoBreadCrumb->addHelp(system_adminVersion('blocksadmin', 'help'));
74        $xoBreadCrumb->addTips(sprintf(_AM_SYSTEM_BLOCKS_TIPS, system_AdminIcons('block.png'), system_AdminIcons('success.png'), system_AdminIcons('cancel.png')));
75        $xoBreadCrumb->render();
76
77        // Initialize module handler
78        /* @var XoopsModuleHandler $module_handler */
79        $module_handler = xoops_getHandler('module');
80        $modules        = $module_handler->getObjects(null, true);
81        $criteria       = new CriteriaCompo(new Criteria('hasmain', 1));
82
83        $criteria->add(new Criteria('isactive', 1));
84        // Modules for blocks to be visible in
85        $display_list = $module_handler->getList($criteria);
86        unset($criteria);
87        // Initialize blocks handler
88        /* @var SystemBlockHandler $block_handler */
89        $block_handler = xoops_getModuleHandler('block');
90        // Initialize module handler
91        /* @var XoopsModuleHandler $module_handler */
92        $module_handler = xoops_getHandler('module');
93        $modules        = $module_handler->getObjects(null, true);
94
95        $filterform = new XoopsThemeForm('', 'filterform', 'admin.php', 'get');
96        $filterform->addElement(new XoopsFormHidden('fct', 'blocksadmin'));
97        $filterform->addElement(new XoopsFormHidden('op', 'list'));
98        $filterform->addElement(new XoopsFormHidden('filter', 1));
99        $sel_gen = new XoopsFormSelect(_AM_SYSTEM_BLOCKS_GENERATOR, 'selgen', $selgen);
100        $sel_gen->setExtra("onchange='submit()'");
101        $sel_gen->addOption(-1, _AM_SYSTEM_BLOCKS_TYPES);
102        $sel_gen->addOption(0, _AM_SYSTEM_BLOCKS_CUSTOM);
103        foreach ($modules as $list) {
104            $sel_gen->addOption($list->getVar('mid'), $list->getVar('name'));
105        }
106        $filterform->addElement($sel_gen);
107
108        $sel_mod = new XoopsFormSelect(_AM_SYSTEM_BLOCKS_SVISIBLEIN, 'selmod', $selmod);
109        $sel_mod->setExtra("onchange='submit()'");
110        ksort($display_list);
111        $display_list_spec[0]  = _AM_SYSTEM_BLOCKS_ALLPAGES;
112        $display_list_spec[-1] = _AM_SYSTEM_BLOCKS_TOPPAGE;
113        $display_list_spec[-2] = _AM_SYSTEM_BLOCKS_TYPES;
114        $display_list          = $display_list_spec + $display_list;
115        foreach ($display_list as $k => $v) {
116            $sel_mod->addOption($k, $v);
117        }
118        $filterform->addElement($sel_mod);
119
120        // For selection of group access
121        $sel_grp = new XoopsFormSelect(_AM_SYSTEM_BLOCKS_GROUP, 'selgrp', $selgrp);
122        $sel_grp->setExtra("onchange='submit()'");
123        /* @var XoopsMemberHandler $member_handler */
124        $member_handler = xoops_getHandler('member');
125        $group_list     = $member_handler->getGroupList();
126        $sel_grp->addOption(-1, _AM_SYSTEM_BLOCKS_TYPES);
127        $sel_grp->addOption(0, _AM_SYSTEM_BLOCKS_UNASSIGNED);
128        foreach ($group_list as $k => $v) {
129            $sel_grp->addOption($k, $v);
130        }
131        $filterform->addElement($sel_grp);
132
133        $sel_vis = new XoopsFormSelect(_AM_SYSTEM_BLOCKS_VISIBLE, 'selvis', $selvis);
134        $sel_vis->setExtra("onchange='submit()'");
135        $sel_vis->addOption(-1, _AM_SYSTEM_BLOCKS_TYPES);
136        $sel_vis->addOption(0, _NO);
137        $sel_vis->addOption(1, _YES);
138
139        $filterform->addElement($sel_vis);
140
141        $filterform->assign($xoopsTpl);
142
143        /* Get blocks */
144        $selvis      = ($selvis == -1) ? null : $selvis;
145        $selmod      = ($selmod == -2) ? null : $selmod;
146        $order_block = (isset($selvis) ? '' : 'b.visible DESC, ') . 'b.side,b.weight,b.bid';
147
148        if ($selgrp == 0) {
149            // get blocks that are not assigned to any groups
150            $blocks_arr = $block_handler->getNonGroupedBlocks($selmod, $toponlyblock = false, $selvis, $order_block);
151        } else {
152            $blocks_arr = $block_handler->getAllByGroupModule($selgrp, $selmod, $toponlyblock = false, $selvis, $order_block);
153        }
154
155        if ($selgen >= 0) {
156            foreach (array_keys($blocks_arr) as $bid) {
157                if ($blocks_arr[$bid]->getVar('mid') != $selgen) {
158                    unset($blocks_arr[$bid]);
159                }
160            }
161        }
162
163        $arr = array();
164        foreach (array_keys($blocks_arr) as $i) {
165            $arr[$i] = $blocks_arr[$i]->toArray();
166            $xoopsTpl->append_by_ref('blocks', $arr[$i]);
167        }
168        $block     = $block_handler->create();
169        $blockform = $block->getForm();
170        $xoopsTpl->assign('blockform', $blockform->render());
171        // Call Footer
172        xoops_cp_footer();
173        break;
174
175    case 'add':
176        // Define main template
177        $GLOBALS['xoopsOption']['template_main'] = 'system_blocks.tpl';
178        // Call Header
179        xoops_cp_header();
180        // Define Stylesheet
181        $xoTheme->addStylesheet(XOOPS_URL . '/modules/system/css/admin.css');
182        $xoTheme->addStylesheet(XOOPS_URL . '/modules/system/css/ui/' . xoops_getModuleOption('jquery_theme', 'system') . '/ui.all.css');
183        // Define scripts
184        $xoTheme->addScript('browse.php?Frameworks/jquery/jquery.js');
185        $xoTheme->addScript('browse.php?Frameworks/jquery/plugins/jquery.ui.js');
186        $xoTheme->addScript('browse.php?Frameworks/jquery/plugins/jquery.form.js');
187        $xoTheme->addScript('modules/system/js/admin.js');
188        $xoTheme->addScript('modules/system/js/blocks.js');
189        // Define Breadcrumb and tips
190        $xoBreadCrumb->addLink(_AM_SYSTEM_BLOCKS_ADMIN, system_adminVersion('blocksadmin', 'adminpath'));
191        $xoBreadCrumb->addLink(_AM_SYSTEM_BLOCKS_ADDBLOCK);
192        $xoBreadCrumb->render();
193        // Initialize blocks handler
194        $block_handler = xoops_getModuleHandler('block');
195        /* @var  SystemBlock $block */
196        $block         = $block_handler->create();
197        $blockform     = $block->getForm();
198        $xoopsTpl->assign('blockform', $blockform->render());
199        // Call Footer
200        xoops_cp_footer();
201        break;
202
203    case 'display':
204        // Initialize blocks handler
205        /* @var SystemBlockHandler $block_handler */
206        $block_handler = xoops_getModuleHandler('block');
207        // Get variable
208        $block_id = system_CleanVars($_POST, 'bid', 0, 'int');
209        $visible  = system_CleanVars($_POST, 'visible', 0, 'int');
210        if ($block_id > 0) {
211            $block = $block_handler->get($block_id);
212            $block->setVar('visible', $visible);
213            if (!$block_handler->insert($block)) {
214                $error = true;
215            }
216        }
217        break;
218
219    case 'drag':
220        // Initialize blocks handler
221        $block_handler = xoops_getModuleHandler('block');
222        // Get variable
223        $block_id = system_CleanVars($_POST, 'bid', 0, 'int');
224        $side     = system_CleanVars($_POST, 'side', 0, 'int');
225        if ($block_id > 0) {
226            $block = $block_handler->get($block_id);
227            $block->setVar('side', $side);
228            if (!$block_handler->insert($block)) {
229                $error = true;
230            }
231        }
232        break;
233
234    case 'order':
235        // Initialize blocks handler
236        $block_handler = xoops_getModuleHandler('block');
237        if (isset($_POST['blk'])) {
238            $i = 0;
239            foreach ($_POST['blk'] as $order) {
240                if ($order > 0) {
241                    $block = $block_handler->get($order);
242                    $block->setVar('weight', $i);
243                    if (!$block_handler->insert($block)) {
244                        $error = true;
245                    }
246                    ++$i;
247                }
248            }
249        }
250        exit;
251        break;
252
253    case 'preview':
254        if (!$GLOBALS['xoopsSecurity']->check()) {
255            redirect_header('admin.php?fct=blocksadmin', 3, implode('<br>', $GLOBALS['xoopsSecurity']->getErrors()));
256        }
257        // Initialize blocks handler
258        /* @var XoopsBlockHandler $block_handler */
259        $block_handler = xoops_getModuleHandler('block');
260        $block         = $block_handler->create();
261        $block->setVars($_POST);
262        $content = isset($_POST['content_block']) ? $_POST['content_block'] : '';
263        $block->setVar('content', $content);
264        $myts = MyTextSanitizer::getInstance();
265        echo '<div id="xo-preview-dialog" title="' . $block->getVar('title', 's') . '">' . $block->getContent('s', $block->getVar('c_type')) . '</div>';
266        break;
267
268    case 'save':
269        if (!$GLOBALS['xoopsSecurity']->check()) {
270            redirect_header('admin.php?fct=blocksadmin', 3, implode('<br>', $GLOBALS['xoopsSecurity']->getErrors()));
271        }
272        // Initialize blocks handler
273        $block_handler = xoops_getModuleHandler('block');
274        // Get avatar id
275        $block_id = system_CleanVars($_POST, 'bid', 0, 'int');
276        if ($block_id > 0) {
277            $block = $block_handler->get($block_id);
278        } else {
279            $block = $block_handler->create();
280        }
281        $block_type = system_CleanVars($_POST, 'block_type', '', 'string');
282        $block->setVar('block_type', $block_type);
283
284        if (!$block->isCustom()) {
285            $block->setVars($_POST);
286            $type = $block->getVar('block_type');
287            $name = $block->getVar('name');
288            // Save block options
289            $options = $_POST['options'];
290            if (isset($options)) {
291                $options_count = count($options);
292                if ($options_count > 0) {
293                    //Convert array values to comma-separated
294                    for ($i = 0; $i < $options_count; ++$i) {
295                        if (is_array($options[$i])) {
296                            $options[$i] = implode(',', $options[$i]);
297                        }
298                    }
299                    $options = implode('|', $options);
300                    $block->setVar('options', $options);
301                }
302            }
303        } else {
304            $block->setVars($_POST);
305            switch ($block->getVar('c_type')) {
306                case 'H':
307                    $name = _AM_SYSTEM_BLOCKS_CUSTOMHTML;
308                    break;
309                case 'P':
310                    $name = _AM_SYSTEM_BLOCKS_CUSTOMPHP;
311                    break;
312                case 'S':
313                    $name = _AM_SYSTEM_BLOCKS_CUSTOMSMILE;
314                    break;
315                default:
316                    $name = _AM_SYSTEM_BLOCKS_CUSTOMNOSMILE;
317                    break;
318            }
319        }
320        $block->setVar('name', $name);
321        $block->setVar('isactive', 1);
322
323        $content = isset($_POST['content_block']) ? $_POST['content_block'] : '';
324        $block->setVar('content', $content);
325
326        if (!$newid = $block_handler->insert($block)) {
327            xoops_cp_header();
328            xoops_error($block->getHtmlErrors());
329            xoops_cp_footer();
330            exit();
331        }
332        if ($newid != 0) {
333            $blocklinkmodule_handler = xoops_getModuleHandler('blocklinkmodule');
334            // Delete old link
335            $criteria = new CriteriaCompo(new Criteria('block_id', $newid));
336            $blocklinkmodule_handler->deleteAll($criteria);
337            // Assign link
338            $modules = $_POST['modules'];
339            foreach ($modules as $mid) {
340                $blocklinkmodule = $blocklinkmodule_handler->create();
341                $blocklinkmodule->setVar('block_id', $newid);
342                $blocklinkmodule->setVar('module_id', $mid);
343                if (!$blocklinkmodule_handler->insert($blocklinkmodule)) {
344                    xoops_cp_header();
345                    xoops_error($blocklinkmodule->getHtmlErrors());
346                    xoops_cp_footer();
347                    exit();
348                }
349            }
350        }
351        /* @var XoopsGroupPermHandler $groupperm_handler */
352        $groupperm_handler  = xoops_getHandler('groupperm');
353        $groups             = $_POST['groups'];
354        $groups_with_access = $groupperm_handler->getGroupIds('block_read', $newid);
355        $removed_groups     = array_diff($groups_with_access, $groups);
356        if (count($removed_groups) > 0) {
357            foreach ($removed_groups as $groupid) {
358                $criteria = new CriteriaCompo(new Criteria('gperm_name', 'block_read'));
359                $criteria->add(new Criteria('gperm_groupid', $groupid));
360                $criteria->add(new Criteria('gperm_itemid', $newid));
361                $criteria->add(new Criteria('gperm_modid', 1));
362                $perm = $groupperm_handler->getObjects($criteria);
363                if (isset($perm[0]) && is_object($perm[0])) {
364                    $groupperm_handler->delete($perm[0]);
365                }
366            }
367        }
368        $new_groups = array_diff($groups, $groups_with_access);
369        if (count($new_groups) > 0) {
370            foreach ($new_groups as $groupid) {
371                $groupperm_handler->addRight('block_read', $newid, $groupid);
372            }
373        }
374        redirect_header('admin.php?fct=blocksadmin', 1, _AM_SYSTEM_BLOCKS_DBUPDATED);
375        break;
376
377    case 'edit':
378        // Initialize blocks handler
379        $block_handler = xoops_getModuleHandler('block');
380        // Get avatar id
381        $block_id = system_CleanVars($_REQUEST, 'bid', 0, 'int');
382        if ($block_id > 0) {
383            // Define main template
384            $GLOBALS['xoopsOption']['template_main'] = 'system_blocks.tpl';
385            // Call Header
386            xoops_cp_header();
387            // Define Stylesheet
388            $xoTheme->addStylesheet(XOOPS_URL . '/modules/system/css/admin.css');
389            $xoTheme->addStylesheet(XOOPS_URL . '/modules/system/css/ui/' . xoops_getModuleOption('jquery_theme', 'system') . '/ui.all.css');
390            // Define scripts
391            $xoTheme->addScript('browse.php?Frameworks/jquery/jquery.js');
392            $xoTheme->addScript('browse.php?Frameworks/jquery/plugins/jquery.ui.js');
393            $xoTheme->addScript('browse.php?Frameworks/jquery/plugins/jquery.form.js');
394            $xoTheme->addScript('modules/system/js/admin.js');
395            // Define Breadcrumb and tips
396            $xoBreadCrumb->addLink(_AM_SYSTEM_BLOCKS_ADMIN, system_adminVersion('blocksadmin', 'adminpath'));
397            $xoBreadCrumb->addLink(_AM_SYSTEM_BLOCKS_EDITBLOCK);
398            $xoBreadCrumb->render();
399
400            $block     = $block_handler->get($block_id);
401            $blockform = $block->getForm();
402            $xoopsTpl->assign('blockform', $blockform->render());
403            // Call Footer
404            xoops_cp_footer();
405        } else {
406            redirect_header('admin.php?fct=blocksadmin', 1, _AM_SYSTEM_DBERROR);
407        }
408        break;
409
410    case 'delete':
411        // Initialize blocks handler
412        /* @var SystemBlockHandler $block_handler */
413        $block_handler = xoops_getModuleHandler('block');
414        // Get avatar id
415        $block_id = system_CleanVars($_REQUEST, 'bid', 0, 'int');
416        if ($block_id > 0) {
417            $block = $block_handler->get($block_id);
418            if ($block->getVar('block_type') === 'S') {
419                redirect_header('admin.php?fct=blocksadmin', 4, _AM_SYSTEM_BLOCKS_SYSTEMCANT);
420            } elseif ($block->getVar('block_type') === 'M') {
421                // Fix for duplicated blocks created in 2.0.9 module update
422                // A module block can be deleted if there is more than 1 that
423                // has the same func_num/show_func which is mostly likely
424                // be the one that was duplicated in 2.0.9
425                if (1 >= $count = $block_handler->countSimilarBlocks($block->getVar('mid'), $block->getVar('func_num'), $block->getVar('show_func'))) {
426                    redirect_header('admin.php?fct=blocksadmin', 4, _AM_SYSTEM_BLOCKS_MODULECANT);
427                }
428            }
429            // Define main template
430            $GLOBALS['xoopsOption']['template_main'] = 'system_header.tpl';
431            // Call Header
432            xoops_cp_header();
433            // Display Question
434            xoops_confirm(array(
435                              'op'  => 'delete_ok',
436                              'fct' => 'blocksadmin',
437                              'bid' => $block->getVar('bid')), 'admin.php', sprintf(_AM_SYSTEM_BLOCKS_RUSUREDEL, $block->getVar('title')));
438            // Call Footer
439            xoops_cp_footer();
440        }
441        break;
442
443    case 'delete_ok':
444        if (!$GLOBALS['xoopsSecurity']->check()) {
445            redirect_header('admin.php?fct=blocksadmin', 3, implode('<br>', $GLOBALS['xoopsSecurity']->getErrors()));
446        }
447        // Initialize blocks handler
448        $block_handler = xoops_getModuleHandler('block');
449        // Get avatar id
450        $block_id = system_CleanVars($_POST, 'bid', 0, 'int');
451        if ($block_id > 0) {
452            $block = $block_handler->get($block_id);
453            if ($block_handler->delete($block)) {
454                // Delete Group link
455                $blocklinkmodule_handler = xoops_getModuleHandler('blocklinkmodule');
456                $blocklinkmodule         = $blocklinkmodule_handler->getObjects(new CriteriaCompo(new Criteria('block_id', $block_id)));
457                foreach ($blocklinkmodule as $link) {
458                    $blocklinkmodule_handler->delete($link, true);
459                }
460                // Delete Group permission
461                /* @var  XoopsGroupPermHandler $groupperm_handler */
462                $groupperm_handler = xoops_getHandler('groupperm');
463                $criteria          = new CriteriaCompo(new Criteria('gperm_name', 'block_read'));
464                $criteria->add(new Criteria('gperm_itemid', $block_id));
465                $groupperm = $groupperm_handler->getObjects($criteria);
466                foreach ($groupperm as $perm) {
467                    $groupperm_handler->delete($perm, true);
468                }
469                // Delete template
470                if ($block->getVar('template') != '') {
471                    $tplfile_handler = xoops_getHandler('tplfile');
472                    $btemplate       = $tplfile_handler->find($GLOBALS['xoopsConfig']['template_set'], 'block', $block_id);
473                    if (count($btemplate) > 0) {
474                        $tplfile_handler->delete($btemplate[0]);
475                    }
476                }
477                redirect_header('admin.php?fct=blocksadmin', 1, _AM_SYSTEM_BLOCKS_DBUPDATED);
478            }
479        } else {
480            redirect_header('admin.php?fct=blocksadmin', 1, _AM_SYSTEM_DBERROR);
481        }
482        break;
483
484    case 'clone':
485        // Initialize blocks handler
486        $block_handler = xoops_getModuleHandler('block');
487        // Get avatar id
488        $block_id = system_CleanVars($_REQUEST, 'bid', 0, 'int');
489        if ($block_id > 0) {
490            // Define main template
491            $GLOBALS['xoopsOption']['template_main'] = 'system_blocks.tpl';
492            // Call Header
493            xoops_cp_header();
494            // Define Stylesheet
495            $xoTheme->addStylesheet(XOOPS_URL . '/modules/system/css/admin.css');
496            // Define Breadcrumb and tips
497            $xoBreadCrumb->addLink(_AM_SYSTEM_BLOCKS_ADMIN, system_adminVersion('blocksadmin', 'adminpath'));
498            $xoBreadCrumb->addLink(_AM_SYSTEM_BLOCKS_CLONEBLOCK);
499            $xoBreadCrumb->render();
500            /* @var XoopsBlock $block */
501            $block     = $block_handler->get($block_id);
502            $blockform = $block->getForm('clone');
503            $xoopsTpl->assign('blockform', $blockform->render());
504            // Call Footer
505            xoops_cp_footer();
506        } else {
507            redirect_header('admin.php?fct=blocksadmin', 1, _AM_SYSTEM_DBERROR);
508        }
509        break;
510
511}
512