From 8923386f9bda31429ba883d015be0b0db778a333 Mon Sep 17 00:00:00 2001 From: Alex <40072887+alexdcrane@users.noreply.github.com> Date: Wed, 22 Apr 2026 21:01:04 +0000 Subject: [PATCH] IVR Menus: Preserve query string parameters across list and edit pages (#7899) * IVR Menus: Preserve query string parameters across list and edit pages * Update ivr_menu_edit.php --- app/ivr_menus/ivr_menu_edit.php | 36 ++++++++++++-- app/ivr_menus/ivr_menus.php | 86 ++++++++++++++++++--------------- 2 files changed, 78 insertions(+), 44 deletions(-) diff --git a/app/ivr_menus/ivr_menu_edit.php b/app/ivr_menus/ivr_menu_edit.php index 5850f3966..7f989dd4c 100644 --- a/app/ivr_menus/ivr_menu_edit.php +++ b/app/ivr_menus/ivr_menu_edit.php @@ -66,6 +66,32 @@ $ivr_menu_ringback = ''; } +// Set variables from http GET parameters + $page = is_numeric($_GET['page'] ?? '') ? $_GET['page'] : 0; + $order_by = preg_replace('#[^a-zA-Z0-9_\-]#', '', ($_GET['order_by'] ?? 'ivr_menu_name')); + $order = ($_GET['order'] ?? '') === 'desc' ? 'desc' : 'asc'; + $search = $_GET['search'] ?? ''; + $show = $_GET['show'] ?? ''; + +// Build the query string + $param = []; + if (!empty($page)) { + $param['page'] = $page; + } + if (!empty($_GET['order_by'])) { + $param['order_by'] = $order_by; + } + if (!empty($_GET['order'])) { + $param['order'] = $order; + } + if (!empty($search)) { + $param['search'] = $search; + } + if (!empty($show) && $show == 'all' && permission_exists('ivr_menu_all')) { + $param['show'] = $show; + } + $query_string = http_build_query($param); + //action add or update if (!empty($_REQUEST["id"]) && is_uuid($_REQUEST["id"]) || !empty($_REQUEST["ivr_menu_uuid"]) && is_uuid($_REQUEST["ivr_menu_uuid"])) { $action = "update"; @@ -87,7 +113,7 @@ if ($total_ivr_menus >= $settings->get('limit', 'ivr_menus')) { message::add($text['message-maximum_ivr_menus'].' '.$settings->get('limit', 'ivr_menus'), 'negative'); - header('Location: ivr_menus.php'); + header('Location: ivr_menus.php'.($query_string ? '?'.$query_string : '')); exit; } } @@ -115,7 +141,7 @@ break; } - header('Location: ivr_menus.php'); + header('Location: ivr_menus.php'.($query_string ? '?'.$query_string : '')); exit; } @@ -203,7 +229,7 @@ $token = new token; if (!$token->validate($_SERVER['PHP_SELF'])) { message::add($text['message-invalid_token'],'negative'); - header('Location: ivr_menus.php'); + header('Location: ivr_menus.php'.($query_string ? '?'.$query_string : '')); exit; } @@ -465,7 +491,7 @@ } //redirect the user - header("Location: ivr_menu_edit.php?id=".urlencode($ivr_menu_uuid)); + header("Location: ivr_menu_edit.php?id=".urlencode($ivr_menu_uuid).($query_string ? '&'.$query_string : '')); return; } @@ -731,7 +757,7 @@ echo "
\n"; echo "
".$text['header-ivr_menu']."
\n"; echo "
\n"; - echo button::create(['type'=>'button','label'=>$text['button-back'],'icon'=>$settings->get('theme', 'button_icon_back'),'id'=>'btn_back','link'=>'ivr_menus.php']); + echo button::create(['type'=>'button','label'=>$text['button-back'],'icon'=>$settings->get('theme', 'button_icon_back'),'id'=>'btn_back','link'=>'ivr_menus.php'.($query_string ? '?'.$query_string : '')]); if ($action == "update") { if (permission_exists('ivr_menu_add') && (empty($settings->get('limit', 'ivr_menus')) || $total_ivr_menus < $settings->get('limit', 'ivr_menus'))) { $button_margin = 'margin-left: 15px;'; diff --git a/app/ivr_menus/ivr_menus.php b/app/ivr_menus/ivr_menus.php index 1f070aa94..bda739907 100644 --- a/app/ivr_menus/ivr_menus.php +++ b/app/ivr_menus/ivr_menus.php @@ -17,7 +17,7 @@ The Initial Developer of the Original Code is Mark J Crane - Portions created by the Initial Developer are Copyright (C) 2008-2025 + Portions created by the Initial Developer are Copyright (C) 2008-2026 the Initial Developer. All Rights Reserved. Contributor(s): @@ -39,15 +39,40 @@ $language = new text; $text = $language->get(); +// Set variables from http GET parameters + $page = is_numeric($_GET['page'] ?? '') ? $_GET['page'] : 0; + $order_by = preg_replace('#[^a-zA-Z0-9_\-]#', '', ($_GET['order_by'] ?? 'ivr_menu_name')); + $order = ($_GET['order'] ?? '') === 'desc' ? 'desc' : 'asc'; + $sort = $order_by == 'ivr_menu_extension' ? 'natural' : null; + $search = $_GET['search'] ?? ''; + $show = $_GET['show'] ?? ''; + +// Build the query string + $param = []; + if (!empty($page)) { + $param['page'] = $page; + } + if (!empty($_GET['order_by'])) { + $param['order_by'] = $order_by; + } + if (!empty($_GET['order'])) { + $param['order'] = $order; + } + if (!empty($search)) { + $param['search'] = $search; + } + if (!empty($show) && $show == 'all' && permission_exists('ivr_menu_all')) { + $param['show'] = $show; + } + $query_string = http_build_query($param); + //define defaults $action = ''; - $search = ''; $ivr_menus = ''; //get posted data if (!empty($_POST['ivr_menus'])) { $action = $_POST['action']; - $search = $_POST['search'] ?? ''; $ivr_menus = $_POST['ivr_menus']; } @@ -60,7 +85,7 @@ if ($action == 'copy' && $total_ivr_menus >= $settings->get('limit', 'ivr_menus')) { message::add($text['message-maximum_ivr_menus'].' '.$settings->get('limit', 'ivr_menus'), 'negative'); - header('Location: ivr_menus.php'); + header('Location: ivr_menus.php'.($query_string ? '?'.$query_string : '')); exit; } } @@ -88,19 +113,10 @@ break; } - header('Location: ivr_menus.php'.(!empty($search) ? '?search='.urlencode($search) : '')); + header('Location: ivr_menus.php'.($query_string ? '?'.$query_string : '')); exit; } -//get order and order by - $order_by = $_GET["order_by"] ?? ''; - $order = $_GET["order"] ?? ''; - $sort = $order_by == 'ivr_menu_extension' ? 'natural' : null; - -//add the search variable - $search = $_GET["search"] ?? ''; - $show = $_GET["show"] ?? ''; - //set from session variables $list_row_edit_button = $settings->get('theme', 'list_row_edit_button', false); @@ -114,25 +130,19 @@ $parameters['domain_uuid'] = $_SESSION['domain_uuid']; } if (!empty($search)) { - $search = strtolower($search); $sql .= "and ("; $sql .= " lower(ivr_menu_name) like :search "; $sql .= " or lower(ivr_menu_extension) like :search "; $sql .= " or lower(ivr_menu_description) like :search "; $sql .= ")"; - $parameters['search'] = '%'.$search.'%'; + $parameters['search'] = '%'.lower_case($search).'%'; } $num_rows = $database->select($sql, $parameters ?? [], 'column'); //prepare to page the results $rows_per_page = $settings->get('domain', 'paging', 50); - $param = "&search=".urlencode($search); - if ($show == "all" && permission_exists('ivr_menu_all')) { - $param .= "&show=all"; - } - $page = !empty($_GET['page']) ? $_GET['page'] : 0; - list($paging_controls, $rows_per_page) = paging($num_rows, $param, $rows_per_page); - list($paging_controls_mini, $rows_per_page) = paging($num_rows, $param, $rows_per_page, true); + list($paging_controls, $rows_per_page) = paging($num_rows, $query_string, $rows_per_page); + list($paging_controls_mini, $rows_per_page) = paging($num_rows, $query_string, $rows_per_page, true); $offset = $rows_per_page * $page; //get the list @@ -152,13 +162,12 @@ $parameters['domain_uuid'] = $_SESSION['domain_uuid']; } if (!empty($search)) { - $search = strtolower($search); $sql .= "and ("; $sql .= " lower(ivr_menu_name) like :search "; $sql .= " or lower(ivr_menu_extension) like :search "; $sql .= " or lower(ivr_menu_description) like :search "; $sql .= ")"; - $parameters['search'] = '%'.$search.'%'; + $parameters['search'] = '%'.lower_case($search).'%'; } $sql .= order_by($order_by, $order, 'ivr_menu_name', 'asc', $sort); $sql .= limit_offset($rows_per_page, $offset); @@ -178,7 +187,7 @@ echo "
".$text['title-ivr_menus']."
".number_format($num_rows)."
\n"; echo "
\n"; if (permission_exists('ivr_menu_add')) { - echo button::create(['type'=>'button','label'=>$text['button-add'],'icon'=>$settings->get('theme', 'button_icon_add'),'id'=>'btn_add','link'=>'ivr_menu_edit.php']); + echo button::create(['type'=>'button','label'=>$text['button-add'],'icon'=>$settings->get('theme', 'button_icon_add'),'id'=>'btn_add','link'=>'ivr_menu_edit.php'.($query_string ? '?'.$query_string : '')]); } if (permission_exists('ivr_menu_add')) { echo button::create(['type'=>'button','label'=>$text['button-copy'],'icon'=>$settings->get('theme', 'button_icon_copy'),'id'=>'btn_copy','name'=>'btn_copy','style'=>'display: none;','onclick'=>"modal_open('modal-copy','btn_copy');"]); @@ -190,14 +199,14 @@ echo button::create(['type'=>'button','label'=>$text['button-delete'],'icon'=>$settings->get('theme', 'button_icon_delete'),'id'=>'btn_delete','name'=>'btn_delete','style'=>'display: none;','onclick'=>"modal_open('modal-delete','btn_delete');"]); } echo "