[ Index ]

PHP Cross Reference of Drupal 6 (gatewave)

title

Body

[close]

/sites/all/modules/form_builder/includes/ -> form_builder.admin.inc (source)

   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  }


Generated: Thu Mar 24 11:18:33 2011 Cross-referenced by PHPXref 0.7