diff --git a/modules/shortcut/shortcut.admin.inc b/modules/shortcut/shortcut.admin.inc index 2e8ddb4..de1f460 100644 --- a/modules/shortcut/shortcut.admin.inc +++ b/modules/shortcut/shortcut.admin.inc @@ -275,7 +275,8 @@ function shortcut_set_customize($form, &$form_state, $shortcut_set) { foreach ($shortcut_set->links as $link) { $mlid = $link['mlid']; $status = $link['hidden'] ? 'disabled' : 'enabled'; - $form['shortcuts'][$status][$mlid]['name']['#markup'] = l($link['link_title'], $link['link_path']); + $options = isset($link['options']) ? $link['options'] : array(); + $form['shortcuts'][$status][$mlid]['name']['#markup'] = l($link['link_title'], $link['link_path'], $options); $form['shortcuts'][$status][$mlid]['weight'] = array( '#type' => 'weight', '#title' => t('Weight'), @@ -495,6 +496,11 @@ function _shortcut_link_form_elements($shortcut_link = NULL) { '#default_value' => $shortcut_link['link_path'], ); + // If the shortcut has a query string, make it editable as well. + if (!empty($shortcut_link['options']['query'])) { + $form['shortcut_link']['link_path']['#default_value'] .= '?' . drupal_http_build_query($shortcut_link['options']['query']); + } + $form['#validate'][] = 'shortcut_link_edit_validate'; $form['actions'] = array('#type' => 'actions'); @@ -519,6 +525,13 @@ function shortcut_link_edit_validate($form, &$form_state) { * Submit handler for shortcut_link_edit(). */ function shortcut_link_edit_submit($form, &$form_state) { + // Parse the query parameter. + if (strpos($form_state['values']['shortcut_link']['link_path'], '?') !== FALSE) { + list($link_path, $query_string) = explode('?', $form_state['values']['shortcut_link']['link_path']); + $form_state['values']['shortcut_link']['link_path'] = $link_path; + parse_str($query_string, $form_state['values']['shortcut_link']['options']['query']); + } + // Normalize the path in case it is an alias. $shortcut_path = drupal_get_normal_path($form_state['values']['shortcut_link']['link_path']); if (empty($shortcut_path)) { @@ -579,6 +592,16 @@ function shortcut_admin_add_link($shortcut_link, &$shortcut_set, $limit = NULL) } } + // Parse the query parameter and save it seperately. + if (strstr($shortcut_link['link_path'], '?')) { + list($path, $query_string) = explode('?', $shortcut_link['link_path']); + parse_str($query_string, $query); + $shortcut_link['link_path'] = $path; + $shortcut_link['options'] = array( + 'query' => $query, + ); + } + // Normalize the path in case it is an alias. $shortcut_link['link_path'] = drupal_get_normal_path($shortcut_link['link_path']); if (empty($shortcut_link['link_path'])) { diff --git a/modules/shortcut/shortcut.module b/modules/shortcut/shortcut.module index 2f6db0a..9ac102b 100644 --- a/modules/shortcut/shortcut.module +++ b/modules/shortcut/shortcut.module @@ -612,6 +612,11 @@ function shortcut_set_title_exists($title) { * @see menu_edit_item_validate() */ function shortcut_valid_link($path) { + // Ignore the query parameter if there is one. + $position = strpos($path, '?'); + if ($position !== FALSE) { + $path = drupal_substr($path, 0, $position); + } // Do not use URL aliases. $normal_path = drupal_get_normal_path($path); if ($path != $normal_path) { @@ -649,7 +654,9 @@ function shortcut_preprocess_page(&$variables) { // pages). if (shortcut_set_edit_access() && ($item = menu_get_item()) && $item['access']) { $link = $_GET['q']; - $query_parameters = drupal_get_query_parameters(); + // Allow query parameters in the shortcut link, with a few exceptions. + $query_parameters = drupal_get_query_parameters(NULL, array('q', 'render', 'page')); + dsm($query_parameters, '$query_parameters'); if (!empty($query_parameters)) { $link .= '?' . drupal_http_build_query($query_parameters); } @@ -663,7 +670,15 @@ function shortcut_preprocess_page(&$variables) { // Check if $link is already a shortcut and set $link_mode accordingly. foreach ($shortcut_set->links as $shortcut) { - if ($link == $shortcut['link_path']) { + if (!empty($shortcut['options']) && !empty($shortcut['options']['query'])) { + // Check all url with get parameters on same format as $link. + $link_shortcut = $shortcut['link_path'] . '?' . drupal_http_build_query($shortcut['options']['query']); + if ($link == $link_shortcut) { + $mlid = $shortcut['mlid']; + break; + } + } + elseif ($link == $shortcut['link_path']) { $mlid = $shortcut['mlid']; break; }