| [ Index ] |
PHP Cross Reference of Drupal 6 (gatewave) |
[Summary view] [Print] [Text view]
1 <?php 2 // $Id: form_builder.admin.inc,v 1.14 2009/06/20 06:18:15 quicksketch Exp $ 3 4 /** 5 * @file form_builder.admin.inc 6 * Administrative interface for editing forms. 7 */ 8 9 /** 10 * Main form building interface. Can be used as a menu callback. 11 * 12 * @param $form_type 13 * The type of form being edited. Usually the name of the providing module. 14 * @param $form_id 15 * The unique identifier for the form being edited with the type. 16 */ 17 function form_builder_interface($form_type, $form_id) { 18 module_load_include('inc', 'form_builder', 'includes/form_builder.api'); 19 module_load_include('inc', 'form_builder', 'includes/form_builder.cache'); 20 21 // Set the current form type (used for display of the sidebar block). 22 form_builder_active_form($form_type, $form_id); 23 24 // Load the current state of the form, or create a new cache if needed. 25 $form = form_builder_cache_load($form_type, $form_id); 26 if (!$form) { 27 $form = form_builder_load_form($form_type, $form_id); 28 form_builder_cache_save($form_type, $form_id, $form); 29 } 30 31 $output = ''; 32 $output .= drupal_get_form('form_builder_preview', $form, $form_type, $form_id); 33 $output .= drupal_get_form('form_builder_positions', $form, $form_type, $form_id); 34 35 return $output; 36 } 37 38 /** 39 * Menu callback for adding a field. 40 */ 41 function form_builder_add_page($form_type, $form_id, $element_type) { 42 module_load_include('inc', 'form_builder', 'includes/form_builder.api'); 43 module_load_include('inc', 'form_builder', 'includes/form_builder.cache'); 44 45 $fields = form_builder_get_form_type($form_type); 46 if (isset($fields[$element_type])) { 47 $cache = form_builder_cache_load($form_type, $form_id); 48 $element_id = isset($_REQUEST['element_id']) ? $_REQUEST['element_id'] : 'new_' . time(); 49 $element = $fields[$element_type]['default']; 50 51 // Set the element ID to a hard-coded value if a unique field type. 52 if (isset($fields[$element_type]['unique']) && $fields[$element_type]['unique']) { 53 $element_id = $element_type; 54 } 55 56 $element['#form_builder']['element_id'] = $element_id; 57 $element['#form_builder']['is_new'] = TRUE; 58 $element = form_builder_add_default_properties($element, $form_type, $element_id); 59 60 $element['#weight'] = count(element_children($cache)); 61 62 drupal_alter('form_builder_add_element', $element, $form_type, $form_id); 63 64 // Save any element ID set by the hook_form_builder_add_element_alter(). 65 $element_id = $element['#form_builder']['element_id']; 66 67 form_builder_cache_field_save($form_type, $form_id, $element); 68 69 if (isset($_REQUEST['js'])) { 70 $element = form_builder_cache_field_load($form_type, $form_id, $element_id); 71 $preview_form = form_builder_cache_load($form_type, $form_id); 72 73 $data = array( 74 'formType' => $form_type, 75 'formId' => $form_id, 76 'elementId' => $element_id, 77 'html' => form_builder_field_render($form_type, $form_id, $element_id), 78 'positionForm' => drupal_get_form('form_builder_positions', $preview_form, $form_type, $form_id), 79 'messages' => theme('status_messages'), 80 ); 81 82 drupal_json($data); 83 exit(); 84 } 85 } 86 87 // Otherwise return to the previous page. 88 drupal_goto(); 89 } 90 91 /** 92 * Menu callback for configuring a field. 93 */ 94 function form_builder_configure_page($form_type, $form_id, $element_id) { 95 $output = drupal_get_form('form_builder_field_configure', $form_type, $form_id, $element_id); 96 97 if (isset($_REQUEST['js'])) { 98 // Return the newly changed field. 99 if (isset($_REQUEST['return'])) { 100 form_builder_field_json($form_type, $form_id, $element_id); 101 } 102 // Display the configuration form for a field. 103 else { 104 $data = array( 105 'formType' => $form_type, 106 'formId' => $form_id, 107 'elementId' => $element_id, 108 'html' => $output, 109 'errors' => form_get_errors(), 110 'messages' => theme('status_messages'), 111 ); 112 113 drupal_json($data); 114 exit(); 115 } 116 } 117 118 return $output; 119 } 120 121 /** 122 * Menu callback for removing a field. 123 */ 124 function form_builder_remove_page($form_type, $form_id, $element_id) { 125 $output = drupal_get_form('form_builder_field_remove', $form_type, $form_id, $element_id); 126 127 if (isset($_REQUEST['js']) && !isset($_REQUEST['return'])) { 128 // This after build function immediately returns the form as JSON. 129 $data = array( 130 'formType' => $form_type, 131 'formId' => $form_id, 132 'elementId' => $element_id, 133 'html' => $output, 134 'messages' => theme('status_messages'), 135 ); 136 137 drupal_json($data); 138 exit(); 139 } 140 141 return $output; 142 } 143 144 /** 145 * Form. Given a form array, present it for editing in a preview. 146 */ 147 function form_builder_preview(&$form_state, $form, $form_type, $form_id) { 148 149 // Make modifications to all form elements recursively. 150 $element_ids = form_builder_preview_prepare($form, $form_type, $form_id); 151 152 // Record all the element IDs within the entire form. 153 $form['#form_builder']['element_ids'] = $element_ids; 154 $form['#form_builder']['form_type'] = $form_type; 155 $form['#form_builder']['form_id'] = $form_id; 156 157 // Add a pre_render to the entire form itself. 158 $form['#pre_render'][] = 'form_builder_pre_render_form'; 159 $form['#theme'] = 'form_builder_preview'; 160 161 return $form; 162 } 163 164 /** 165 * Form containing all the current weights and parents of elements. 166 */ 167 function form_builder_positions(&$form_state, $preview_form, $form_type, $form_id) { 168 $form = array( 169 '#tree' => TRUE, 170 '#form_builder' => array( 171 'form_type' => $form_type, 172 'form_id' => $form_id, 173 'form' => $preview_form, 174 ), 175 ); 176 177 // Because this form is updated via AJAX on the calling page, we need to 178 // manually set the action to be the same as the original page. We assume 179 // that the destination and the calling page are the same. 180 if (isset($_GET['destination'])) { 181 $form['#action'] = url($_GET['destination']); 182 } 183 184 form_builder_positions_prepare($form, $preview_form); 185 186 // Drupal MUST have a button to register submissions. 187 // Add a button even though the form is only submitted via AJAX. 188 $form['submit'] = array( 189 '#type' => 'submit', 190 '#value' => t('Update'), 191 ); 192 193 return $form; 194 } 195 196 /** 197 * Recursive helper for form_builder_positions(). Add weight fields. 198 */ 199 function form_builder_positions_prepare(&$form, &$preview_form, $parent_id = FORM_BUILDER_ROOT) { 200 foreach (element_children($preview_form) as $key) { 201 // Keep record of the current parent ID. 202 $previous_parent_id = $parent_id; 203 204 if (isset($preview_form[$key]['#form_builder']['element_id'])) { 205 // Set the parent ID for this element. 206 $preview_form[$key]['#form_builder']['parent_id'] = $parent_id; 207 $element_id = $preview_form[$key]['#form_builder']['element_id']; 208 $parent_id = $element_id; 209 210 $form[$element_id]['weight'] = array( 211 '#type' => 'hidden', 212 '#default_value' => isset($preview_form[$key]['#weight']) ? $preview_form[$key]['#weight'] : 0, 213 '#attributes' => array('class' => 'form-builder-weight form-builder-element-' . $element_id), 214 ); 215 $form[$element_id]['parent'] = array( 216 '#type' => 'hidden', 217 '#default_value' => $preview_form[$key]['#form_builder']['parent_id'], 218 '#attributes' => array('class' => 'form-builder-parent form-builder-element-' . $element_id), 219 ); 220 } 221 222 form_builder_positions_prepare($form, $preview_form[$key], $parent_id); 223 $parent_id = $previous_parent_id; 224 } 225 } 226 227 /** 228 * Submit handler for the form_builder_positions form. 229 */ 230 function form_builder_positions_submit(&$form, &$form_state) { 231 module_load_include('inc', 'form_builder', 'includes/form_builder.api'); 232 module_load_include('inc', 'form_builder', 'includes/form_builder.cache'); 233 234 $form_type = $form['#form_builder']['form_type']; 235 $form_id = $form['#form_builder']['form_id']; 236 $preview_form = $form['#form_builder']['form']; 237 238 foreach (element_children($form) as $element_id) { 239 // Skip items without weight value (like the form token, build_id, etc). 240 if (!isset($form[$element_id]['weight'])) { 241 continue; 242 } 243 244 // Check for changed weights or parents. 245 $element = form_builder_get_element($preview_form, $element_id); 246 $element['#weight'] = $form_state['values'][$element_id]['weight']; 247 $element['#form_builder']['parent_id'] = $form_state['values'][$element_id]['parent']; 248 form_builder_set_element($preview_form, $element); 249 } 250 251 // Save all the changes made. 252 form_builder_cache_save($form_type, $form_id, $preview_form); 253 } 254 255 function theme_form_builder_preview($form) { 256 global $theme; 257 258 jquery_ui_add(array('ui.draggable', 'ui.droppable', 'ui.sortable')); 259 drupal_add_js('misc/jquery.form.js'); 260 drupal_add_js(drupal_get_path('module', 'form_builder') .'/form_builder.js'); 261 // TODO: This JS file should be loaded dynamically as needed. 262 drupal_add_js(drupal_get_path('module', 'options_element') .'/options_element.js'); 263 drupal_add_js('misc/tabledrag.js'); 264 drupal_add_js('misc/collapse.js'); 265 drupal_add_js(array('formBuilder' => array('emptyFieldset' => theme('form_builder_empty_fieldset'))), 'setting'); 266 drupal_add_css(drupal_get_path('module', 'form_builder') .'/form_builder.css'); 267 drupal_add_css(drupal_get_path('module', 'options_element') .'/options_element.css'); 268 269 // Check if the Form Builder block is enabled. 270 // Otherwise make our own columns. 271 $block_enabled = db_result(db_query("SELECT status FROM {blocks} WHERE module = 'form_builder' AND theme = '%s'", $theme)); 272 273 if ($block_enabled && ($theme == 'garland' || $theme == 'minnelli')) { 274 drupal_add_css(drupal_get_path('module', 'form_builder') .'/form_builder.garland.css', 'theme'); 275 } 276 277 $output = ''; 278 $output .= '<div id="form-builder-wrapper" class="' . ($block_enabled ? 'no-palette' : 'with-palette') . '">'; 279 if (!$block_enabled) { 280 $fields = form_builder_get_form_type($form['#form_builder']['form_type']); 281 $groups = module_invoke_all('form_builder_palette_groups'); 282 $output .= '<div id="form-builder-fields">'; 283 $output .= '<div class="block">'; 284 $output .= theme('form_builder_field_palette', $fields, $groups, $form['#form_builder']['form_type'], $form['#form_builder']['form_id']); 285 $output .= '</div>'; 286 $output .= '</div>'; 287 } 288 $output .= '<div id="form-builder">'; 289 $output .= '<h3>' . t('Form preview') . '</h3>'; 290 $output .= drupal_render($form); 291 $output .= '</div>'; 292 $output .= '</div>'; 293 return $output; 294 } 295 296 function theme_form_builder_element_prefix($element) { 297 $removable = isset($element['#form_builder']['removable']) ? $element['#form_builder']['removable'] : TRUE; 298 $configurable = isset($element['#form_builder']['configurable']) ? $element['#form_builder']['configurable'] : TRUE; 299 300 $output = ''; 301 $output .= '<div class="form-builder-wrapper">'; 302 $output .= '<div class="form-builder-title-bar">'; 303 if ($removable || $configurable) { 304 $output .= '<span class="form-builder-links">'; 305 if ($removable) { 306 $output .= l('<span class="remove">'. t('Remove') .'</span>', 'admin/build/form-builder/remove/' . $element['#form_builder']['form_type'] . '/' . $element['#form_builder']['form_id'] . '/' . $element['#form_builder']['element_id'], array('html' => TRUE, 'attributes' => array('class' => 'remove', 'title' => t('Remove')), 'query' => drupal_get_destination())); 307 } 308 if ($removable && $configurable) { 309 $output .= ' '; 310 } 311 if ($configurable) { 312 $output .= l('<span class="configure">'. t('Configure') .'</span>', 'admin/build/form-builder/configure/' . $element['#form_builder']['form_type'] . '/' . $element['#form_builder']['form_id'] . '/' . $element['#form_builder']['element_id'], array('html' => TRUE, 'attributes' => array('class' => 'configure', 'title' => t('Configure')), 'query' => drupal_get_destination())); 313 } 314 $output .= '</span>'; 315 } 316 $output .= '</div>'; 317 $output .= '<div class="form-builder-element" id="form-builder-element-' . $element['#form_builder']['element_id'] . '">'; 318 // TODO: Overlay image: good idea or bad idea? Prevents any interaction with 319 // form elements in the preview. 320 //$output .= theme('image', drupal_get_path('module', 'form_builder') .'/images/blank.gif', '', '', array('width' => '1', 'height' => '1', 'class' => 'form-builder-disable')); 321 return $output; 322 } 323 324 function theme_form_builder_element_suffix($element) { 325 return '</div></div>'; 326 } 327 328 /** 329 * Placeholder for empty fieldsets during drag and drop. 330 */ 331 function theme_form_builder_empty_fieldset() { 332 $output = ''; 333 $output .= '<div class="form-builder-wrapper form-builder-empty-placeholder">'; 334 $output .= '<span>' . t('This fieldset is empty. Drag a form element into it.') .'</span>'; 335 $output .= '</div>'; 336 return $output; 337 } 338 339 /** 340 * Block for adding new fields. 341 * 342 * @param $fields 343 * A list of all fields can be added to the current form type. 344 * @param $groups 345 * A list of groups that fields may be sorted into. Each field is assigned 346 * a 'palette_group' property which corresponds to one of these groups. 347 * @param $form_type 348 * The form type to which these blocks apply. 349 * @param $form_id 350 * The form ID that is being edited. 351 */ 352 function theme_form_builder_field_palette($fields, $groups, $form_type, $form_id) { 353 $output = ''; 354 $lists = array(); 355 foreach ($fields as $field_name => $field) { 356 $class = array('field-' . $field_name); 357 $style = ''; 358 359 // If a field is unique, add a special class to identify it. 360 if ($field['unique']) { 361 $class[] = 'form-builder-unique'; 362 $class[] = 'form-builder-element-' . $field_name; 363 364 // If already in use, do not display it in the list. 365 if (!empty($field['in_use'])) { 366 $style = 'display: none;'; 367 } 368 } 369 370 $lists[$field['palette_group']]['#weight'] = $groups[$field['palette_group']]['weight']; 371 $lists[$field['palette_group']][] = array( 372 'data' => l($field['title'], 'admin/build/form-builder/add/' . $form_type . '/' . $form_id . '/' . $field_name, array('query' => drupal_get_destination())), 373 'class' => implode(' ', $class), 374 'style' => $style, 375 ); 376 } 377 378 // Sort the lists by weight. 379 uasort($lists, 'element_sort'); 380 381 $output .= '<div id="form-builder-field-palette">'; 382 foreach ($lists as $group => $list) { 383 unset($list['#weight']); 384 $output .= theme('item_list', $list, (count($lists) > 1) ? $groups[$group]['title'] : t('Add a field'), 'ul', array('class' => 'form-builder-fields clear-block')); 385 } 386 $output .= '</div>'; 387 388 return $output; 389 } 390 391 /** 392 * Take a form structure and add a prebuild function to every element. 393 */ 394 function form_builder_pre_render($element) { 395 // Allow modules to make modifications to this element. 396 drupal_alter('form_builder_preview', $element, $element['#form_builder']['form_type'], $element['#form_builder']['form_id']); 397 398 $element['#prefix'] = isset($element['#prefix']) ? theme('form_builder_element_prefix', $element) . $element['#prefix'] : theme('form_builder_element_prefix', $element); 399 $element['#suffix'] = isset($element['#suffix']) ? $element['#suffix'] . theme('form_builder_element_suffix', $element) : theme('form_builder_element_suffix', $element); 400 401 if ($element['#form_builder']['element_type'] == 'fieldset') { 402 $element['#attributes']['class'] = isset($element['#attributes']['class']) ? $element['#attributes']['class'] . ' form-builder-fieldset' : 'form-builder-fieldset'; 403 } 404 405 if (isset($element['#type']) && $element['#type'] == 'fieldset' && count(element_children($element)) == 0) { 406 $element['#children'] = theme('form_builder_empty_fieldset'); 407 } 408 409 return $element; 410 } 411 412 /** 413 * Change the type of the entire form to "markup" before rendering. 414 */ 415 function form_builder_pre_render_form($form) { 416 // We can't have forms inside of forms, so change this entire form a markup. 417 $form['#type'] = 'markup'; 418 419 // Remove unnecessary FAPI elements. 420 unset($form['form_build_id']); 421 unset($form['form_token']); 422 unset($form['form_builder_preview']); 423 424 return $form; 425 } 426 427 function form_builder_after_build($element) { 428 $element['#attributes']['readonly'] = 'readonly'; 429 foreach (element_children($element) as $key) { 430 $element[$key] = form_builder_after_build($element[$key]); 431 } 432 433 return $element; 434 } 435 436 /** 437 * Before editing a form, modify it slightly to add functionality used in 438 * the preview and disable use of the actual form fields in any way. 439 * 440 * @return 441 * A list of all element_ids currently used within this form. 442 */ 443 function form_builder_preview_prepare(&$form, $form_type, $form_id, $parent_id = FORM_BUILDER_ROOT) { 444 $element_ids = array(); 445 foreach (element_children($form) as $key) { 446 // Keep record of the current parent ID. 447 $previous_parent_id = $parent_id; 448 449 if (isset($form[$key]['#form_builder']['element_id'])) { 450 $element_ids[] = $form[$key]['#form_builder']['element_id']; 451 $form[$key]['#pre_render'][] = 'form_builder_pre_render'; 452 $form[$key]['#form_builder']['form_type'] = $form_type; 453 $form[$key]['#form_builder']['form_id'] = $form_id; 454 $form[$key]['#form_builder']['parent_id'] = $parent_id; 455 $parent_id = $form[$key]['#form_builder']['element_id']; 456 } 457 458 // Search within this element for further form elements. 459 $additional_ids = form_builder_preview_prepare($form[$key], $form_type, $form_id, $parent_id); 460 $element_ids = array_merge($element_ids, $additional_ids); 461 $parent_id = $previous_parent_id; 462 } 463 464 return $element_ids; 465 } 466 467 /** 468 * Form for editing a field. 469 */ 470 function form_builder_field_configure($form_state, $form_type, $form_id, $element_id) { 471 module_load_include('inc', 'form_builder', 'includes/form_builder.api'); 472 module_load_include('inc', 'form_builder', 'includes/form_builder.cache'); 473 $element = form_builder_cache_field_load($form_type, $form_id, $element_id); 474 475 // Assemble a form made up of all the configurable properties that this type 476 // of form supports. 477 $form = array(); 478 foreach (form_builder_get_element_properties($form_type, $element['#form_builder']['element_type']) as $property => $property_settings) { 479 if (isset($property_settings['form']) && function_exists($property_settings['form'])) { 480 $function = $property_settings['form']; 481 // Set a default value on the property to avoid notices. 482 $element['#' . $property] = isset($element['#' . $property]) ? $element['#' . $property] : NULL; 483 $form = array_merge($form, $function($form_state, $form_type, $element)); 484 } 485 } 486 487 $form['#form_type'] = $form_type; 488 $form['#form_id'] = $form_id; 489 $form['#element_id'] = $element_id; 490 $form['#element'] = $element; 491 492 $form['form_builder_submit'] = array( 493 '#type' => 'submit', 494 '#value' => t('Save configuration'), 495 '#access' => !isset($_REQUEST['js']), 496 '#weight' => 100, 497 ); 498 499 return $form; 500 } 501 502 /** 503 * Theme function for the display of field configuration. 504 */ 505 function theme_form_builder_field_configure($form) { 506 // Group the properties into separate fieldsets (converted to tabs later). 507 508 $groups = module_invoke_all('form_builder_property_groups', $form['#form_type']); 509 510 foreach (element_children($form) as $key) { 511 // If no group is specified, put the element into the default group. 512 if (!isset($form[$key]['#form_builder']['property_group']) || !isset($groups[$form[$key]['#form_builder']['property_group']])) { 513 if (!isset($form[$key]['#type']) || (isset($form[$key]['#type']) && !in_array($form[$key]['#type'], array('hidden', 'button', 'submit', 'value', 'token')))) { 514 $form[$key]['#form_builder']['property_group'] = 'default'; 515 } 516 } 517 518 if (isset($form[$key]['#form_builder']['property_group'])) { 519 $group = $form[$key]['#form_builder']['property_group']; 520 521 // We add "_property_group" to the field key to prevent conflicts of 522 // property names and group names. 523 if (!isset($form[$group . '_property_group'])) { 524 $form[$group . '_property_group'] = array( 525 '#type' => 'fieldset', 526 '#title' => $groups[$group]['title'], 527 '#weight' => $groups[$group]['weight'], 528 '#collapsible' => isset($groups[$group]['collapsible']) ? $groups[$group]['collapsible'] : FALSE, 529 '#collapsed' => isset($groups[$group]['collapsed']) ? $groups[$group]['collapsed'] : FALSE, 530 '#attributes' => array('class' => 'form-builder-group'), 531 ); 532 } 533 534 $form[$group .'_property_group'][$key] = $form[$key]; 535 unset($form[$key]); 536 } 537 } 538 539 return drupal_render($form); 540 } 541 542 function form_builder_field_configure_submit(&$form, &$form_state) { 543 $form_type = $form['#form_type']; 544 $form_id = $form['#form_id']; 545 $element_id = $form['#element_id']; 546 $element = $form['#element']; 547 548 // Allow each element to do any necessary submission handling. 549 foreach (form_builder_get_element_properties($form_type, $element['#form_builder']['element_type']) as $property => $property_settings) { 550 if (isset($property_settings['submit'])) { 551 foreach ($property_settings['submit'] as $function) { 552 if (function_exists($function)) { 553 $function($form, $form_state); 554 } 555 } 556 } 557 } 558 559 // Allow the element to be updated in a hard-coded fashion by altering the 560 // $form['#element'] item. Using this approach skips the property check. 561 $element = $form['#element']; 562 563 // Update the field according to the settings in $form_state['values']. 564 $saveable = form_builder_get_saveable_properties($form_type, $element); 565 foreach ($form_state['values'] as $property => $value) { 566 if (in_array($property, $saveable)) { 567 // Remove empty properties entirely. 568 if ($value == '') { 569 unset($element['#'. $property]); 570 } 571 else { 572 $element['#'. $property] = $value; 573 } 574 } 575 } 576 577 // Update the form builder cache. 578 form_builder_cache_field_save($form_type, $form_id, $element); 579 580 if (isset($_GET['js'])) { 581 // Option A: Use the destination variable to do a drupal_goto(). Allows 582 // other submit handlers to add on extra functionality. 583 // The destination variable takes precedence over $form_state['redirect']. 584 //$_REQUEST['destination'] = 'admin/build/form-builder/json/' . $form_type . '/' . $form_id . '/' . $element_id; 585 586 // Option B: Immediately print the JSON and exit. Faster and requires only 587 // one HTTP request instead of two. Other submit handlers must be before 588 // this on. 589 form_builder_field_json($form_type, $form_id, $element_id); 590 } 591 } 592 593 /** 594 * Form for removing a field. 595 */ 596 function form_builder_field_remove($form_state, $form_type, $form_id, $element_id) { 597 module_load_include('inc', 'form_builder', 'includes/form_builder.api'); 598 module_load_include('inc', 'form_builder', 'includes/form_builder.cache'); 599 $element = form_builder_cache_field_load($form_type, $form_id, $element_id); 600 601 $form = array(); 602 $form['#form_type'] = $form_type; 603 $form['#form_id'] = $form_id; 604 $form['#element_id'] = $element_id; 605 606 $quesion = t('Remove the field %title?', array('%title' => $element['#title'])); 607 $path = isset($_GET['destination']) ? $_GET['destination'] : NULL; 608 $description = t('Remove the field %title? This field will not be permanently removed until the form configuration is saved.', array('%title' => isset($element['#title']) ? $element['#title'] : $element['#form_builder']['element_id'])); 609 $yes = t('Remove'); 610 611 return confirm_form($form, $quesion, $path, $description, $yes); 612 } 613 614 function form_builder_field_remove_submit(&$form, &$form_state) { 615 $form_type = $form['#form_type']; 616 $form_id = $form['#form_id']; 617 $element_id = $form['#element_id']; 618 619 // Update the form builder cache. 620 form_builder_cache_field_delete($form_type, $form_id, $element_id); 621 622 if (isset($_GET['js'])) { 623 // See form_builder_field_configure_submit() for comparison between using 624 // redirect and immediately printing the JSON. 625 //$form_state['redirect'] = 'admin/build/form-builder/json/' . $form_type . '/' . $form_id . '/' . $element_id; 626 form_builder_field_json($form_type, $form_id, $element_id); 627 } 628 } 629 630 /** 631 * Render a single field independent of other settings. 632 */ 633 function form_builder_field_render($form_type, $form_id, $element_id, $wrapper = FALSE) { 634 module_load_include('inc', 'form_builder', 'includes/form_builder.api'); 635 module_load_include('inc', 'form_builder', 'includes/form_builder.cache'); 636 637 // Load the current state of the form and prepare it for rendering. 638 $form = form_builder_cache_load($form_type, $form_id); 639 $form_state = array('submitted' => FALSE); 640 $form = drupal_retrieve_form('form_builder_preview', $form_state, $form, $form_type, $form_id); 641 drupal_prepare_form('form_builder_preview', $form, $form_state); 642 $form['#post'] = array(); 643 $form = form_builder('form_builder_preview', $form, $form_state); 644 645 // Get only the element wanted and render it. 646 $element = form_builder_get_element($form, $element_id); 647 $content = drupal_render($element); 648 649 $prefix = isset($element['#prefix']) ? $element['#prefix'] : ''; 650 $suffix = isset($element['#suffix']) ? $element['#suffix'] : ''; 651 652 if ($wrapper) { 653 $prefix .= theme('form_builder_element_prefix', $element); 654 $suffix .= theme('form_builder_element_suffix', $element); 655 } 656 657 return $suffix . $content . $suffix; 658 } 659 660 /** 661 * Menu callback to display a field as a JSON string. 662 */ 663 function form_builder_field_json($form_type, $form_id, $element_id) { 664 module_load_include('inc', 'form_builder', 'includes/form_builder.api'); 665 module_load_include('inc', 'form_builder', 'includes/form_builder.cache'); 666 $element = form_builder_cache_field_load($form_type, $form_id, $element_id); 667 668 $data = array( 669 'formType' => $form_type, 670 'formId' => $form_id, 671 'elementId' => $element_id, 672 'html' => form_builder_field_render($form_type, $form_id, $element_id), 673 'errors' => form_get_errors(), 674 'messages' => theme('status_messages'), 675 'time' => time(), 676 ); 677 678 drupal_json($data); 679 exit(); 680 }
title
Description
Body
title
Description
Body
title
Description
Body
title
Body
| Generated: Thu Mar 24 11:18:33 2011 | Cross-referenced by PHPXref 0.7 |