annotate sites/all/modules/ctools/ctools_ajax_sample/ctools_ajax_sample.module @ 0:ff03f76ab3fe

initial version
author danieleb <danielebarchiesi@me.com>
date Wed, 21 Aug 2013 18:51:11 +0100
parents
children
rev   line source
danielebarchiesi@0 1 <?php
danielebarchiesi@0 2
danielebarchiesi@0 3 /**
danielebarchiesi@0 4 * @file
danielebarchiesi@0 5 * Sample AJAX functionality so people can see some of the CTools AJAX
danielebarchiesi@0 6 * features in use.
danielebarchiesi@0 7 */
danielebarchiesi@0 8
danielebarchiesi@0 9 // ---------------------------------------------------------------------------
danielebarchiesi@0 10 // Drupal hooks.
danielebarchiesi@0 11
danielebarchiesi@0 12 /**
danielebarchiesi@0 13 * Implementation of hook_menu()
danielebarchiesi@0 14 */
danielebarchiesi@0 15 function ctools_ajax_sample_menu() {
danielebarchiesi@0 16 $items['ctools_ajax_sample'] = array(
danielebarchiesi@0 17 'title' => 'Chaos Tools AJAX Demo',
danielebarchiesi@0 18 'page callback' => 'ctools_ajax_sample_page',
danielebarchiesi@0 19 'access callback' => TRUE,
danielebarchiesi@0 20 'type' => MENU_NORMAL_ITEM,
danielebarchiesi@0 21 );
danielebarchiesi@0 22 $items['ctools_ajax_sample/simple_form'] = array(
danielebarchiesi@0 23 'title' => 'Simple Form',
danielebarchiesi@0 24 'page callback' => 'ctools_ajax_simple_form',
danielebarchiesi@0 25 'access callback' => TRUE,
danielebarchiesi@0 26 'type' => MENU_CALLBACK,
danielebarchiesi@0 27 );
danielebarchiesi@0 28 $items['ctools_ajax_sample/%ctools_js/hello'] = array(
danielebarchiesi@0 29 'title' => 'Hello World',
danielebarchiesi@0 30 'page callback' => 'ctools_ajax_sample_hello',
danielebarchiesi@0 31 'page arguments' => array(1),
danielebarchiesi@0 32 'access callback' => TRUE,
danielebarchiesi@0 33 'type' => MENU_CALLBACK,
danielebarchiesi@0 34 );
danielebarchiesi@0 35 $items['ctools_ajax_sample/%ctools_js/tablenix/%'] = array(
danielebarchiesi@0 36 'title' => 'Hello World',
danielebarchiesi@0 37 'page callback' => 'ctools_ajax_sample_tablenix',
danielebarchiesi@0 38 'page arguments' => array(1, 3),
danielebarchiesi@0 39 'access callback' => TRUE,
danielebarchiesi@0 40 'type' => MENU_CALLBACK,
danielebarchiesi@0 41 );
danielebarchiesi@0 42 $items['ctools_ajax_sample/%ctools_js/login'] = array(
danielebarchiesi@0 43 'title' => 'Login',
danielebarchiesi@0 44 'page callback' => 'ctools_ajax_sample_login',
danielebarchiesi@0 45 'page arguments' => array(1),
danielebarchiesi@0 46 'access callback' => TRUE,
danielebarchiesi@0 47 'type' => MENU_CALLBACK,
danielebarchiesi@0 48 );
danielebarchiesi@0 49 $items['ctools_ajax_sample/%ctools_js/animal'] = array(
danielebarchiesi@0 50 'title' => 'Animal',
danielebarchiesi@0 51 'page callback' => 'ctools_ajax_sample_animal',
danielebarchiesi@0 52 'page arguments' => array(1),
danielebarchiesi@0 53 'access callback' => TRUE,
danielebarchiesi@0 54 'type' => MENU_CALLBACK,
danielebarchiesi@0 55 );
danielebarchiesi@0 56 $items['ctools_ajax_sample/%ctools_js/login/%'] = array(
danielebarchiesi@0 57 'title' => 'Post-Login Action',
danielebarchiesi@0 58 'page callback' => 'ctools_ajax_sample_login_success',
danielebarchiesi@0 59 'page arguments' => array(1, 3),
danielebarchiesi@0 60 'access callback' => TRUE,
danielebarchiesi@0 61 'type' => MENU_CALLBACK,
danielebarchiesi@0 62 );
danielebarchiesi@0 63 $items['ctools_ajax_sample/jumped'] = array(
danielebarchiesi@0 64 'title' => 'Successful Jumping',
danielebarchiesi@0 65 'page callback' => 'ctools_ajax_sample_jump_menu_page',
danielebarchiesi@0 66 'access callback' => TRUE,
danielebarchiesi@0 67 'type' => MENU_NORMAL_ITEM,
danielebarchiesi@0 68 );
danielebarchiesi@0 69
danielebarchiesi@0 70 return $items;
danielebarchiesi@0 71 }
danielebarchiesi@0 72
danielebarchiesi@0 73 function ctools_ajax_simple_form() {
danielebarchiesi@0 74 ctools_include('content');
danielebarchiesi@0 75 ctools_include('context');
danielebarchiesi@0 76 $node = node_load(1);
danielebarchiesi@0 77 $context = ctools_context_create('node', $node);
danielebarchiesi@0 78 $context = array('context_node_1' => $context);
danielebarchiesi@0 79 return ctools_content_render('node_comment_form', 'node_comment_form', ctools_ajax_simple_form_pane(), array(), array(), $context);
danielebarchiesi@0 80 }
danielebarchiesi@0 81
danielebarchiesi@0 82 function ctools_ajax_simple_form_pane() {
danielebarchiesi@0 83 $configuration = array(
danielebarchiesi@0 84 'anon_links' => 0,
danielebarchiesi@0 85 'context' => 'context_node_1',
danielebarchiesi@0 86 'override_title' => 0,
danielebarchiesi@0 87 'override_title_text' => '',
danielebarchiesi@0 88 );
danielebarchiesi@0 89 return $configuration;
danielebarchiesi@0 90 }
danielebarchiesi@0 91
danielebarchiesi@0 92 /**
danielebarchiesi@0 93 * Implementation of hook_theme()
danielebarchiesi@0 94 *
danielebarchiesi@0 95 * Render some basic output for this module.
danielebarchiesi@0 96 */
danielebarchiesi@0 97 function ctools_ajax_sample_theme() {
danielebarchiesi@0 98 return array(
danielebarchiesi@0 99 // Sample theme functions.
danielebarchiesi@0 100 'ctools_ajax_sample_container' => array(
danielebarchiesi@0 101 'arguments' => array('content' => NULL),
danielebarchiesi@0 102 ),
danielebarchiesi@0 103 );
danielebarchiesi@0 104 }
danielebarchiesi@0 105
danielebarchiesi@0 106 // ---------------------------------------------------------------------------
danielebarchiesi@0 107 // Page callbacks
danielebarchiesi@0 108
danielebarchiesi@0 109 /**
danielebarchiesi@0 110 * Page callback to display links and render a container for AJAX stuff.
danielebarchiesi@0 111 */
danielebarchiesi@0 112 function ctools_ajax_sample_page() {
danielebarchiesi@0 113 global $user;
danielebarchiesi@0 114
danielebarchiesi@0 115 // Include the CTools tools that we need.
danielebarchiesi@0 116 ctools_include('ajax');
danielebarchiesi@0 117 ctools_include('modal');
danielebarchiesi@0 118
danielebarchiesi@0 119 // Add CTools' javascript to the page.
danielebarchiesi@0 120 ctools_modal_add_js();
danielebarchiesi@0 121
danielebarchiesi@0 122 // Create our own javascript that will be used to theme a modal.
danielebarchiesi@0 123 $sample_style = array(
danielebarchiesi@0 124 'ctools-sample-style' => array(
danielebarchiesi@0 125 'modalSize' => array(
danielebarchiesi@0 126 'type' => 'fixed',
danielebarchiesi@0 127 'width' => 500,
danielebarchiesi@0 128 'height' => 300,
danielebarchiesi@0 129 'addWidth' => 20,
danielebarchiesi@0 130 'addHeight' => 15,
danielebarchiesi@0 131 ),
danielebarchiesi@0 132 'modalOptions' => array(
danielebarchiesi@0 133 'opacity' => .5,
danielebarchiesi@0 134 'background-color' => '#000',
danielebarchiesi@0 135 ),
danielebarchiesi@0 136 'animation' => 'fadeIn',
danielebarchiesi@0 137 'modalTheme' => 'CToolsSampleModal',
danielebarchiesi@0 138 'throbber' => theme('image', array('path' => ctools_image_path('ajax-loader.gif', 'ctools_ajax_sample'), 'alt' => t('Loading...'), 'title' => t('Loading'))),
danielebarchiesi@0 139 ),
danielebarchiesi@0 140 );
danielebarchiesi@0 141
danielebarchiesi@0 142 drupal_add_js($sample_style, 'setting');
danielebarchiesi@0 143
danielebarchiesi@0 144 // Since we have our js, css and images in well-known named directories,
danielebarchiesi@0 145 // CTools makes it easy for us to just use them without worrying about
danielebarchiesi@0 146 // using drupal_get_path() and all that ugliness.
danielebarchiesi@0 147 ctools_add_js('ctools-ajax-sample', 'ctools_ajax_sample');
danielebarchiesi@0 148 ctools_add_css('ctools-ajax-sample', 'ctools_ajax_sample');
danielebarchiesi@0 149
danielebarchiesi@0 150 // Create a list of clickable links.
danielebarchiesi@0 151 $links = array();
danielebarchiesi@0 152
danielebarchiesi@0 153 // Only show login links to the anonymous user.
danielebarchiesi@0 154 if ($user->uid == 0) {
danielebarchiesi@0 155 $links[] = ctools_modal_text_button(t('Modal Login (default style)'), 'ctools_ajax_sample/nojs/login', t('Login via modal'));
danielebarchiesi@0 156
danielebarchiesi@0 157 // The extra class points to the info in ctools-sample-style which we added
danielebarchiesi@0 158 // to the settings, prefixed with 'ctools-modal'.
danielebarchiesi@0 159 $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 160 }
danielebarchiesi@0 161
danielebarchiesi@0 162 // Four ways to do our animal picking wizard.
danielebarchiesi@0 163 $button_form = ctools_ajax_sample_ajax_button_form();
danielebarchiesi@0 164 $links[] = l(t('Wizard (no modal)'), 'ctools_ajax_sample/nojs/animal');
danielebarchiesi@0 165 $links[] = ctools_modal_text_button(t('Wizard (default modal)'), 'ctools_ajax_sample/nojs/animal', t('Pick an animal'));
danielebarchiesi@0 166 $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 167 $links[] = drupal_render($button_form);
danielebarchiesi@0 168
danielebarchiesi@0 169 $links[] = ctools_ajax_text_button(t('Hello world!'), "ctools_ajax_sample/nojs/hello", t('Replace text with "hello world"'));
danielebarchiesi@0 170
danielebarchiesi@0 171 $output = theme('item_list', array('items' => $links, 'title' => t('Actions')));
danielebarchiesi@0 172
danielebarchiesi@0 173 // This container will have data AJAXed into it.
danielebarchiesi@0 174 $output .= theme('ctools_ajax_sample_container', array('content' => '<h1>' . t('Sample Content') . '</h1>'));
danielebarchiesi@0 175
danielebarchiesi@0 176 // Create a table that we can have data removed from via AJAX.
danielebarchiesi@0 177 $header = array(t('Row'), t('Content'), t('Actions'));
danielebarchiesi@0 178 $rows = array();
danielebarchiesi@0 179 for($i = 1; $i < 11; $i++) {
danielebarchiesi@0 180 $rows[] = array(
danielebarchiesi@0 181 'class' => array('ajax-sample-row-'. $i),
danielebarchiesi@0 182 'data' => array(
danielebarchiesi@0 183 $i,
danielebarchiesi@0 184 md5($i),
danielebarchiesi@0 185 ctools_ajax_text_button("remove", "ctools_ajax_sample/nojs/tablenix/$i", t('Delete this row')),
danielebarchiesi@0 186 ),
danielebarchiesi@0 187 );
danielebarchiesi@0 188 }
danielebarchiesi@0 189
danielebarchiesi@0 190 $output .= theme('table', array('header' => $header, 'rows' => $rows, array('class' => array('ajax-sample-table'))));
danielebarchiesi@0 191
danielebarchiesi@0 192 // Show examples of ctools javascript widgets
danielebarchiesi@0 193 $output .= '<h2>'. t('CTools Javascript Widgets') .'</h2>';
danielebarchiesi@0 194
danielebarchiesi@0 195 // Create a drop down menu
danielebarchiesi@0 196 $links = array();
danielebarchiesi@0 197 $links[] = array('title' => t('Link 1'), 'href' => $_GET['q']);
danielebarchiesi@0 198 $links[] = array('title' => t('Link 2'), 'href' => $_GET['q']);
danielebarchiesi@0 199 $links[] = array('title' => t('Link 3'), 'href' => $_GET['q']);
danielebarchiesi@0 200
danielebarchiesi@0 201 $output .= '<h3>' . t('Drop Down Menu') . '</h3>';
danielebarchiesi@0 202 $output .= theme('ctools_dropdown', array('title' => t('Click to Drop Down'), 'links' => $links));
danielebarchiesi@0 203
danielebarchiesi@0 204 // Create a collapsible div
danielebarchiesi@0 205 $handle = t('Click to Collapse');
danielebarchiesi@0 206 $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 207 $output .= '<h3>'. t('Collapsible Div') .'</h3>';
danielebarchiesi@0 208 $output .= theme('ctools_collapsible', array('handle' => $handle, 'content' => $content, 'collapsed' => FALSE));
danielebarchiesi@0 209
danielebarchiesi@0 210 // Create a jump menu
danielebarchiesi@0 211 ctools_include('jump-menu');
danielebarchiesi@0 212 $form = drupal_get_form('ctools_ajax_sample_jump_menu_form');
danielebarchiesi@0 213 $output .= '<h3>'. t('Jump Menu') .'</h3>';
danielebarchiesi@0 214 $output .= drupal_render($form);
danielebarchiesi@0 215
danielebarchiesi@0 216 return array('markup' => array('#markup' => $output));
danielebarchiesi@0 217 }
danielebarchiesi@0 218
danielebarchiesi@0 219 /**
danielebarchiesi@0 220 * Returns a "take it all over" hello world style request.
danielebarchiesi@0 221 */
danielebarchiesi@0 222 function ctools_ajax_sample_hello($js = NULL) {
danielebarchiesi@0 223 $output = '<h1>' . t('Hello World') . '</h1>';
danielebarchiesi@0 224 if ($js) {
danielebarchiesi@0 225 ctools_include('ajax');
danielebarchiesi@0 226 $commands = array();
danielebarchiesi@0 227 $commands[] = ajax_command_html('#ctools-sample', $output);
danielebarchiesi@0 228 print ajax_render($commands); // this function exits.
danielebarchiesi@0 229 exit;
danielebarchiesi@0 230 }
danielebarchiesi@0 231 else {
danielebarchiesi@0 232 return $output;
danielebarchiesi@0 233 }
danielebarchiesi@0 234 }
danielebarchiesi@0 235
danielebarchiesi@0 236 /**
danielebarchiesi@0 237 * Nix a row from a table and restripe.
danielebarchiesi@0 238 */
danielebarchiesi@0 239 function ctools_ajax_sample_tablenix($js, $row) {
danielebarchiesi@0 240 if (!$js) {
danielebarchiesi@0 241 // We don't support degrading this from js because we're not
danielebarchiesi@0 242 // using the server to remember the state of the table.
danielebarchiesi@0 243 return MENU_ACCESS_DENIED;
danielebarchiesi@0 244 }
danielebarchiesi@0 245 ctools_include('ajax');
danielebarchiesi@0 246
danielebarchiesi@0 247 $commands = array();
danielebarchiesi@0 248 $commands[] = ajax_command_remove("tr.ajax-sample-row-$row");
danielebarchiesi@0 249 $commands[] = ajax_command_restripe("table.ajax-sample-table");
danielebarchiesi@0 250 print ajax_render($commands);
danielebarchiesi@0 251 exit;
danielebarchiesi@0 252 }
danielebarchiesi@0 253
danielebarchiesi@0 254 /**
danielebarchiesi@0 255 * A modal login callback.
danielebarchiesi@0 256 */
danielebarchiesi@0 257 function ctools_ajax_sample_login($js = NULL) {
danielebarchiesi@0 258 // Fall back if $js is not set.
danielebarchiesi@0 259 if (!$js) {
danielebarchiesi@0 260 return drupal_get_form('user_login');
danielebarchiesi@0 261 }
danielebarchiesi@0 262
danielebarchiesi@0 263 ctools_include('modal');
danielebarchiesi@0 264 ctools_include('ajax');
danielebarchiesi@0 265 $form_state = array(
danielebarchiesi@0 266 'title' => t('Login'),
danielebarchiesi@0 267 'ajax' => TRUE,
danielebarchiesi@0 268 );
danielebarchiesi@0 269 $output = ctools_modal_form_wrapper('user_login', $form_state);
danielebarchiesi@0 270 if (!empty($form_state['executed'])) {
danielebarchiesi@0 271 // We'll just overwrite the form output if it was successful.
danielebarchiesi@0 272 $output = array();
danielebarchiesi@0 273 $inplace = ctools_ajax_text_button(t('remain here'), 'ctools_ajax_sample/nojs/login/inplace', t('Go to your account'));
danielebarchiesi@0 274 $account = ctools_ajax_text_button(t('your account'), 'ctools_ajax_sample/nojs/login/user', t('Go to your account'));
danielebarchiesi@0 275 $output[] = ctools_modal_command_display(t('Login Success'), '<div class="modal-message">Login successful. You can now choose whether to '. $inplace .', or go to '. $account.'.</div>');
danielebarchiesi@0 276 }
danielebarchiesi@0 277 print ajax_render($output);
danielebarchiesi@0 278 exit;
danielebarchiesi@0 279 }
danielebarchiesi@0 280
danielebarchiesi@0 281 /**
danielebarchiesi@0 282 * Post-login processor: should we go to the user account or stay in place?
danielebarchiesi@0 283 */
danielebarchiesi@0 284 function ctools_ajax_sample_login_success($js, $action) {
danielebarchiesi@0 285 if (!$js) {
danielebarchiesi@0 286 // we should never be here out of ajax context
danielebarchiesi@0 287 return MENU_NOT_FOUND;
danielebarchiesi@0 288 }
danielebarchiesi@0 289
danielebarchiesi@0 290 ctools_include('ajax');
danielebarchiesi@0 291 ctools_add_js('ajax-responder');
danielebarchiesi@0 292 $commands = array();
danielebarchiesi@0 293 if ($action == 'inplace') {
danielebarchiesi@0 294 // stay here
danielebarchiesi@0 295 $commands[] = ctools_ajax_command_reload();
danielebarchiesi@0 296 }
danielebarchiesi@0 297 else {
danielebarchiesi@0 298 // bounce bounce
danielebarchiesi@0 299 $commands[] = ctools_ajax_command_redirect('user');
danielebarchiesi@0 300 }
danielebarchiesi@0 301 print ajax_render($commands);
danielebarchiesi@0 302 exit;
danielebarchiesi@0 303 }
danielebarchiesi@0 304
danielebarchiesi@0 305 /**
danielebarchiesi@0 306 * A modal login callback.
danielebarchiesi@0 307 */
danielebarchiesi@0 308 function ctools_ajax_sample_animal($js = NULL, $step = NULL) {
danielebarchiesi@0 309 if ($js) {
danielebarchiesi@0 310 ctools_include('modal');
danielebarchiesi@0 311 ctools_include('ajax');
danielebarchiesi@0 312 }
danielebarchiesi@0 313
danielebarchiesi@0 314 $form_info = array(
danielebarchiesi@0 315 'id' => 'animals',
danielebarchiesi@0 316 'path' => "ctools_ajax_sample/" . ($js ? 'ajax' : 'nojs') . "/animal/%step",
danielebarchiesi@0 317 'show trail' => TRUE,
danielebarchiesi@0 318 'show back' => TRUE,
danielebarchiesi@0 319 'show cancel' => TRUE,
danielebarchiesi@0 320 'show return' => FALSE,
danielebarchiesi@0 321 'next callback' => 'ctools_ajax_sample_wizard_next',
danielebarchiesi@0 322 'finish callback' => 'ctools_ajax_sample_wizard_finish',
danielebarchiesi@0 323 'cancel callback' => 'ctools_ajax_sample_wizard_cancel',
danielebarchiesi@0 324 // this controls order, as well as form labels
danielebarchiesi@0 325 'order' => array(
danielebarchiesi@0 326 'start' => t('Choose animal'),
danielebarchiesi@0 327 ),
danielebarchiesi@0 328 // here we map a step to a form id.
danielebarchiesi@0 329 'forms' => array(
danielebarchiesi@0 330 // e.g. this for the step at wombat/create
danielebarchiesi@0 331 'start' => array(
danielebarchiesi@0 332 'form id' => 'ctools_ajax_sample_start'
danielebarchiesi@0 333 ),
danielebarchiesi@0 334 ),
danielebarchiesi@0 335 );
danielebarchiesi@0 336
danielebarchiesi@0 337 // We're not using any real storage here, so we're going to set our
danielebarchiesi@0 338 // object_id to 1. When using wizard forms, id management turns
danielebarchiesi@0 339 // out to be one of the hardest parts. Editing an object with an id
danielebarchiesi@0 340 // is easy, but new objects don't usually have ids until somewhere
danielebarchiesi@0 341 // in creation.
danielebarchiesi@0 342 //
danielebarchiesi@0 343 // We skip all this here by just using an id of 1.
danielebarchiesi@0 344
danielebarchiesi@0 345 $object_id = 1;
danielebarchiesi@0 346
danielebarchiesi@0 347 if (empty($step)) {
danielebarchiesi@0 348 // We reset the form when $step is NULL because that means they have
danielebarchiesi@0 349 // for whatever reason started over.
danielebarchiesi@0 350 ctools_ajax_sample_cache_clear($object_id);
danielebarchiesi@0 351 $step = 'start';
danielebarchiesi@0 352 }
danielebarchiesi@0 353
danielebarchiesi@0 354 // This automatically gets defaults if there wasn't anything saved.
danielebarchiesi@0 355 $object = ctools_ajax_sample_cache_get($object_id);
danielebarchiesi@0 356
danielebarchiesi@0 357 $animals = ctools_ajax_sample_animals();
danielebarchiesi@0 358
danielebarchiesi@0 359 // Make sure we can't somehow accidentally go to an invalid animal.
danielebarchiesi@0 360 if (empty($animals[$object->type])) {
danielebarchiesi@0 361 $object->type = 'unknown';
danielebarchiesi@0 362 }
danielebarchiesi@0 363
danielebarchiesi@0 364 // Now that we have our object, dynamically add the animal's form.
danielebarchiesi@0 365 if ($object->type == 'unknown') {
danielebarchiesi@0 366 // If they haven't selected a type, add a form that doesn't exist yet.
danielebarchiesi@0 367 $form_info['order']['unknown'] = t('Configure animal');
danielebarchiesi@0 368 $form_info['forms']['unknown'] = array('form id' => 'nothing');
danielebarchiesi@0 369 }
danielebarchiesi@0 370 else {
danielebarchiesi@0 371 // Add the selected animal to the order so that it shows up properly in the trail.
danielebarchiesi@0 372 $form_info['order'][$object->type] = $animals[$object->type]['config title'];
danielebarchiesi@0 373 }
danielebarchiesi@0 374
danielebarchiesi@0 375 // Make sure all animals forms are represented so that the next stuff can
danielebarchiesi@0 376 // work correctly:
danielebarchiesi@0 377 foreach ($animals as $id => $animal) {
danielebarchiesi@0 378 $form_info['forms'][$id] = array('form id' => $animals[$id]['form']);
danielebarchiesi@0 379 }
danielebarchiesi@0 380
danielebarchiesi@0 381 $form_state = array(
danielebarchiesi@0 382 'ajax' => $js,
danielebarchiesi@0 383 // Put our object and ID into the form state cache so we can easily find
danielebarchiesi@0 384 // it.
danielebarchiesi@0 385 'object_id' => $object_id,
danielebarchiesi@0 386 'object' => &$object,
danielebarchiesi@0 387 );
danielebarchiesi@0 388
danielebarchiesi@0 389 // Send this all off to our form. This is like drupal_get_form only wizardy.
danielebarchiesi@0 390 ctools_include('wizard');
danielebarchiesi@0 391 $form = ctools_wizard_multistep_form($form_info, $step, $form_state);
danielebarchiesi@0 392 $output = drupal_render($form);
danielebarchiesi@0 393
danielebarchiesi@0 394 if ($output === FALSE || !empty($form_state['complete'])) {
danielebarchiesi@0 395 // This creates a string based upon the animal and its setting using
danielebarchiesi@0 396 // function indirection.
danielebarchiesi@0 397 $animal = $animals[$object->type]['output']($object);
danielebarchiesi@0 398 }
danielebarchiesi@0 399
danielebarchiesi@0 400 // If $output is FALSE, there was no actual form.
danielebarchiesi@0 401 if ($js) {
danielebarchiesi@0 402 // If javascript is active, we have to use a render array.
danielebarchiesi@0 403 $commands = array();
danielebarchiesi@0 404 if ($output === FALSE || !empty($form_state['complete'])) {
danielebarchiesi@0 405 // Dismiss the modal.
danielebarchiesi@0 406 $commands[] = ajax_command_html('#ctools-sample', $animal);
danielebarchiesi@0 407 $commands[] = ctools_modal_command_dismiss();
danielebarchiesi@0 408 }
danielebarchiesi@0 409 else if (!empty($form_state['cancel'])) {
danielebarchiesi@0 410 // If cancelling, return to the activity.
danielebarchiesi@0 411 $commands[] = ctools_modal_command_dismiss();
danielebarchiesi@0 412 }
danielebarchiesi@0 413 else {
danielebarchiesi@0 414 $commands = ctools_modal_form_render($form_state, $output);
danielebarchiesi@0 415 }
danielebarchiesi@0 416 print ajax_render($commands);
danielebarchiesi@0 417 exit;
danielebarchiesi@0 418 }
danielebarchiesi@0 419 else {
danielebarchiesi@0 420 if ($output === FALSE || !empty($form_state['complete'])) {
danielebarchiesi@0 421 return $animal;
danielebarchiesi@0 422 }
danielebarchiesi@0 423 else if (!empty($form_state['cancel'])) {
danielebarchiesi@0 424 drupal_goto('ctools_ajax_sample');
danielebarchiesi@0 425 }
danielebarchiesi@0 426 else {
danielebarchiesi@0 427 return $output;
danielebarchiesi@0 428 }
danielebarchiesi@0 429 }
danielebarchiesi@0 430 }
danielebarchiesi@0 431
danielebarchiesi@0 432 // ---------------------------------------------------------------------------
danielebarchiesi@0 433 // Themes
danielebarchiesi@0 434
danielebarchiesi@0 435 /**
danielebarchiesi@0 436 * Theme function for main rendered output.
danielebarchiesi@0 437 */
danielebarchiesi@0 438 function theme_ctools_ajax_sample_container($vars) {
danielebarchiesi@0 439 $output = '<div id="ctools-sample">';
danielebarchiesi@0 440 $output .= $vars['content'];
danielebarchiesi@0 441 $output .= '</div>';
danielebarchiesi@0 442
danielebarchiesi@0 443 return $output;
danielebarchiesi@0 444 }
danielebarchiesi@0 445
danielebarchiesi@0 446 // ---------------------------------------------------------------------------
danielebarchiesi@0 447 // Stuff needed for our little wizard.
danielebarchiesi@0 448
danielebarchiesi@0 449 /**
danielebarchiesi@0 450 * Get a list of our animals and associated forms.
danielebarchiesi@0 451 *
danielebarchiesi@0 452 * What we're doing is making it easy to add more animals in just one place,
danielebarchiesi@0 453 * which is often how it will work in the real world. If using CTools, what
danielebarchiesi@0 454 * you would probably really have, here, is a set of plugins for each animal.
danielebarchiesi@0 455 */
danielebarchiesi@0 456 function ctools_ajax_sample_animals() {
danielebarchiesi@0 457 return array(
danielebarchiesi@0 458 'sheep' => array(
danielebarchiesi@0 459 'title' => t('Sheep'),
danielebarchiesi@0 460 'config title' => t('Configure sheep'),
danielebarchiesi@0 461 'form' => 'ctools_ajax_sample_configure_sheep',
danielebarchiesi@0 462 'output' => 'ctools_ajax_sample_show_sheep',
danielebarchiesi@0 463 ),
danielebarchiesi@0 464 'lizard' => array(
danielebarchiesi@0 465 'title' => t('Lizard'),
danielebarchiesi@0 466 'config title' => t('Configure lizard'),
danielebarchiesi@0 467 'form' => 'ctools_ajax_sample_configure_lizard',
danielebarchiesi@0 468 'output' => 'ctools_ajax_sample_show_lizard',
danielebarchiesi@0 469 ),
danielebarchiesi@0 470 'raptor' => array(
danielebarchiesi@0 471 'title' => t('Raptor'),
danielebarchiesi@0 472 'config title' => t('Configure raptor'),
danielebarchiesi@0 473 'form' => 'ctools_ajax_sample_configure_raptor',
danielebarchiesi@0 474 'output' => 'ctools_ajax_sample_show_raptor',
danielebarchiesi@0 475 ),
danielebarchiesi@0 476 );
danielebarchiesi@0 477 }
danielebarchiesi@0 478
danielebarchiesi@0 479 // ---------------------------------------------------------------------------
danielebarchiesi@0 480 // Wizard caching helpers.
danielebarchiesi@0 481
danielebarchiesi@0 482 /**
danielebarchiesi@0 483 * Store our little cache so that we can retain data from form to form.
danielebarchiesi@0 484 */
danielebarchiesi@0 485 function ctools_ajax_sample_cache_set($id, $object) {
danielebarchiesi@0 486 ctools_include('object-cache');
danielebarchiesi@0 487 ctools_object_cache_set('ctools_ajax_sample', $id, $object);
danielebarchiesi@0 488 }
danielebarchiesi@0 489
danielebarchiesi@0 490 /**
danielebarchiesi@0 491 * Get the current object from the cache, or default.
danielebarchiesi@0 492 */
danielebarchiesi@0 493 function ctools_ajax_sample_cache_get($id) {
danielebarchiesi@0 494 ctools_include('object-cache');
danielebarchiesi@0 495 $object = ctools_object_cache_get('ctools_ajax_sample', $id);
danielebarchiesi@0 496 if (!$object) {
danielebarchiesi@0 497 // Create a default object.
danielebarchiesi@0 498 $object = new stdClass;
danielebarchiesi@0 499 $object->type = 'unknown';
danielebarchiesi@0 500 $object->name = '';
danielebarchiesi@0 501 }
danielebarchiesi@0 502
danielebarchiesi@0 503 return $object;
danielebarchiesi@0 504 }
danielebarchiesi@0 505
danielebarchiesi@0 506 /**
danielebarchiesi@0 507 * Clear the wizard cache.
danielebarchiesi@0 508 */
danielebarchiesi@0 509 function ctools_ajax_sample_cache_clear($id) {
danielebarchiesi@0 510 ctools_include('object-cache');
danielebarchiesi@0 511 ctools_object_cache_clear('ctools_ajax_sample', $id);
danielebarchiesi@0 512 }
danielebarchiesi@0 513
danielebarchiesi@0 514 // ---------------------------------------------------------------------------
danielebarchiesi@0 515 // Wizard in-between helpers; what to do between or after forms.
danielebarchiesi@0 516
danielebarchiesi@0 517 /**
danielebarchiesi@0 518 * Handle the 'next' click on the add/edit pane form wizard.
danielebarchiesi@0 519 *
danielebarchiesi@0 520 * All we need to do is store the updated pane in the cache.
danielebarchiesi@0 521 */
danielebarchiesi@0 522 function ctools_ajax_sample_wizard_next(&$form_state) {
danielebarchiesi@0 523 ctools_ajax_sample_cache_set($form_state['object_id'], $form_state['object']);
danielebarchiesi@0 524 }
danielebarchiesi@0 525
danielebarchiesi@0 526 /**
danielebarchiesi@0 527 * Handle the 'finish' click on teh add/edit pane form wizard.
danielebarchiesi@0 528 *
danielebarchiesi@0 529 * All we need to do is set a flag so the return can handle adding
danielebarchiesi@0 530 * the pane.
danielebarchiesi@0 531 */
danielebarchiesi@0 532 function ctools_ajax_sample_wizard_finish(&$form_state) {
danielebarchiesi@0 533 $form_state['complete'] = TRUE;
danielebarchiesi@0 534 }
danielebarchiesi@0 535
danielebarchiesi@0 536 /**
danielebarchiesi@0 537 * Handle the 'cancel' click on the add/edit pane form wizard.
danielebarchiesi@0 538 */
danielebarchiesi@0 539 function ctools_ajax_sample_wizard_cancel(&$form_state) {
danielebarchiesi@0 540 $form_state['cancel'] = TRUE;
danielebarchiesi@0 541 }
danielebarchiesi@0 542
danielebarchiesi@0 543 // ---------------------------------------------------------------------------
danielebarchiesi@0 544 // Wizard forms for our simple info collection wizard.
danielebarchiesi@0 545
danielebarchiesi@0 546 /**
danielebarchiesi@0 547 * Wizard start form. Choose an animal.
danielebarchiesi@0 548 */
danielebarchiesi@0 549 function ctools_ajax_sample_start($form, &$form_state) {
danielebarchiesi@0 550 $form_state['title'] = t('Choose animal');
danielebarchiesi@0 551
danielebarchiesi@0 552 $animals = ctools_ajax_sample_animals();
danielebarchiesi@0 553 foreach ($animals as $id => $animal) {
danielebarchiesi@0 554 $options[$id] = $animal['title'];
danielebarchiesi@0 555 }
danielebarchiesi@0 556
danielebarchiesi@0 557 $form['type'] = array(
danielebarchiesi@0 558 '#title' => t('Choose your animal'),
danielebarchiesi@0 559 '#type' => 'radios',
danielebarchiesi@0 560 '#options' => $options,
danielebarchiesi@0 561 '#default_value' => $form_state['object']->type,
danielebarchiesi@0 562 '#required' => TRUE,
danielebarchiesi@0 563 );
danielebarchiesi@0 564
danielebarchiesi@0 565 return $form;
danielebarchiesi@0 566 }
danielebarchiesi@0 567
danielebarchiesi@0 568 /**
danielebarchiesi@0 569 * They have selected a sheep. Set it.
danielebarchiesi@0 570 */
danielebarchiesi@0 571 function ctools_ajax_sample_start_submit(&$form, &$form_state) {
danielebarchiesi@0 572 $form_state['object']->type = $form_state['values']['type'];
danielebarchiesi@0 573 // Override where to go next based on the animal selected.
danielebarchiesi@0 574 $form_state['clicked_button']['#next'] = $form_state['values']['type'];
danielebarchiesi@0 575 }
danielebarchiesi@0 576
danielebarchiesi@0 577 /**
danielebarchiesi@0 578 * Wizard form to configure your sheep.
danielebarchiesi@0 579 */
danielebarchiesi@0 580 function ctools_ajax_sample_configure_sheep($form, &$form_state) {
danielebarchiesi@0 581 $form_state['title'] = t('Configure sheep');
danielebarchiesi@0 582
danielebarchiesi@0 583 $form['name'] = array(
danielebarchiesi@0 584 '#type' => 'textfield',
danielebarchiesi@0 585 '#title' => t('Name your sheep'),
danielebarchiesi@0 586 '#default_value' => $form_state['object']->name,
danielebarchiesi@0 587 '#required' => TRUE,
danielebarchiesi@0 588 );
danielebarchiesi@0 589
danielebarchiesi@0 590 $form['sheep'] = array(
danielebarchiesi@0 591 '#title' => t('What kind of sheep'),
danielebarchiesi@0 592 '#type' => 'radios',
danielebarchiesi@0 593 '#options' => array(
danielebarchiesi@0 594 t('Wensleydale') => t('Wensleydale'),
danielebarchiesi@0 595 t('Merino') => t('Merino'),
danielebarchiesi@0 596 t('Corriedale') => t('Coriedale'),
danielebarchiesi@0 597 ),
danielebarchiesi@0 598 '#default_value' => !empty($form_state['object']->sheep) ? $form_state['object']->sheep : '',
danielebarchiesi@0 599 '#required' => TRUE,
danielebarchiesi@0 600 );
danielebarchiesi@0 601 return $form;
danielebarchiesi@0 602 }
danielebarchiesi@0 603
danielebarchiesi@0 604 /**
danielebarchiesi@0 605 * Submit the sheep and store the values from the form.
danielebarchiesi@0 606 */
danielebarchiesi@0 607 function ctools_ajax_sample_configure_sheep_submit(&$form, &$form_state) {
danielebarchiesi@0 608 $form_state['object']->name = $form_state['values']['name'];
danielebarchiesi@0 609 $form_state['object']->sheep = $form_state['values']['sheep'];
danielebarchiesi@0 610 }
danielebarchiesi@0 611
danielebarchiesi@0 612 /**
danielebarchiesi@0 613 * Provide some output for our sheep.
danielebarchiesi@0 614 */
danielebarchiesi@0 615 function ctools_ajax_sample_show_sheep($object) {
danielebarchiesi@0 616 return t('You have a @type sheep named "@name".', array(
danielebarchiesi@0 617 '@type' => $object->sheep,
danielebarchiesi@0 618 '@name' => $object->name,
danielebarchiesi@0 619 ));
danielebarchiesi@0 620 }
danielebarchiesi@0 621
danielebarchiesi@0 622 /**
danielebarchiesi@0 623 * Wizard form to configure your lizard.
danielebarchiesi@0 624 */
danielebarchiesi@0 625 function ctools_ajax_sample_configure_lizard($form, &$form_state) {
danielebarchiesi@0 626 $form_state['title'] = t('Configure lizard');
danielebarchiesi@0 627
danielebarchiesi@0 628 $form['name'] = array(
danielebarchiesi@0 629 '#type' => 'textfield',
danielebarchiesi@0 630 '#title' => t('Name your lizard'),
danielebarchiesi@0 631 '#default_value' => $form_state['object']->name,
danielebarchiesi@0 632 '#required' => TRUE,
danielebarchiesi@0 633 );
danielebarchiesi@0 634
danielebarchiesi@0 635 $form['lizard'] = array(
danielebarchiesi@0 636 '#title' => t('Venomous'),
danielebarchiesi@0 637 '#type' => 'checkbox',
danielebarchiesi@0 638 '#default_value' => !empty($form_state['object']->lizard),
danielebarchiesi@0 639 );
danielebarchiesi@0 640 return $form;
danielebarchiesi@0 641 }
danielebarchiesi@0 642
danielebarchiesi@0 643 /**
danielebarchiesi@0 644 * Submit the lizard and store the values from the form.
danielebarchiesi@0 645 */
danielebarchiesi@0 646 function ctools_ajax_sample_configure_lizard_submit(&$form, &$form_state) {
danielebarchiesi@0 647 $form_state['object']->name = $form_state['values']['name'];
danielebarchiesi@0 648 $form_state['object']->lizard = $form_state['values']['lizard'];
danielebarchiesi@0 649 }
danielebarchiesi@0 650
danielebarchiesi@0 651 /**
danielebarchiesi@0 652 * Provide some output for our raptor.
danielebarchiesi@0 653 */
danielebarchiesi@0 654 function ctools_ajax_sample_show_lizard($object) {
danielebarchiesi@0 655 return t('You have a @type lizard named "@name".', array(
danielebarchiesi@0 656 '@type' => empty($object->lizard) ? t('non-venomous') : t('venomous'),
danielebarchiesi@0 657 '@name' => $object->name,
danielebarchiesi@0 658 ));
danielebarchiesi@0 659 }
danielebarchiesi@0 660
danielebarchiesi@0 661 /**
danielebarchiesi@0 662 * Wizard form to configure your raptor.
danielebarchiesi@0 663 */
danielebarchiesi@0 664 function ctools_ajax_sample_configure_raptor($form, &$form_state) {
danielebarchiesi@0 665 $form_state['title'] = t('Configure raptor');
danielebarchiesi@0 666
danielebarchiesi@0 667 $form['name'] = array(
danielebarchiesi@0 668 '#type' => 'textfield',
danielebarchiesi@0 669 '#title' => t('Name your raptor'),
danielebarchiesi@0 670 '#default_value' => $form_state['object']->name,
danielebarchiesi@0 671 '#required' => TRUE,
danielebarchiesi@0 672 );
danielebarchiesi@0 673
danielebarchiesi@0 674 $form['raptor'] = array(
danielebarchiesi@0 675 '#title' => t('What kind of raptor'),
danielebarchiesi@0 676 '#type' => 'radios',
danielebarchiesi@0 677 '#options' => array(
danielebarchiesi@0 678 t('Eagle') => t('Eagle'),
danielebarchiesi@0 679 t('Hawk') => t('Hawk'),
danielebarchiesi@0 680 t('Owl') => t('Owl'),
danielebarchiesi@0 681 t('Buzzard') => t('Buzzard'),
danielebarchiesi@0 682 ),
danielebarchiesi@0 683 '#default_value' => !empty($form_state['object']->raptor) ? $form_state['object']->raptor : '',
danielebarchiesi@0 684 '#required' => TRUE,
danielebarchiesi@0 685 );
danielebarchiesi@0 686
danielebarchiesi@0 687 $form['domesticated'] = array(
danielebarchiesi@0 688 '#title' => t('Domesticated'),
danielebarchiesi@0 689 '#type' => 'checkbox',
danielebarchiesi@0 690 '#default_value' => !empty($form_state['object']->domesticated),
danielebarchiesi@0 691 );
danielebarchiesi@0 692 return $form;
danielebarchiesi@0 693 }
danielebarchiesi@0 694
danielebarchiesi@0 695 /**
danielebarchiesi@0 696 * Submit the raptor and store the values from the form.
danielebarchiesi@0 697 */
danielebarchiesi@0 698 function ctools_ajax_sample_configure_raptor_submit(&$form, &$form_state) {
danielebarchiesi@0 699 $form_state['object']->name = $form_state['values']['name'];
danielebarchiesi@0 700 $form_state['object']->raptor = $form_state['values']['raptor'];
danielebarchiesi@0 701 $form_state['object']->domesticated = $form_state['values']['domesticated'];
danielebarchiesi@0 702 }
danielebarchiesi@0 703
danielebarchiesi@0 704 /**
danielebarchiesi@0 705 * Provide some output for our raptor.
danielebarchiesi@0 706 */
danielebarchiesi@0 707 function ctools_ajax_sample_show_raptor($object) {
danielebarchiesi@0 708 return t('You have a @type @raptor named "@name".', array(
danielebarchiesi@0 709 '@type' => empty($object->domesticated) ? t('wild') : t('domesticated'),
danielebarchiesi@0 710 '@raptor' => $object->raptor,
danielebarchiesi@0 711 '@name' => $object->name,
danielebarchiesi@0 712 ));
danielebarchiesi@0 713 }
danielebarchiesi@0 714
danielebarchiesi@0 715 /**
danielebarchiesi@0 716 * Helper function to provide a sample jump menu form
danielebarchiesi@0 717 */
danielebarchiesi@0 718 function ctools_ajax_sample_jump_menu_form() {
danielebarchiesi@0 719 $url = url('ctools_ajax_sample/jumped');
danielebarchiesi@0 720 $form_state = array();
danielebarchiesi@0 721 $form = ctools_jump_menu(array(), $form_state, array($url => t('Jump!')), array());
danielebarchiesi@0 722 return $form;
danielebarchiesi@0 723 }
danielebarchiesi@0 724
danielebarchiesi@0 725 /**
danielebarchiesi@0 726 * Provide a message to the user that the jump menu worked
danielebarchiesi@0 727 */
danielebarchiesi@0 728 function ctools_ajax_sample_jump_menu_page() {
danielebarchiesi@0 729 $return_link = l(t('Return to the examples page.'), 'ctools_ajax_sample');
danielebarchiesi@0 730 $output = t('You successfully jumped! !return_link', array('!return_link' => $return_link));
danielebarchiesi@0 731 return $output;
danielebarchiesi@0 732 }
danielebarchiesi@0 733
danielebarchiesi@0 734 /**
danielebarchiesi@0 735 * Provide a form for an example ajax modal button
danielebarchiesi@0 736 */
danielebarchiesi@0 737 function ctools_ajax_sample_ajax_button_form() {
danielebarchiesi@0 738 $form = array();
danielebarchiesi@0 739
danielebarchiesi@0 740 $form['url'] = array(
danielebarchiesi@0 741 '#type' => 'hidden',
danielebarchiesi@0 742 // The name of the class is the #id of $form['ajax_button'] with "-url"
danielebarchiesi@0 743 // suffix.
danielebarchiesi@0 744 '#attributes' => array('class' => array('ctools-ajax-sample-button-url')),
danielebarchiesi@0 745 '#value' => url('ctools_ajax_sample/nojs/animal'),
danielebarchiesi@0 746 );
danielebarchiesi@0 747
danielebarchiesi@0 748 $form['ajax_button'] = array(
danielebarchiesi@0 749 '#type' => 'button',
danielebarchiesi@0 750 '#value' => 'Wizard (button modal)',
danielebarchiesi@0 751 '#attributes' => array('class' => array('ctools-use-modal')),
danielebarchiesi@0 752 '#id' => 'ctools-ajax-sample-button',
danielebarchiesi@0 753 );
danielebarchiesi@0 754
danielebarchiesi@0 755 return $form;
danielebarchiesi@0 756 }