| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150 | <?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);}
 |