Mercurial > hg > rr-repo
diff sites/all/modules/ctools/includes/jump-menu.inc @ 0:ff03f76ab3fe
initial version
author | danieleb <danielebarchiesi@me.com> |
---|---|
date | Wed, 21 Aug 2013 18:51:11 +0100 |
parents | |
children |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/sites/all/modules/ctools/includes/jump-menu.inc Wed Aug 21 18:51:11 2013 +0100 @@ -0,0 +1,150 @@ +<?php + +/** + * @file + * Provides a simple "jump menu". + * + * A jump menu is a select box and an optional 'go' button which can be removed + * if javascript is in use. Each item is keyed to the href that the button + * should go to. With javascript, the page is immediately redirected. Without + * javascript, the form is submitted and a drupal_goto() is given. + * + */ + +/** + * Generate a jump menu form. + * + * This can either be used with drupal_get_form() or directly added to a + * form. The button provides its own submit handler so by default, other + * submit handlers will not be called. + * + * One note: Do not use #tree = TRUE or it will be unable to find the + * proper value. + * + * @code + * ctools_include('jump-menu'); + * $output = drupal_get_form('ctools_jump_menu', $targets, $options); + * @endcode + * + * @param $select + * An array suitable for use as the #options. The keys will be the direct + * URLs that will be jumped to, so you absolutely must encode these using + * url() in order for them to work reliably. + * + * @param $options + * $options may be an array with the following options: + * - 'title': The text to display for the #title attribute. + * - 'description': The text to display for the #description attribute. + * - 'default_value': The text to display for the #default_value attribute. + * - 'hide': If TRUE the go button will be set to hide via javascript and + * will submit on change. + * - 'button': The text to display on the button. + * - 'image': If set, an image button will be used instead, and the image + * set to this. + * - 'inline': If set to TRUE (default) the display will be forced inline. + */ +function ctools_jump_menu($form, &$form_state, $select, $options = array()) { + $options += array( + 'button' => t('Go'), + 'choose' => t('- Choose -'), + 'inline' => TRUE, + 'hide' => TRUE, + ); + + ctools_add_js('jump-menu'); + + if (!empty($options['choose'])) { + $select = array('' => $options['choose']) + $select; + } + + $form['jump'] = array( + '#type' => 'select', + '#options' => $select, + '#attributes' => array( + 'class' => array('ctools-jump-menu-select'), + ), + ); + + if (!empty($options['title'])) { + $form['jump']['#title'] = $options['title']; + } + + if (!empty($options['description'])) { + $form['jump']['#description'] = $options['description']; + } + + if (!empty($options['default_value'])) { + $form['jump']['#default_value'] = $options['default_value']; + } + + if (isset($options['image'])) { + $form['go'] = array( + '#type' => 'image_button', + '#src' => $options['image'], + '#submit' => array('ctools_jump_menu_submit'), + '#attributes' => array( + 'class' => array('ctools-jump-menu-button'), + ), + ); + } + else { + $form['go'] = array( + '#type' => 'submit', + '#value' => $options['button'], + '#submit' => array('ctools_jump_menu_submit'), + '#attributes' => array( + 'class' => array('ctools-jump-menu-button'), + ), + ); + } + + if ($options['inline']) { + $form['jump']['#prefix'] = '<div class="container-inline">'; + $form['go']['#suffix'] = '</div>'; + } + + if ($options['hide']) { + $form['jump']['#attributes']['class'][] = 'ctools-jump-menu-change'; + $form['go']['#attributes']['class'][] = 'ctools-jump-menu-hide'; + } + + return $form; +} + +/** + * Submit handler for the jump menu. + * + * This is normally only invoked upon submit without javascript enabled. + */ +function ctools_jump_menu_submit($form, &$form_state) { + if ($form_state['values']['jump'] === '') { + // We have nothing to do when the user has not selected any value. + return; + } + + // If the path we are redirecting to contains the string :: then treat the + // the string after the double colon as the path to redirect to. + // This allows duplicate paths to be used in jump menus for multiple options. + $redirect_array = explode("::", $form_state['values']['jump']); + + if(isset($redirect_array[1]) && !empty($redirect_array[1])){ + $redirect = $redirect_array[1]; + } + else { + $redirect = $form_state['values']['jump']; + } + + // If the path we are redirecting to starts with the base path (for example, + // "/somepath/node/1"), we need to strip the base path off before passing it + // to $form_state['redirect']. + $base_path = base_path(); + if (strpos($redirect, $base_path) === 0) { + $redirect = substr($redirect, strlen($base_path)); + } + + // Parse the URL so that query strings and fragments are preserved in the + // redirect. + $redirect = drupal_parse_url($redirect); + $redirect['path'] = urldecode($redirect['path']); + $form_state['redirect'] = array($redirect['path'], $redirect); +}