-
+
+ -
+
+ {L_ACP_PORTAL_MENU_PERMISSION_EXP}
+
+ -
+
+
+
@@ -97,14 +105,21 @@
{ICON_EDIT} {ICON_DELETE}
+
+
+ | {L_LINKS_NO_LINKS} |
+
-
+
+
+
+
{S_FORM_TOKEN}
-
+
\ 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 00000000..03ef9a57
Binary files /dev/null and b/root/styles/prosilver/theme/images/portal/portal_links.png differ