From 38da0b16f57d4c13d7ad62077c5e10ef0c15285f Mon Sep 17 00:00:00 2001 From: Marc Alexander Date: Tue, 5 Oct 2010 20:11:18 +0000 Subject: [PATCH] Fixed some minor issues in main menu block; Added links block; --- root/adm/style/portal/acp_portal_links.html | 41 +- root/adm/style/portal/acp_portal_menu.html | 4 + .../en/mods/portal/portal_links_module.php | 43 ++ .../mods/portal/portal_main_menu_module.php | 1 + root/portal/modules/portal_links.php | 411 ++++++++++++++++++ root/portal/modules/portal_main_menu.php | 9 +- .../template/portal/modules/links_side.html | 12 + .../portal/modules/main_menu_new.html | 14 - .../portal/modules/main_menu_side.html | 31 +- .../theme/images/portal/portal_links.png | Bin 0 -> 1154 bytes 10 files changed, 511 insertions(+), 55 deletions(-) create mode 100644 root/language/en/mods/portal/portal_links_module.php create mode 100644 root/portal/modules/portal_links.php create mode 100644 root/styles/prosilver/template/portal/modules/links_side.html delete mode 100644 root/styles/prosilver/template/portal/modules/main_menu_new.html create mode 100644 root/styles/prosilver/theme/images/portal/portal_links.png diff --git a/root/adm/style/portal/acp_portal_links.html b/root/adm/style/portal/acp_portal_links.html index c1c7bd71..c753cc9d 100644 --- a/root/adm/style/portal/acp_portal_links.html +++ b/root/adm/style/portal/acp_portal_links.html @@ -17,20 +17,14 @@ - + \ No newline at end of file diff --git a/root/adm/style/portal/acp_portal_menu.html b/root/adm/style/portal/acp_portal_menu.html index e555bc91..6f8b9ed3 100644 --- a/root/adm/style/portal/acp_portal_menu.html +++ b/root/adm/style/portal/acp_portal_menu.html @@ -112,6 +112,10 @@ {ICON_EDIT} {ICON_DELETE} + + + {L_MENU_NO_LINKS} + diff --git a/root/language/en/mods/portal/portal_links_module.php b/root/language/en/mods/portal/portal_links_module.php new file mode 100644 index 00000000..8647275e --- /dev/null +++ b/root/language/en/mods/portal/portal_links_module.php @@ -0,0 +1,43 @@ + 'Links', + 'LINKS_NO_LINKS' => 'No links', + + // ACP + 'ACP_PORTAL_LINKS' => 'Link Settings', + 'ACP_PORTAL_LINKS_EXP' => 'Customize the links listed in the links block', + // @todo: Add necessary language variables +)); + +?> \ No newline at end of file diff --git a/root/language/en/mods/portal/portal_main_menu_module.php b/root/language/en/mods/portal/portal_main_menu_module.php index ef86c8ae..d4fb7bb5 100644 --- a/root/language/en/mods/portal/portal_main_menu_module.php +++ b/root/language/en/mods/portal/portal_main_menu_module.php @@ -39,6 +39,7 @@ $lang = array_merge($lang, array( 'M_TERMS' => 'Terms of use', 'M_PRV' => 'Privacy policy', 'M_SEARCH' => 'Search', + 'MENU_NO_LINKS' => 'No links', // ACP 'ACP_PORTAL_MENU' => 'Menu settings', diff --git a/root/portal/modules/portal_links.php b/root/portal/modules/portal_links.php new file mode 100644 index 00000000..5ba49966 --- /dev/null +++ b/root/portal/modules/portal_links.php @@ -0,0 +1,411 @@ +lang}/mods/portal/" + */ + var $language = 'portal_links_module'; + + /** + * custom acp template + * file must be in "adm/style/portal/" + */ + var $custom_acp_tpl = 'acp_portal_links'; + + function get_template_side($module_id) + { + global $config, $template, $phpEx, $phpbb_root_path, $user, $db; + + $links = array(); + $portal_config = obtain_portal_config(); + + $links = $this->utf_unserialize($portal_config['board3_links_array_' . $module_id]); + + // get user's groups + $sql = 'SELECT group_id + FROM ' . USER_GROUP_TABLE . ' + WHERE user_id = ' . (int) $user->data['user_id'] . ' + ORDER BY group_id ASC'; + $result = $db->sql_query($sql); + while($row = $db->sql_fetchrow($result)) + { + $groups_ary[] = $row['group_id']; + } + $db->sql_freeresult($result); + + + for ($i = 0; $i < sizeof($links); $i++) + { + if($links[$i]['type'] == B3_LINKS_INT) + { + $links[$i]['url'] = str_replace('&', '&', $links[$i]['url']); // we need to do this in order to prevent XHTML validation errors + $cur_url = append_sid($phpbb_root_path . $links[$i]['url']); // the user should know what kind of file it is + } + else + { + $cur_url = $links[$i]['url']; + } + + $cur_permissions = explode(',', $links[$i]['permission']); + $permission_check = array_intersect($groups_ary, $cur_permissions); + + if(!empty($permission_check) || $links[$i]['permission'] == '') + { + $template->assign_block_vars('portallinks', array( + 'LINK_TITLE' => (isset($user->lang[$links[$i]['title']])) ? $user->lang[$links[$i]['title']] : $links[$i]['title'], + 'LINK_URL' => $cur_url, + )); + } + } + + return 'links_side.html'; + } + + function get_template_acp($module_id) + { + // do not remove this as it is needed in order to run manage_links + return array( + 'title' => 'ACP_PORTAL_LINKS', + 'vars' => array( + 'legend1' => 'ACP_PORTAL_MENU', + 'board3_links_' . $module_id => array('lang' => 'ACP_PORTAL_MENU_MANAGE', 'validate' => 'string', 'type' => 'custom', 'explain' => true, 'method' => 'manage_links', 'submit' => 'update_links'), + ), + ); + } + + /** + * API functions + */ + function install($module_id) + { + global $phpbb_root_path, $db; + + $links = array(); + + $links_titles = array( + 'Board3.de', + 'phpBB.com', + ); + + $links_types = array( + B3_LINKS_EXT, + B3_LINKS_EXT, + ); + + $links_urls = array( + 'http://www.board3.de/', + 'http://www.phpbb.com/', + ); + + $links_permissions = array( + '', + '', + ); + + foreach($links_urls as $i => $url) + { + $links[] = array( + 'title' => $links_titles[$i], + 'url' => $links_urls[$i], + 'type' => $links_types[$i], + 'permission' => $links_permissions[$i], + ); + } + + $board3_menu_array = serialize($links); + set_portal_config('board3_links_array_' . $module_id, $board3_menu_array); + set_config('board3_links_' . $module_id, ''); + + return true; + } + + function uninstall($module_id) + { + global $db; + + $del_config = array( + 'board3_links_array_' . $module_id, + ); + $sql = 'DELETE FROM ' . PORTAL_CONFIG_TABLE . ' + WHERE ' . $db->sql_in_set('config_name', $del_config); + + $del_config = array( + 'board3_links_' . $module_id, + ); + $sql = 'DELETE FROM ' . CONFIG_TABLE . ' + WHERE ' . $db->sql_in_set('config_name', $del_config); + return $db->sql_query($sql); + } + + // Manage the menu links + function manage_links($value, $key, $module_id) + { + global $config, $phpbb_admin_path, $user, $phpEx, $db, $template; + + $action = request_var('action', ''); + $action = (isset($_POST['add'])) ? 'add' : $action; + $action = (isset($_POST['save'])) ? 'save' : $action; + $link_id = request_var('id', 99999999); // 0 will trigger unwanted behavior, therefore we set a number we should never reach + $portal_config = obtain_portal_config(); + + $links = array(); + + $links = $this->utf_unserialize($portal_config['board3_links_array_' . $module_id]); + + $u_action = append_sid($phpbb_admin_path . 'index.' . $phpEx, 'i=portal&mode=config&module_id=' . $module_id); + + switch ($action) + { + // Save changes + case 'save': + if (!check_form_key('acp_portal')) + { + trigger_error($user->lang['FORM_INVALID']. adm_back_link($u_action), E_USER_WARNING); + } + + $link_title = utf8_normalize_nfc(request_var('link_title', ' ', true)); + $link_type = request_var('link_type', 2); // default to B3_LINK_EXT, no categories in Links block + $link_url = request_var('link_url', ' '); + $link_url = str_replace('&', '&', $link_url); + $link_permission = request_var('permission-setting', array(0 => '')); + $groups_ary = array(); + + // get groups and check if the selected groups actually exist + $sql = 'SELECT group_id + FROM ' . GROUPS_TABLE . ' + ORDER BY group_id ASC'; + $result = $db->sql_query($sql); + while($row = $db->sql_fetchrow($result)) + { + $groups_ary[] = $row['group_id']; + } + $db->sql_freeresult($result); + + $link_permissions = array_intersect($link_permission, $groups_ary); + $link_permissions = implode(',', $link_permissions); + + // Check for errors + if (!$link_title) + { + trigger_error($user->lang['NO_LINK_TITLE'] . adm_back_link($u_action), E_USER_WARNING); + } + + if (!$link_url) + { + trigger_error($user->lang['NO_LINK_URL'] . adm_back_link($u_action), E_USER_WARNING); + } + + // overwrite already existing links and make sure we don't try to save a link outside of the normal array size of $links + if (isset($link_id) && $link_id < sizeof($links)) + { + $message = $user->lang['LINK_UPDATED']; + + $links[$link_id] = array( + 'title' => $link_title, + 'url' => htmlspecialchars_decode($link_url), + 'type' => $link_type, + 'permission' => $link_permissions, + ); + + add_log('admin', 'LOG_PORTAL_LINK_UPDATED', $link_title); + } + else + { + $message = $user->lang['LINK_ADDED']; + + $links[] = array( + 'title' => $link_title, + 'url' => htmlspecialchars_decode($link_url), + 'type' => $link_type, + 'permission' => $link_permissions, + ); + add_log('admin', 'LOG_PORTAL_LINK_ADDED', $link_title); + } + + $board3_links_array = serialize($links); + set_portal_config('board3_links_array_' . $module_id, $board3_links_array); + + trigger_error($message . adm_back_link($u_action)); + + break; + + // Delete link + case 'delete': + + if (!isset($link_id) && $link_id >= sizeof($links)) + { + trigger_error($user->lang['MUST_SELECT_LINK'] . adm_back_link($u_action), E_USER_WARNING); + } + + if (confirm_box(true)) + { + $cur_link_title = $links[$link_id]['title']; + // delete the selected link and reset the array numbering afterwards + array_splice($links, $link_id, 1); + $links = array_merge($links); + + $board3_links_array = serialize($links); + set_portal_config('board3_links_array_' . $module_id, $board3_links_array); + + add_log('admin', 'LOG_PORTAL_LINK_REMOVED', $cur_link_title); + } + else + { + confirm_box(false, $user->lang['CONFIRM_OPERATION'], build_hidden_fields(array( + 'link_id' => $link_id, + 'action' => 'delete', + ))); + } + + break; + + // Move items up or down + case 'move_up': + case 'move_down': + + if (!isset($link_id) && $link_id >= sizeof($links)) + { + trigger_error($user->lang['MUST_SELECT_LINK'] . adm_back_link($u_action), E_USER_WARNING); + } + + // make sure we don't try to move a link where it can't be moved + if (($link_id == 0 && $action == 'move_up') || ($link_id == (sizeof($links) - 1) && $action == 'move_down')) + { + break; + } + + /* + * on move_down, switch position with next order_id... + * on move_up, switch position with previous order_id... + * move up means a lower ID, move down means a higher ID + */ + $switch_order_id = ($action == 'move_down') ? $link_id + 1 : $link_id - 1; + + // back up the info of the link we want to move + $cur_link = array( + 'title' => $links[$link_id]['title'], + 'url' => $links[$link_id]['url'], + 'type' => $links[$link_id]['type'], + 'permission' => $links[$link_id]['permission'], + ); + + // move the info of the links we replace in the order + $links[$link_id] = array( + 'title' => $links[$switch_order_id]['title'], + 'url' => $links[$switch_order_id]['url'], + 'type' => $links[$switch_order_id]['type'], + 'permission' => $links[$switch_order_id]['permission'], + ); + + // insert the info of the moved link + $links[$switch_order_id] = $cur_link; + + $board3_links_array = serialize($links); + set_portal_config('board3_links_array_' . $module_id, $board3_links_array); + + break; + + // Edit or add menu item + case 'edit': + case 'add': + $template->assign_vars(array( + 'LINK_TITLE' => (isset($links[$link_id]['title']) && $action != 'add') ? $links[$link_id]['title'] : '', + 'LINK_URL' => (isset($links[$link_id]['url']) && $action != 'add') ? str_replace('&', '&', $links[$link_id]['url']) : '', + + //'U_BACK' => $u_action, + 'U_ACTION' => $u_action . '&id=' . $link_id, + + 'S_EDIT' => true, + 'S_LINK_IS_INT' => (isset($links[$link_id]['type']) && $links[$link_id]['type'] == B3_LINKS_INT) ? true : false, + )); + + $groups_ary = (isset($links[$link_id]['permission'])) ? explode(',', $links[$link_id]['permission']) : array(); + + // get group info from database and assign the block vars + $sql = 'SELECT group_id, group_name + FROM ' . GROUPS_TABLE . ' + ORDER BY group_id ASC'; + $result = $db->sql_query($sql); + while($row = $db->sql_fetchrow($result)) + { + $template->assign_block_vars('permission_setting', array( + 'SELECTED' => (in_array($row['group_id'], $groups_ary)) ? true : false, + 'GROUP_NAME' => (isset($user->lang['G_' . $row['group_name']])) ? $user->lang['G_' . $row['group_name']] : $row['group_name'], + 'GROUP_ID' => $row['group_id'], + )); + } + $db->sql_freeresult($result); + + return; + + break; + } + + for ($i = 0; $i < sizeof($links); $i++) + { + $template->assign_block_vars('links', array( + 'LINK_TITLE' => ($action != 'add') ? ((isset($user->lang[$links[$i]['title']])) ? $user->lang[$links[$i]['title']] : $links[$i]['title']) : '', + 'LINK_URL' => ($action != 'add') ? str_replace('&', '&', $links[$i]['url']) : '', + + 'U_EDIT' => $u_action . '&action=edit&id=' . $i, + 'U_DELETE' => $u_action . '&action=delete&id=' . $i, + 'U_MOVE_UP' => $u_action . '&action=move_up&id=' . $i, + 'U_MOVE_DOWN' => $u_action . '&action=move_down&id=' . $i, + )); + } + } + + function update_links($key, $module_id) + { + $this->manage_links('', $key, $module_id); + } + + // Unserialize links array + function utf_unserialize($serial_str) + { + $out = preg_replace('!s:(\d+):"(.*?)";!se', "'s:'.strlen('$2').':\"$2\";'", $serial_str ); + return unserialize($out); + } +} + +?> \ No newline at end of file diff --git a/root/portal/modules/portal_main_menu.php b/root/portal/modules/portal_main_menu.php index 770c1e73..10320c26 100644 --- a/root/portal/modules/portal_main_menu.php +++ b/root/portal/modules/portal_main_menu.php @@ -107,13 +107,13 @@ class portal_main_menu_module } } - return 'main_menu_new.html'; + return 'main_menu_side.html'; } function get_template_acp($module_id) { // do not remove this as it is needed in order to run manage_links - return array( + return array( 'title' => 'ACP_PORTAL_MENU', 'vars' => array( 'legend1' => 'ACP_PORTAL_MENU', @@ -243,11 +243,6 @@ class portal_main_menu_module $link_id = request_var('id', 99999999); // 0 will trigger unwanted behavior, therefore we set a number we should never reach $portal_config = obtain_portal_config(); - $sql = 'SELECT module_id FROM ' . PORTAL_MODULES_TABLE . " WHERE module_classname = 'main_menu'"; - $result = $db->sql_query($sql); - $module_id = $db->sql_fetchfield('module_id'); - $db->sql_freeresult($result); - $links = array(); $links = $this->utf_unserialize($portal_config['board3_menu_array_' . $module_id]); diff --git a/root/styles/prosilver/template/portal/modules/links_side.html b/root/styles/prosilver/template/portal/modules/links_side.html new file mode 100644 index 00000000..b027d996 --- /dev/null +++ b/root/styles/prosilver/template/portal/modules/links_side.html @@ -0,0 +1,12 @@ + +{$LR_BLOCK_H_L} {L_PORTAL_LINKS}{$LR_BLOCK_H_R} +
+ +
+{$LR_BLOCK_F_L}{$LR_BLOCK_F_R} \ No newline at end of file diff --git a/root/styles/prosilver/template/portal/modules/main_menu_new.html b/root/styles/prosilver/template/portal/modules/main_menu_new.html deleted file mode 100644 index c72bcafc..00000000 --- a/root/styles/prosilver/template/portal/modules/main_menu_new.html +++ /dev/null @@ -1,14 +0,0 @@ - -{$LR_BLOCK_H_L} {L_M_MENU}{$LR_BLOCK_H_R} -
- - - -
- -
-{$LR_BLOCK_F_L}{$LR_BLOCK_F_R} \ No newline at end of file diff --git a/root/styles/prosilver/template/portal/modules/main_menu_side.html b/root/styles/prosilver/template/portal/modules/main_menu_side.html index 1b38e7df..827b548c 100644 --- a/root/styles/prosilver/template/portal/modules/main_menu_side.html +++ b/root/styles/prosilver/template/portal/modules/main_menu_side.html @@ -1,29 +1,18 @@ {$LR_BLOCK_H_L} {L_M_MENU}{$LR_BLOCK_H_R}
- + +
- - + + +
{$LR_BLOCK_F_L}{$LR_BLOCK_F_R} \ No newline at end of file diff --git a/root/styles/prosilver/theme/images/portal/portal_links.png b/root/styles/prosilver/theme/images/portal/portal_links.png new file mode 100644 index 0000000000000000000000000000000000000000..03ef9a57007a727b45b9e6035796ae56819587bf GIT binary patch literal 1154 zcmV-|1bzF7P)2AgBPqel_T~GZf0u7O`*`xu(G#z4?CoIU z6gkGq{*~e9hy4s701!Y7AOjc}nt`~@+`w`D-Fe#|{eScQ$A1L){r}UyU;p>s{PsVf zWZw^V@zg2I9Of|13;+Sd%)np|bOE!ub*Ryf)=9dO)_T7f{`~yP@cZ9ChPPkeF+Bb7 zjN!+RcMP(k-x!Ror5G5Q*nt{9F+6(y5@;X?!{5KW4Bx&pGQ58Gi{bW#a}1wZ zPB5z2MHe$LFiHXh5R0S+PXwztAH%h;HVm8YurX+h0K@XjLxyWtfPusa3|67=FI{ z&9HyRE`}f9-!d>UvN3%B2J*s3hM$aF4D9^!3>>Wg8GinM!N4sfXA2MjK>)u010FO< zfZFVy0^HNC0QL3c01Ol?00j*o01X*000t5!0NCKa0PptX0RIU501Oij053IL03j$c z03H}20N}~V?gEJA@9$s#I7B%ZzB2&*{Bi?>)C(sDb}ktPZb20WK2a5h$1gTBJbm&6 z>>V?UOa^6HYX)wnCkzrC$_(3oeEkOy06_r0{{sE*0r3$Q5d{{SyDTmU8_L;wN) z008^?0092`000gY9RT|Y?Eoh$O#nYKQvm1exB$rCm;mJB+5q+P?dt-FnfjMBg5k(KmXl2 zzG@0U05LK%$XnPaRvhpt(qLENaA0`#g@NHa(B?ltSNvyWU|<6p#?8*az{LWLo&WC{ z%#;Ng&RqD+kl^oi@AJzerT_uN{GZ|9lh^lti0ErMS@<~1GVlWx3b8RT2y-wnh;lJ7 zhy$@GCj)~tKLdk>0w=@Em;V@YGHZT4xw^6lm=I3_1P~C50fyg$S1_g!1$Y)LHd&x!~MhW|E*my{o(hw#~XnP7s3nx2q3rt z48Y|3|L;YRm^dSYP!gx0fE5!Lhw$&;zyAMx|MC^X?