danielebarchiesi@0: 'Chaos Tools AJAX Demo', danielebarchiesi@0: 'page callback' => 'ctools_ajax_sample_page', danielebarchiesi@0: 'access callback' => TRUE, danielebarchiesi@0: 'type' => MENU_NORMAL_ITEM, danielebarchiesi@0: ); danielebarchiesi@0: $items['ctools_ajax_sample/simple_form'] = array( danielebarchiesi@0: 'title' => 'Simple Form', danielebarchiesi@0: 'page callback' => 'ctools_ajax_simple_form', danielebarchiesi@0: 'access callback' => TRUE, danielebarchiesi@0: 'type' => MENU_CALLBACK, danielebarchiesi@0: ); danielebarchiesi@0: $items['ctools_ajax_sample/%ctools_js/hello'] = array( danielebarchiesi@0: 'title' => 'Hello World', danielebarchiesi@0: 'page callback' => 'ctools_ajax_sample_hello', danielebarchiesi@0: 'page arguments' => array(1), danielebarchiesi@0: 'access callback' => TRUE, danielebarchiesi@0: 'type' => MENU_CALLBACK, danielebarchiesi@0: ); danielebarchiesi@0: $items['ctools_ajax_sample/%ctools_js/tablenix/%'] = array( danielebarchiesi@0: 'title' => 'Hello World', danielebarchiesi@0: 'page callback' => 'ctools_ajax_sample_tablenix', danielebarchiesi@0: 'page arguments' => array(1, 3), danielebarchiesi@0: 'access callback' => TRUE, danielebarchiesi@0: 'type' => MENU_CALLBACK, danielebarchiesi@0: ); danielebarchiesi@0: $items['ctools_ajax_sample/%ctools_js/login'] = array( danielebarchiesi@0: 'title' => 'Login', danielebarchiesi@0: 'page callback' => 'ctools_ajax_sample_login', danielebarchiesi@0: 'page arguments' => array(1), danielebarchiesi@0: 'access callback' => TRUE, danielebarchiesi@0: 'type' => MENU_CALLBACK, danielebarchiesi@0: ); danielebarchiesi@0: $items['ctools_ajax_sample/%ctools_js/animal'] = array( danielebarchiesi@0: 'title' => 'Animal', danielebarchiesi@0: 'page callback' => 'ctools_ajax_sample_animal', danielebarchiesi@0: 'page arguments' => array(1), danielebarchiesi@0: 'access callback' => TRUE, danielebarchiesi@0: 'type' => MENU_CALLBACK, danielebarchiesi@0: ); danielebarchiesi@0: $items['ctools_ajax_sample/%ctools_js/login/%'] = array( danielebarchiesi@0: 'title' => 'Post-Login Action', danielebarchiesi@0: 'page callback' => 'ctools_ajax_sample_login_success', danielebarchiesi@0: 'page arguments' => array(1, 3), danielebarchiesi@0: 'access callback' => TRUE, danielebarchiesi@0: 'type' => MENU_CALLBACK, danielebarchiesi@0: ); danielebarchiesi@0: $items['ctools_ajax_sample/jumped'] = array( danielebarchiesi@0: 'title' => 'Successful Jumping', danielebarchiesi@0: 'page callback' => 'ctools_ajax_sample_jump_menu_page', danielebarchiesi@0: 'access callback' => TRUE, danielebarchiesi@0: 'type' => MENU_NORMAL_ITEM, danielebarchiesi@0: ); danielebarchiesi@0: danielebarchiesi@0: return $items; danielebarchiesi@0: } danielebarchiesi@0: danielebarchiesi@0: function ctools_ajax_simple_form() { danielebarchiesi@0: ctools_include('content'); danielebarchiesi@0: ctools_include('context'); danielebarchiesi@0: $node = node_load(1); danielebarchiesi@0: $context = ctools_context_create('node', $node); danielebarchiesi@0: $context = array('context_node_1' => $context); danielebarchiesi@0: return ctools_content_render('node_comment_form', 'node_comment_form', ctools_ajax_simple_form_pane(), array(), array(), $context); danielebarchiesi@0: } danielebarchiesi@0: danielebarchiesi@0: function ctools_ajax_simple_form_pane() { danielebarchiesi@0: $configuration = array( danielebarchiesi@0: 'anon_links' => 0, danielebarchiesi@0: 'context' => 'context_node_1', danielebarchiesi@0: 'override_title' => 0, danielebarchiesi@0: 'override_title_text' => '', danielebarchiesi@0: ); danielebarchiesi@0: return $configuration; danielebarchiesi@0: } danielebarchiesi@0: danielebarchiesi@0: /** danielebarchiesi@0: * Implementation of hook_theme() danielebarchiesi@0: * danielebarchiesi@0: * Render some basic output for this module. danielebarchiesi@0: */ danielebarchiesi@0: function ctools_ajax_sample_theme() { danielebarchiesi@0: return array( danielebarchiesi@0: // Sample theme functions. danielebarchiesi@0: 'ctools_ajax_sample_container' => array( danielebarchiesi@0: 'arguments' => array('content' => NULL), danielebarchiesi@0: ), danielebarchiesi@0: ); danielebarchiesi@0: } danielebarchiesi@0: danielebarchiesi@0: // --------------------------------------------------------------------------- danielebarchiesi@0: // Page callbacks danielebarchiesi@0: danielebarchiesi@0: /** danielebarchiesi@0: * Page callback to display links and render a container for AJAX stuff. danielebarchiesi@0: */ danielebarchiesi@0: function ctools_ajax_sample_page() { danielebarchiesi@0: global $user; danielebarchiesi@0: danielebarchiesi@0: // Include the CTools tools that we need. danielebarchiesi@0: ctools_include('ajax'); danielebarchiesi@0: ctools_include('modal'); danielebarchiesi@0: danielebarchiesi@0: // Add CTools' javascript to the page. danielebarchiesi@0: ctools_modal_add_js(); danielebarchiesi@0: danielebarchiesi@0: // Create our own javascript that will be used to theme a modal. danielebarchiesi@0: $sample_style = array( danielebarchiesi@0: 'ctools-sample-style' => array( danielebarchiesi@0: 'modalSize' => array( danielebarchiesi@0: 'type' => 'fixed', danielebarchiesi@0: 'width' => 500, danielebarchiesi@0: 'height' => 300, danielebarchiesi@0: 'addWidth' => 20, danielebarchiesi@0: 'addHeight' => 15, danielebarchiesi@0: ), danielebarchiesi@0: 'modalOptions' => array( danielebarchiesi@0: 'opacity' => .5, danielebarchiesi@0: 'background-color' => '#000', danielebarchiesi@0: ), danielebarchiesi@0: 'animation' => 'fadeIn', danielebarchiesi@0: 'modalTheme' => 'CToolsSampleModal', danielebarchiesi@0: 'throbber' => theme('image', array('path' => ctools_image_path('ajax-loader.gif', 'ctools_ajax_sample'), 'alt' => t('Loading...'), 'title' => t('Loading'))), danielebarchiesi@0: ), danielebarchiesi@0: ); danielebarchiesi@0: danielebarchiesi@0: drupal_add_js($sample_style, 'setting'); danielebarchiesi@0: danielebarchiesi@0: // Since we have our js, css and images in well-known named directories, danielebarchiesi@0: // CTools makes it easy for us to just use them without worrying about danielebarchiesi@0: // using drupal_get_path() and all that ugliness. danielebarchiesi@0: ctools_add_js('ctools-ajax-sample', 'ctools_ajax_sample'); danielebarchiesi@0: ctools_add_css('ctools-ajax-sample', 'ctools_ajax_sample'); danielebarchiesi@0: danielebarchiesi@0: // Create a list of clickable links. danielebarchiesi@0: $links = array(); danielebarchiesi@0: danielebarchiesi@0: // Only show login links to the anonymous user. danielebarchiesi@0: if ($user->uid == 0) { danielebarchiesi@0: $links[] = ctools_modal_text_button(t('Modal Login (default style)'), 'ctools_ajax_sample/nojs/login', t('Login via modal')); danielebarchiesi@0: danielebarchiesi@0: // The extra class points to the info in ctools-sample-style which we added danielebarchiesi@0: // to the settings, prefixed with 'ctools-modal'. danielebarchiesi@0: $links[] = ctools_modal_text_button(t('Modal Login (custom style)'), 'ctools_ajax_sample/nojs/login', t('Login via modal'), 'ctools-modal-ctools-sample-style'); danielebarchiesi@0: } danielebarchiesi@0: danielebarchiesi@0: // Four ways to do our animal picking wizard. danielebarchiesi@0: $button_form = ctools_ajax_sample_ajax_button_form(); danielebarchiesi@0: $links[] = l(t('Wizard (no modal)'), 'ctools_ajax_sample/nojs/animal'); danielebarchiesi@0: $links[] = ctools_modal_text_button(t('Wizard (default modal)'), 'ctools_ajax_sample/nojs/animal', t('Pick an animal')); danielebarchiesi@0: $links[] = ctools_modal_text_button(t('Wizard (custom modal)'), 'ctools_ajax_sample/nojs/animal', t('Pick an animal'), 'ctools-modal-ctools-sample-style'); danielebarchiesi@0: $links[] = drupal_render($button_form); danielebarchiesi@0: danielebarchiesi@0: $links[] = ctools_ajax_text_button(t('Hello world!'), "ctools_ajax_sample/nojs/hello", t('Replace text with "hello world"')); danielebarchiesi@0: danielebarchiesi@0: $output = theme('item_list', array('items' => $links, 'title' => t('Actions'))); danielebarchiesi@0: danielebarchiesi@0: // This container will have data AJAXed into it. danielebarchiesi@0: $output .= theme('ctools_ajax_sample_container', array('content' => '

' . t('Sample Content') . '

')); danielebarchiesi@0: danielebarchiesi@0: // Create a table that we can have data removed from via AJAX. danielebarchiesi@0: $header = array(t('Row'), t('Content'), t('Actions')); danielebarchiesi@0: $rows = array(); danielebarchiesi@0: for($i = 1; $i < 11; $i++) { danielebarchiesi@0: $rows[] = array( danielebarchiesi@0: 'class' => array('ajax-sample-row-'. $i), danielebarchiesi@0: 'data' => array( danielebarchiesi@0: $i, danielebarchiesi@0: md5($i), danielebarchiesi@0: ctools_ajax_text_button("remove", "ctools_ajax_sample/nojs/tablenix/$i", t('Delete this row')), danielebarchiesi@0: ), danielebarchiesi@0: ); danielebarchiesi@0: } danielebarchiesi@0: danielebarchiesi@0: $output .= theme('table', array('header' => $header, 'rows' => $rows, array('class' => array('ajax-sample-table')))); danielebarchiesi@0: danielebarchiesi@0: // Show examples of ctools javascript widgets danielebarchiesi@0: $output .= '

'. t('CTools Javascript Widgets') .'

'; danielebarchiesi@0: danielebarchiesi@0: // Create a drop down menu danielebarchiesi@0: $links = array(); danielebarchiesi@0: $links[] = array('title' => t('Link 1'), 'href' => $_GET['q']); danielebarchiesi@0: $links[] = array('title' => t('Link 2'), 'href' => $_GET['q']); danielebarchiesi@0: $links[] = array('title' => t('Link 3'), 'href' => $_GET['q']); danielebarchiesi@0: danielebarchiesi@0: $output .= '

' . t('Drop Down Menu') . '

'; danielebarchiesi@0: $output .= theme('ctools_dropdown', array('title' => t('Click to Drop Down'), 'links' => $links)); danielebarchiesi@0: danielebarchiesi@0: // Create a collapsible div danielebarchiesi@0: $handle = t('Click to Collapse'); danielebarchiesi@0: $content = 'Nulla ligula ante, aliquam at adipiscing egestas, varius vel arcu. Etiam laoreet elementum mi vel consequat. Etiam scelerisque lorem vel neque consequat quis bibendum libero congue. Nulla facilisi. Mauris a elit a leo feugiat porta. Phasellus placerat cursus est vitae elementum.'; danielebarchiesi@0: $output .= '

'. t('Collapsible Div') .'

'; danielebarchiesi@0: $output .= theme('ctools_collapsible', array('handle' => $handle, 'content' => $content, 'collapsed' => FALSE)); danielebarchiesi@0: danielebarchiesi@0: // Create a jump menu danielebarchiesi@0: ctools_include('jump-menu'); danielebarchiesi@0: $form = drupal_get_form('ctools_ajax_sample_jump_menu_form'); danielebarchiesi@0: $output .= '

'. t('Jump Menu') .'

'; danielebarchiesi@0: $output .= drupal_render($form); danielebarchiesi@0: danielebarchiesi@0: return array('markup' => array('#markup' => $output)); danielebarchiesi@0: } danielebarchiesi@0: danielebarchiesi@0: /** danielebarchiesi@0: * Returns a "take it all over" hello world style request. danielebarchiesi@0: */ danielebarchiesi@0: function ctools_ajax_sample_hello($js = NULL) { danielebarchiesi@0: $output = '

' . t('Hello World') . '

'; danielebarchiesi@0: if ($js) { danielebarchiesi@0: ctools_include('ajax'); danielebarchiesi@0: $commands = array(); danielebarchiesi@0: $commands[] = ajax_command_html('#ctools-sample', $output); danielebarchiesi@0: print ajax_render($commands); // this function exits. danielebarchiesi@0: exit; danielebarchiesi@0: } danielebarchiesi@0: else { danielebarchiesi@0: return $output; danielebarchiesi@0: } danielebarchiesi@0: } danielebarchiesi@0: danielebarchiesi@0: /** danielebarchiesi@0: * Nix a row from a table and restripe. danielebarchiesi@0: */ danielebarchiesi@0: function ctools_ajax_sample_tablenix($js, $row) { danielebarchiesi@0: if (!$js) { danielebarchiesi@0: // We don't support degrading this from js because we're not danielebarchiesi@0: // using the server to remember the state of the table. danielebarchiesi@0: return MENU_ACCESS_DENIED; danielebarchiesi@0: } danielebarchiesi@0: ctools_include('ajax'); danielebarchiesi@0: danielebarchiesi@0: $commands = array(); danielebarchiesi@0: $commands[] = ajax_command_remove("tr.ajax-sample-row-$row"); danielebarchiesi@0: $commands[] = ajax_command_restripe("table.ajax-sample-table"); danielebarchiesi@0: print ajax_render($commands); danielebarchiesi@0: exit; danielebarchiesi@0: } danielebarchiesi@0: danielebarchiesi@0: /** danielebarchiesi@0: * A modal login callback. danielebarchiesi@0: */ danielebarchiesi@0: function ctools_ajax_sample_login($js = NULL) { danielebarchiesi@0: // Fall back if $js is not set. danielebarchiesi@0: if (!$js) { danielebarchiesi@0: return drupal_get_form('user_login'); danielebarchiesi@0: } danielebarchiesi@0: danielebarchiesi@0: ctools_include('modal'); danielebarchiesi@0: ctools_include('ajax'); danielebarchiesi@0: $form_state = array( danielebarchiesi@0: 'title' => t('Login'), danielebarchiesi@0: 'ajax' => TRUE, danielebarchiesi@0: ); danielebarchiesi@0: $output = ctools_modal_form_wrapper('user_login', $form_state); danielebarchiesi@0: if (!empty($form_state['executed'])) { danielebarchiesi@0: // We'll just overwrite the form output if it was successful. danielebarchiesi@0: $output = array(); danielebarchiesi@0: $inplace = ctools_ajax_text_button(t('remain here'), 'ctools_ajax_sample/nojs/login/inplace', t('Go to your account')); danielebarchiesi@0: $account = ctools_ajax_text_button(t('your account'), 'ctools_ajax_sample/nojs/login/user', t('Go to your account')); danielebarchiesi@0: $output[] = ctools_modal_command_display(t('Login Success'), ''); danielebarchiesi@0: } danielebarchiesi@0: print ajax_render($output); danielebarchiesi@0: exit; danielebarchiesi@0: } danielebarchiesi@0: danielebarchiesi@0: /** danielebarchiesi@0: * Post-login processor: should we go to the user account or stay in place? danielebarchiesi@0: */ danielebarchiesi@0: function ctools_ajax_sample_login_success($js, $action) { danielebarchiesi@0: if (!$js) { danielebarchiesi@0: // we should never be here out of ajax context danielebarchiesi@0: return MENU_NOT_FOUND; danielebarchiesi@0: } danielebarchiesi@0: danielebarchiesi@0: ctools_include('ajax'); danielebarchiesi@0: ctools_add_js('ajax-responder'); danielebarchiesi@0: $commands = array(); danielebarchiesi@0: if ($action == 'inplace') { danielebarchiesi@0: // stay here danielebarchiesi@0: $commands[] = ctools_ajax_command_reload(); danielebarchiesi@0: } danielebarchiesi@0: else { danielebarchiesi@0: // bounce bounce danielebarchiesi@0: $commands[] = ctools_ajax_command_redirect('user'); danielebarchiesi@0: } danielebarchiesi@0: print ajax_render($commands); danielebarchiesi@0: exit; danielebarchiesi@0: } danielebarchiesi@0: danielebarchiesi@0: /** danielebarchiesi@0: * A modal login callback. danielebarchiesi@0: */ danielebarchiesi@0: function ctools_ajax_sample_animal($js = NULL, $step = NULL) { danielebarchiesi@0: if ($js) { danielebarchiesi@0: ctools_include('modal'); danielebarchiesi@0: ctools_include('ajax'); danielebarchiesi@0: } danielebarchiesi@0: danielebarchiesi@0: $form_info = array( danielebarchiesi@0: 'id' => 'animals', danielebarchiesi@0: 'path' => "ctools_ajax_sample/" . ($js ? 'ajax' : 'nojs') . "/animal/%step", danielebarchiesi@0: 'show trail' => TRUE, danielebarchiesi@0: 'show back' => TRUE, danielebarchiesi@0: 'show cancel' => TRUE, danielebarchiesi@0: 'show return' => FALSE, danielebarchiesi@0: 'next callback' => 'ctools_ajax_sample_wizard_next', danielebarchiesi@0: 'finish callback' => 'ctools_ajax_sample_wizard_finish', danielebarchiesi@0: 'cancel callback' => 'ctools_ajax_sample_wizard_cancel', danielebarchiesi@0: // this controls order, as well as form labels danielebarchiesi@0: 'order' => array( danielebarchiesi@0: 'start' => t('Choose animal'), danielebarchiesi@0: ), danielebarchiesi@0: // here we map a step to a form id. danielebarchiesi@0: 'forms' => array( danielebarchiesi@0: // e.g. this for the step at wombat/create danielebarchiesi@0: 'start' => array( danielebarchiesi@0: 'form id' => 'ctools_ajax_sample_start' danielebarchiesi@0: ), danielebarchiesi@0: ), danielebarchiesi@0: ); danielebarchiesi@0: danielebarchiesi@0: // We're not using any real storage here, so we're going to set our danielebarchiesi@0: // object_id to 1. When using wizard forms, id management turns danielebarchiesi@0: // out to be one of the hardest parts. Editing an object with an id danielebarchiesi@0: // is easy, but new objects don't usually have ids until somewhere danielebarchiesi@0: // in creation. danielebarchiesi@0: // danielebarchiesi@0: // We skip all this here by just using an id of 1. danielebarchiesi@0: danielebarchiesi@0: $object_id = 1; danielebarchiesi@0: danielebarchiesi@0: if (empty($step)) { danielebarchiesi@0: // We reset the form when $step is NULL because that means they have danielebarchiesi@0: // for whatever reason started over. danielebarchiesi@0: ctools_ajax_sample_cache_clear($object_id); danielebarchiesi@0: $step = 'start'; danielebarchiesi@0: } danielebarchiesi@0: danielebarchiesi@0: // This automatically gets defaults if there wasn't anything saved. danielebarchiesi@0: $object = ctools_ajax_sample_cache_get($object_id); danielebarchiesi@0: danielebarchiesi@0: $animals = ctools_ajax_sample_animals(); danielebarchiesi@0: danielebarchiesi@0: // Make sure we can't somehow accidentally go to an invalid animal. danielebarchiesi@0: if (empty($animals[$object->type])) { danielebarchiesi@0: $object->type = 'unknown'; danielebarchiesi@0: } danielebarchiesi@0: danielebarchiesi@0: // Now that we have our object, dynamically add the animal's form. danielebarchiesi@0: if ($object->type == 'unknown') { danielebarchiesi@0: // If they haven't selected a type, add a form that doesn't exist yet. danielebarchiesi@0: $form_info['order']['unknown'] = t('Configure animal'); danielebarchiesi@0: $form_info['forms']['unknown'] = array('form id' => 'nothing'); danielebarchiesi@0: } danielebarchiesi@0: else { danielebarchiesi@0: // Add the selected animal to the order so that it shows up properly in the trail. danielebarchiesi@0: $form_info['order'][$object->type] = $animals[$object->type]['config title']; danielebarchiesi@0: } danielebarchiesi@0: danielebarchiesi@0: // Make sure all animals forms are represented so that the next stuff can danielebarchiesi@0: // work correctly: danielebarchiesi@0: foreach ($animals as $id => $animal) { danielebarchiesi@0: $form_info['forms'][$id] = array('form id' => $animals[$id]['form']); danielebarchiesi@0: } danielebarchiesi@0: danielebarchiesi@0: $form_state = array( danielebarchiesi@0: 'ajax' => $js, danielebarchiesi@0: // Put our object and ID into the form state cache so we can easily find danielebarchiesi@0: // it. danielebarchiesi@0: 'object_id' => $object_id, danielebarchiesi@0: 'object' => &$object, danielebarchiesi@0: ); danielebarchiesi@0: danielebarchiesi@0: // Send this all off to our form. This is like drupal_get_form only wizardy. danielebarchiesi@0: ctools_include('wizard'); danielebarchiesi@0: $form = ctools_wizard_multistep_form($form_info, $step, $form_state); danielebarchiesi@0: $output = drupal_render($form); danielebarchiesi@0: danielebarchiesi@0: if ($output === FALSE || !empty($form_state['complete'])) { danielebarchiesi@0: // This creates a string based upon the animal and its setting using danielebarchiesi@0: // function indirection. danielebarchiesi@0: $animal = $animals[$object->type]['output']($object); danielebarchiesi@0: } danielebarchiesi@0: danielebarchiesi@0: // If $output is FALSE, there was no actual form. danielebarchiesi@0: if ($js) { danielebarchiesi@0: // If javascript is active, we have to use a render array. danielebarchiesi@0: $commands = array(); danielebarchiesi@0: if ($output === FALSE || !empty($form_state['complete'])) { danielebarchiesi@0: // Dismiss the modal. danielebarchiesi@0: $commands[] = ajax_command_html('#ctools-sample', $animal); danielebarchiesi@0: $commands[] = ctools_modal_command_dismiss(); danielebarchiesi@0: } danielebarchiesi@0: else if (!empty($form_state['cancel'])) { danielebarchiesi@0: // If cancelling, return to the activity. danielebarchiesi@0: $commands[] = ctools_modal_command_dismiss(); danielebarchiesi@0: } danielebarchiesi@0: else { danielebarchiesi@0: $commands = ctools_modal_form_render($form_state, $output); danielebarchiesi@0: } danielebarchiesi@0: print ajax_render($commands); danielebarchiesi@0: exit; danielebarchiesi@0: } danielebarchiesi@0: else { danielebarchiesi@0: if ($output === FALSE || !empty($form_state['complete'])) { danielebarchiesi@0: return $animal; danielebarchiesi@0: } danielebarchiesi@0: else if (!empty($form_state['cancel'])) { danielebarchiesi@0: drupal_goto('ctools_ajax_sample'); danielebarchiesi@0: } danielebarchiesi@0: else { danielebarchiesi@0: return $output; danielebarchiesi@0: } danielebarchiesi@0: } danielebarchiesi@0: } danielebarchiesi@0: danielebarchiesi@0: // --------------------------------------------------------------------------- danielebarchiesi@0: // Themes danielebarchiesi@0: danielebarchiesi@0: /** danielebarchiesi@0: * Theme function for main rendered output. danielebarchiesi@0: */ danielebarchiesi@0: function theme_ctools_ajax_sample_container($vars) { danielebarchiesi@0: $output = '
'; danielebarchiesi@0: $output .= $vars['content']; danielebarchiesi@0: $output .= '
'; danielebarchiesi@0: danielebarchiesi@0: return $output; danielebarchiesi@0: } danielebarchiesi@0: danielebarchiesi@0: // --------------------------------------------------------------------------- danielebarchiesi@0: // Stuff needed for our little wizard. danielebarchiesi@0: danielebarchiesi@0: /** danielebarchiesi@0: * Get a list of our animals and associated forms. danielebarchiesi@0: * danielebarchiesi@0: * What we're doing is making it easy to add more animals in just one place, danielebarchiesi@0: * which is often how it will work in the real world. If using CTools, what danielebarchiesi@0: * you would probably really have, here, is a set of plugins for each animal. danielebarchiesi@0: */ danielebarchiesi@0: function ctools_ajax_sample_animals() { danielebarchiesi@0: return array( danielebarchiesi@0: 'sheep' => array( danielebarchiesi@0: 'title' => t('Sheep'), danielebarchiesi@0: 'config title' => t('Configure sheep'), danielebarchiesi@0: 'form' => 'ctools_ajax_sample_configure_sheep', danielebarchiesi@0: 'output' => 'ctools_ajax_sample_show_sheep', danielebarchiesi@0: ), danielebarchiesi@0: 'lizard' => array( danielebarchiesi@0: 'title' => t('Lizard'), danielebarchiesi@0: 'config title' => t('Configure lizard'), danielebarchiesi@0: 'form' => 'ctools_ajax_sample_configure_lizard', danielebarchiesi@0: 'output' => 'ctools_ajax_sample_show_lizard', danielebarchiesi@0: ), danielebarchiesi@0: 'raptor' => array( danielebarchiesi@0: 'title' => t('Raptor'), danielebarchiesi@0: 'config title' => t('Configure raptor'), danielebarchiesi@0: 'form' => 'ctools_ajax_sample_configure_raptor', danielebarchiesi@0: 'output' => 'ctools_ajax_sample_show_raptor', danielebarchiesi@0: ), danielebarchiesi@0: ); danielebarchiesi@0: } danielebarchiesi@0: danielebarchiesi@0: // --------------------------------------------------------------------------- danielebarchiesi@0: // Wizard caching helpers. danielebarchiesi@0: danielebarchiesi@0: /** danielebarchiesi@0: * Store our little cache so that we can retain data from form to form. danielebarchiesi@0: */ danielebarchiesi@0: function ctools_ajax_sample_cache_set($id, $object) { danielebarchiesi@0: ctools_include('object-cache'); danielebarchiesi@0: ctools_object_cache_set('ctools_ajax_sample', $id, $object); danielebarchiesi@0: } danielebarchiesi@0: danielebarchiesi@0: /** danielebarchiesi@0: * Get the current object from the cache, or default. danielebarchiesi@0: */ danielebarchiesi@0: function ctools_ajax_sample_cache_get($id) { danielebarchiesi@0: ctools_include('object-cache'); danielebarchiesi@0: $object = ctools_object_cache_get('ctools_ajax_sample', $id); danielebarchiesi@0: if (!$object) { danielebarchiesi@0: // Create a default object. danielebarchiesi@0: $object = new stdClass; danielebarchiesi@0: $object->type = 'unknown'; danielebarchiesi@0: $object->name = ''; danielebarchiesi@0: } danielebarchiesi@0: danielebarchiesi@0: return $object; danielebarchiesi@0: } danielebarchiesi@0: danielebarchiesi@0: /** danielebarchiesi@0: * Clear the wizard cache. danielebarchiesi@0: */ danielebarchiesi@0: function ctools_ajax_sample_cache_clear($id) { danielebarchiesi@0: ctools_include('object-cache'); danielebarchiesi@0: ctools_object_cache_clear('ctools_ajax_sample', $id); danielebarchiesi@0: } danielebarchiesi@0: danielebarchiesi@0: // --------------------------------------------------------------------------- danielebarchiesi@0: // Wizard in-between helpers; what to do between or after forms. danielebarchiesi@0: danielebarchiesi@0: /** danielebarchiesi@0: * Handle the 'next' click on the add/edit pane form wizard. danielebarchiesi@0: * danielebarchiesi@0: * All we need to do is store the updated pane in the cache. danielebarchiesi@0: */ danielebarchiesi@0: function ctools_ajax_sample_wizard_next(&$form_state) { danielebarchiesi@0: ctools_ajax_sample_cache_set($form_state['object_id'], $form_state['object']); danielebarchiesi@0: } danielebarchiesi@0: danielebarchiesi@0: /** danielebarchiesi@0: * Handle the 'finish' click on teh add/edit pane form wizard. danielebarchiesi@0: * danielebarchiesi@0: * All we need to do is set a flag so the return can handle adding danielebarchiesi@0: * the pane. danielebarchiesi@0: */ danielebarchiesi@0: function ctools_ajax_sample_wizard_finish(&$form_state) { danielebarchiesi@0: $form_state['complete'] = TRUE; danielebarchiesi@0: } danielebarchiesi@0: danielebarchiesi@0: /** danielebarchiesi@0: * Handle the 'cancel' click on the add/edit pane form wizard. danielebarchiesi@0: */ danielebarchiesi@0: function ctools_ajax_sample_wizard_cancel(&$form_state) { danielebarchiesi@0: $form_state['cancel'] = TRUE; danielebarchiesi@0: } danielebarchiesi@0: danielebarchiesi@0: // --------------------------------------------------------------------------- danielebarchiesi@0: // Wizard forms for our simple info collection wizard. danielebarchiesi@0: danielebarchiesi@0: /** danielebarchiesi@0: * Wizard start form. Choose an animal. danielebarchiesi@0: */ danielebarchiesi@0: function ctools_ajax_sample_start($form, &$form_state) { danielebarchiesi@0: $form_state['title'] = t('Choose animal'); danielebarchiesi@0: danielebarchiesi@0: $animals = ctools_ajax_sample_animals(); danielebarchiesi@0: foreach ($animals as $id => $animal) { danielebarchiesi@0: $options[$id] = $animal['title']; danielebarchiesi@0: } danielebarchiesi@0: danielebarchiesi@0: $form['type'] = array( danielebarchiesi@0: '#title' => t('Choose your animal'), danielebarchiesi@0: '#type' => 'radios', danielebarchiesi@0: '#options' => $options, danielebarchiesi@0: '#default_value' => $form_state['object']->type, danielebarchiesi@0: '#required' => TRUE, danielebarchiesi@0: ); danielebarchiesi@0: danielebarchiesi@0: return $form; danielebarchiesi@0: } danielebarchiesi@0: danielebarchiesi@0: /** danielebarchiesi@0: * They have selected a sheep. Set it. danielebarchiesi@0: */ danielebarchiesi@0: function ctools_ajax_sample_start_submit(&$form, &$form_state) { danielebarchiesi@0: $form_state['object']->type = $form_state['values']['type']; danielebarchiesi@0: // Override where to go next based on the animal selected. danielebarchiesi@0: $form_state['clicked_button']['#next'] = $form_state['values']['type']; danielebarchiesi@0: } danielebarchiesi@0: danielebarchiesi@0: /** danielebarchiesi@0: * Wizard form to configure your sheep. danielebarchiesi@0: */ danielebarchiesi@0: function ctools_ajax_sample_configure_sheep($form, &$form_state) { danielebarchiesi@0: $form_state['title'] = t('Configure sheep'); danielebarchiesi@0: danielebarchiesi@0: $form['name'] = array( danielebarchiesi@0: '#type' => 'textfield', danielebarchiesi@0: '#title' => t('Name your sheep'), danielebarchiesi@0: '#default_value' => $form_state['object']->name, danielebarchiesi@0: '#required' => TRUE, danielebarchiesi@0: ); danielebarchiesi@0: danielebarchiesi@0: $form['sheep'] = array( danielebarchiesi@0: '#title' => t('What kind of sheep'), danielebarchiesi@0: '#type' => 'radios', danielebarchiesi@0: '#options' => array( danielebarchiesi@0: t('Wensleydale') => t('Wensleydale'), danielebarchiesi@0: t('Merino') => t('Merino'), danielebarchiesi@0: t('Corriedale') => t('Coriedale'), danielebarchiesi@0: ), danielebarchiesi@0: '#default_value' => !empty($form_state['object']->sheep) ? $form_state['object']->sheep : '', danielebarchiesi@0: '#required' => TRUE, danielebarchiesi@0: ); danielebarchiesi@0: return $form; danielebarchiesi@0: } danielebarchiesi@0: danielebarchiesi@0: /** danielebarchiesi@0: * Submit the sheep and store the values from the form. danielebarchiesi@0: */ danielebarchiesi@0: function ctools_ajax_sample_configure_sheep_submit(&$form, &$form_state) { danielebarchiesi@0: $form_state['object']->name = $form_state['values']['name']; danielebarchiesi@0: $form_state['object']->sheep = $form_state['values']['sheep']; danielebarchiesi@0: } danielebarchiesi@0: danielebarchiesi@0: /** danielebarchiesi@0: * Provide some output for our sheep. danielebarchiesi@0: */ danielebarchiesi@0: function ctools_ajax_sample_show_sheep($object) { danielebarchiesi@0: return t('You have a @type sheep named "@name".', array( danielebarchiesi@0: '@type' => $object->sheep, danielebarchiesi@0: '@name' => $object->name, danielebarchiesi@0: )); danielebarchiesi@0: } danielebarchiesi@0: danielebarchiesi@0: /** danielebarchiesi@0: * Wizard form to configure your lizard. danielebarchiesi@0: */ danielebarchiesi@0: function ctools_ajax_sample_configure_lizard($form, &$form_state) { danielebarchiesi@0: $form_state['title'] = t('Configure lizard'); danielebarchiesi@0: danielebarchiesi@0: $form['name'] = array( danielebarchiesi@0: '#type' => 'textfield', danielebarchiesi@0: '#title' => t('Name your lizard'), danielebarchiesi@0: '#default_value' => $form_state['object']->name, danielebarchiesi@0: '#required' => TRUE, danielebarchiesi@0: ); danielebarchiesi@0: danielebarchiesi@0: $form['lizard'] = array( danielebarchiesi@0: '#title' => t('Venomous'), danielebarchiesi@0: '#type' => 'checkbox', danielebarchiesi@0: '#default_value' => !empty($form_state['object']->lizard), danielebarchiesi@0: ); danielebarchiesi@0: return $form; danielebarchiesi@0: } danielebarchiesi@0: danielebarchiesi@0: /** danielebarchiesi@0: * Submit the lizard and store the values from the form. danielebarchiesi@0: */ danielebarchiesi@0: function ctools_ajax_sample_configure_lizard_submit(&$form, &$form_state) { danielebarchiesi@0: $form_state['object']->name = $form_state['values']['name']; danielebarchiesi@0: $form_state['object']->lizard = $form_state['values']['lizard']; danielebarchiesi@0: } danielebarchiesi@0: danielebarchiesi@0: /** danielebarchiesi@0: * Provide some output for our raptor. danielebarchiesi@0: */ danielebarchiesi@0: function ctools_ajax_sample_show_lizard($object) { danielebarchiesi@0: return t('You have a @type lizard named "@name".', array( danielebarchiesi@0: '@type' => empty($object->lizard) ? t('non-venomous') : t('venomous'), danielebarchiesi@0: '@name' => $object->name, danielebarchiesi@0: )); danielebarchiesi@0: } danielebarchiesi@0: danielebarchiesi@0: /** danielebarchiesi@0: * Wizard form to configure your raptor. danielebarchiesi@0: */ danielebarchiesi@0: function ctools_ajax_sample_configure_raptor($form, &$form_state) { danielebarchiesi@0: $form_state['title'] = t('Configure raptor'); danielebarchiesi@0: danielebarchiesi@0: $form['name'] = array( danielebarchiesi@0: '#type' => 'textfield', danielebarchiesi@0: '#title' => t('Name your raptor'), danielebarchiesi@0: '#default_value' => $form_state['object']->name, danielebarchiesi@0: '#required' => TRUE, danielebarchiesi@0: ); danielebarchiesi@0: danielebarchiesi@0: $form['raptor'] = array( danielebarchiesi@0: '#title' => t('What kind of raptor'), danielebarchiesi@0: '#type' => 'radios', danielebarchiesi@0: '#options' => array( danielebarchiesi@0: t('Eagle') => t('Eagle'), danielebarchiesi@0: t('Hawk') => t('Hawk'), danielebarchiesi@0: t('Owl') => t('Owl'), danielebarchiesi@0: t('Buzzard') => t('Buzzard'), danielebarchiesi@0: ), danielebarchiesi@0: '#default_value' => !empty($form_state['object']->raptor) ? $form_state['object']->raptor : '', danielebarchiesi@0: '#required' => TRUE, danielebarchiesi@0: ); danielebarchiesi@0: danielebarchiesi@0: $form['domesticated'] = array( danielebarchiesi@0: '#title' => t('Domesticated'), danielebarchiesi@0: '#type' => 'checkbox', danielebarchiesi@0: '#default_value' => !empty($form_state['object']->domesticated), danielebarchiesi@0: ); danielebarchiesi@0: return $form; danielebarchiesi@0: } danielebarchiesi@0: danielebarchiesi@0: /** danielebarchiesi@0: * Submit the raptor and store the values from the form. danielebarchiesi@0: */ danielebarchiesi@0: function ctools_ajax_sample_configure_raptor_submit(&$form, &$form_state) { danielebarchiesi@0: $form_state['object']->name = $form_state['values']['name']; danielebarchiesi@0: $form_state['object']->raptor = $form_state['values']['raptor']; danielebarchiesi@0: $form_state['object']->domesticated = $form_state['values']['domesticated']; danielebarchiesi@0: } danielebarchiesi@0: danielebarchiesi@0: /** danielebarchiesi@0: * Provide some output for our raptor. danielebarchiesi@0: */ danielebarchiesi@0: function ctools_ajax_sample_show_raptor($object) { danielebarchiesi@0: return t('You have a @type @raptor named "@name".', array( danielebarchiesi@0: '@type' => empty($object->domesticated) ? t('wild') : t('domesticated'), danielebarchiesi@0: '@raptor' => $object->raptor, danielebarchiesi@0: '@name' => $object->name, danielebarchiesi@0: )); danielebarchiesi@0: } danielebarchiesi@0: danielebarchiesi@0: /** danielebarchiesi@0: * Helper function to provide a sample jump menu form danielebarchiesi@0: */ danielebarchiesi@0: function ctools_ajax_sample_jump_menu_form() { danielebarchiesi@0: $url = url('ctools_ajax_sample/jumped'); danielebarchiesi@0: $form_state = array(); danielebarchiesi@0: $form = ctools_jump_menu(array(), $form_state, array($url => t('Jump!')), array()); danielebarchiesi@0: return $form; danielebarchiesi@0: } danielebarchiesi@0: danielebarchiesi@0: /** danielebarchiesi@0: * Provide a message to the user that the jump menu worked danielebarchiesi@0: */ danielebarchiesi@0: function ctools_ajax_sample_jump_menu_page() { danielebarchiesi@0: $return_link = l(t('Return to the examples page.'), 'ctools_ajax_sample'); danielebarchiesi@0: $output = t('You successfully jumped! !return_link', array('!return_link' => $return_link)); danielebarchiesi@0: return $output; danielebarchiesi@0: } danielebarchiesi@0: danielebarchiesi@0: /** danielebarchiesi@0: * Provide a form for an example ajax modal button danielebarchiesi@0: */ danielebarchiesi@0: function ctools_ajax_sample_ajax_button_form() { danielebarchiesi@0: $form = array(); danielebarchiesi@0: danielebarchiesi@0: $form['url'] = array( danielebarchiesi@0: '#type' => 'hidden', danielebarchiesi@0: // The name of the class is the #id of $form['ajax_button'] with "-url" danielebarchiesi@0: // suffix. danielebarchiesi@0: '#attributes' => array('class' => array('ctools-ajax-sample-button-url')), danielebarchiesi@0: '#value' => url('ctools_ajax_sample/nojs/animal'), danielebarchiesi@0: ); danielebarchiesi@0: danielebarchiesi@0: $form['ajax_button'] = array( danielebarchiesi@0: '#type' => 'button', danielebarchiesi@0: '#value' => 'Wizard (button modal)', danielebarchiesi@0: '#attributes' => array('class' => array('ctools-use-modal')), danielebarchiesi@0: '#id' => 'ctools-ajax-sample-button', danielebarchiesi@0: ); danielebarchiesi@0: danielebarchiesi@0: return $form; danielebarchiesi@0: }