From 4655544ed44bc64e4fde1ee166546fb51780ba70 Mon Sep 17 00:00:00 2001 From: Marc Alexander Date: Tue, 18 Feb 2014 00:44:41 +0100 Subject: [PATCH] [ticket/216] Add method for checking if module can be moved Also fixed minor issues with incorrect checks for module class 'custom'. B3P-216 --- acp/portal_module.php | 117 ++++++++++++++++++--------------- tests/acp/move_module_test.php | 21 ++++++ 2 files changed, 86 insertions(+), 52 deletions(-) diff --git a/acp/portal_module.php b/acp/portal_module.php index 0f2efd1e..1b9fcc10 100644 --- a/acp/portal_module.php +++ b/acp/portal_module.php @@ -146,7 +146,7 @@ class portal_module 'MODULE_SHOW_IMAGE' => (in_array(column_num_string($module_data['module_column']), array('center', 'top', 'bottom'))) ? false : true, )); - if($module_data['module_classname'] != 'custom') + if($module_data['module_classname'] != '\board3\portal\modules\custom') { $groups_ary = explode(',', $module_data['module_group_ids']); @@ -283,7 +283,7 @@ class portal_module if(isset($module_name)) { - if ($module_data['module_classname'] !== 'custom') + if ($module_data['module_classname'] !== '\board3\portal\modules\custom') { add_log('admin', 'LOG_PORTAL_CONFIG', $module_name); } @@ -427,23 +427,11 @@ class portal_module // do we want to add the module to the side columns or to the center columns? if (in_array($column_string, array('left', 'right'))) { - // does the module already exist in the side columns? - if (isset($this->module_column[$module_classname]) && - (in_array('left', $this->module_column[$module_classname]) || in_array('right', $this->module_column[$module_classname]))) - { - $submit = false; - } + $submit = $this->can_move_module(array('left', 'right'), $module_classname); } elseif (in_array($column_string, array('center', 'top', 'bottom'))) { - // does the module already exist in the center columns? - if (isset($this->module_column[$module_classname]) && - (in_array('center', $this->module_column[$module_classname]) || - in_array('top', $this->module_column[$module_classname]) || - in_array('bottom', $this->module_column[$module_classname]))) - { - $submit = false; - } + $submit = $this->can_move_module(array('center', 'top', 'bottom'), $module_classname); } // do not install if module already exists in that column @@ -526,8 +514,7 @@ class portal_module if (in_array($column_string, array('left', 'right'))) { // does the module already exist in the side columns? - if (isset($this->module_column[$module_class]) && - (in_array('left', $this->module_column[$module_class]) || in_array('right', $this->module_column[$module_class]))) + if (!$this->can_move_module(array('left', 'right'), $module_class)) { continue; } @@ -535,10 +522,7 @@ class portal_module elseif (in_array($column_string, array('center', 'top', 'bottom'))) { // does the module already exist in the center columns? - if (isset($this->module_column[$module_class]) && - (in_array('center', $this->module_column[$module_class]) || - in_array('top', $this->module_column[$module_class]) || - in_array('bottom', $this->module_column[$module_class]))) + if (!$this->can_move_module(array('center', 'top', 'bottom'), $module_class)) { continue; } @@ -629,14 +613,11 @@ class portal_module * this only applies to modules in the center column as the side modules * will automatically skip the center column when moving if they need to */ - if ($row['module_classname'] != 'custom') + if ($row['module_classname'] != '\board3\portal\modules\custom') { $column_string = column_num_string($row['module_column'] + 1); // move 1 right - if ($column_string == 'right' && - isset($this->module_column[$row['module_classname']]) && - (in_array('left', $this->module_column[$row['module_classname']]) || - in_array('right', $this->module_column[$row['module_classname']]))) + if ($column_string == 'right' && !$this->can_move_module(array('left', 'right'), $row['module_classname'])) { $move_right = false; } @@ -662,14 +643,11 @@ class portal_module * this only applies to modules in the center column as the side modules * will automatically skip the center column when moving if they need to */ - if ($row['module_classname'] != 'custom') + if ($row['module_classname'] != '\board3\portal\modules\custom') { $column_string = column_num_string($row['module_column'] - 1); // move 1 left - if ($column_string == 'left' && - isset($this->module_column[$row['module_classname']]) && - (in_array('left', $this->module_column[$row['module_classname']]) || - in_array('right', $this->module_column[$row['module_classname']]))) + if ($column_string == 'left' && !$this->can_move_module(array('left', 'right'), $row['module_classname'])) { $move_left = false; } @@ -986,22 +964,15 @@ class portal_module * new column (side columns (left & right) or center columns (top, center, bottom)). * of course this does not apply to custom modules. */ - if ($module_data['module_classname'] != 'custom' && $move_action == 1) + if ($module_data['module_classname'] != '\board3\portal\modules\custom' && $move_action == 1) { $column_string = column_num_string($module_data['module_column'] - $move_action); // we can only move left to the left & center column - if ($column_string == 'left' && - isset($this->module_column[$module_data['module_classname']]) && - (in_array('left', $this->module_column[$module_data['module_classname']]) || - in_array('right', $this->module_column[$module_data['module_classname']]))) + if ($column_string == 'left' && !$this->can_move_module(array('right', 'left'), $module_data['module_classname'])) { trigger_error($this->user->lang['UNABLE_TO_MOVE'] . adm_back_link($this->u_action)); } - elseif ($column_string == 'center' && - isset($this->module_column[$module_data['module_classname']]) && - (in_array('center', $this->module_column[$module_data['module_classname']]) || - in_array('top', $this->module_column[$module_data['module_classname']]) || - in_array('bottom', $this->module_column[$module_data['module_classname']]))) + elseif ($column_string == 'center' && !$this->can_move_module(array('top', 'center', 'bottom'), $module_data['module_classname'])) { // we are moving from the right to the center column so we should move to the left column instead $move_action = 2; @@ -1088,22 +1059,15 @@ class portal_module * new column (side columns (left & right) or center columns (top, center, bottom)). * of course this does not apply to custom modules. */ - if ($module_data['module_classname'] != 'custom' && $move_action == 1) + if ($module_data['module_classname'] != '\board3\portal\modules\custom' && $move_action == 1) { $column_string = column_num_string($module_data['module_column'] + $move_action); // we can only move right to the right & center column - if ($column_string == 'right' && - isset($this->module_column[$module_data['module_classname']]) && - (in_array('left', $this->module_column[$module_data['module_classname']]) || - in_array('right', $this->module_column[$module_data['module_classname']]))) + if ($column_string == 'right' && !$this->can_move_module(array('right', 'left'), $module_data['module_classname'])) { trigger_error($this->user->lang['UNABLE_TO_MOVE'] . adm_back_link($this->u_action)); } - elseif ($column_string == 'center' && - isset($this->module_column[$module_data['module_classname']]) && - (in_array('center', $this->module_column[$module_data['module_classname']]) || - in_array('top', $this->module_column[$module_data['module_classname']]) || - in_array('bottom', $this->module_column[$module_data['module_classname']]))) + elseif ($column_string == 'center' && !$this->can_move_module(array('top', 'center', 'bottom'), $module_data['module_classname'])) { // we are moving from the left to the center column so we should move to the right column instead $move_action = 2; @@ -1248,4 +1212,53 @@ class portal_module } } } + + /** + * Check if module can be moved to desired column(s) + * + * @param array|int $target_column Column(s) the module should be + * moved to + * @param string $module_class Class of the module + * @return bool True if module can be moved to desired column, + * false if not + */ + public function can_move_module($target_column, $module_class) + { + $submit = true; + + if (is_array($target_column)) + { + foreach ($target_column as $column) + { + if (!$this->can_move_module($column, $module_class)) + { + $submit = false; + } + } + } + + // do we want to add the module to the side columns or to the center columns? + if (in_array($target_column, array('left', 'right'))) + { + // does the module already exist in the side columns? + if (isset($this->module_column[$module_class]) && + (in_array('left', $this->module_column[$module_class]) || in_array('right', $this->module_column[$module_class]))) + { + $submit = false; + } + } + elseif (in_array($target_column, array('center', 'top', 'bottom'))) + { + // does the module already exist in the center columns? + if (isset($this->module_column[$module_class]) && + (in_array('center', $this->module_column[$module_class]) || + in_array('top', $this->module_column[$module_class]) || + in_array('bottom', $this->module_column[$module_class]))) + { + $submit = false; + } + } + + return $submit; + } } diff --git a/tests/acp/move_module_test.php b/tests/acp/move_module_test.php index cfceaa94..dd123fd1 100644 --- a/tests/acp/move_module_test.php +++ b/tests/acp/move_module_test.php @@ -251,6 +251,27 @@ class phpbb_acp_move_module_test extends \board3\portal\tests\testframework\data $this->setExpectedTriggerError(E_USER_NOTICE, 'UNABLE_TO_MOVE'); $this->portal_module->move_module_left($module_id); } + + public function data_can_move_module() + { + return array( + array(false, 'left', '\board3\portal\modules\clock'), + array(false, 'right', '\board3\portal\modules\clock'), + array(true, 'center', '\board3\portal\modules\clock'), + array(true, array('top', 'bottom', 'center'), '\board3\portal\modules\clock'), + array(false, array('left', 'right'), '\board3\portal\modules\clock'), + array(false, 'center', '\board3\portal\modules\birthday_list'), + ); + } + + /** + * @dataProvider data_can_move_module + */ + public function test_can_move_module($expected, $target_column, $module_class) + { + $this->update_portal_modules(); + $this->assertEquals($expected, $this->portal_module->can_move_module($target_column, $module_class)); + } } function redirect($url)