You are here

function _form_builder_add_element in Form Builder 6

Same name and namespace in other branches
  1. 7.2 includes/form_builder.admin.inc \_form_builder_add_element()
  2. 7 includes/form_builder.admin.inc \_form_builder_add_element()

Menu callback helper for adding or cloning a field.

If the $element_id parameter is provided, the new field will be cloned from the corresponding field (and the $element_type parameter will be ignored). Otherwise, a new field of type $element_type will be added from scratch.

2 calls to _form_builder_add_element()
form_builder_add_page in includes/form_builder.admin.inc
Menu callback for adding a field.
form_builder_clone_page in includes/form_builder.admin.inc
Menu callback for cloning a field.

File

includes/form_builder.admin.inc, line 58
form_builder.admin.inc Administrative interface for editing forms.

Code

function _form_builder_add_element($form_type, $form_id, $element_type, $element_id = NULL) {
  module_load_include('inc', 'form_builder', 'includes/form_builder.api');
  module_load_include('inc', 'form_builder', 'includes/form_builder.cache');
  $fields = form_builder_get_form_type($form_type);
  $cache = form_builder_cache_load($form_type, $form_id);
  $element = NULL;

  // If the field is being cloned, copy the original from the current form
  // structure.
  if (isset($element_id)) {
    $element = form_builder_get_elements($cache, array(
      $element_id,
    ));
    if ($element) {

      // We expect a one-element array since we only passed one element ID to
      // form_builder_get_elements().
      $element = array_shift($element);

      // Remove the key so that a new one will be generated.
      unset($element['#key']);

      // Change the title to avoid confusion, and to avoid duplicate
      // auto-generated machine names.
      if (isset($element['#title'])) {
        $element['#title'] = t('Copy of !title', array(
          '!title' => $element['#title'],
        ));
      }

      // Set the element type to the correct value so it will be used
      // consistently throughout this function.
      $element_type = $element['#type'];
    }
  }
  elseif (isset($fields[$element_type]['default'])) {
    $element = $fields[$element_type]['default'];
  }
  if ($element) {
    $element_id = isset($_REQUEST['element_id']) ? $_REQUEST['element_id'] : 'new_' . time();

    // Set the element ID to a hard-coded value if a unique field type.
    if (isset($fields[$element_type]['unique']) && $fields[$element_type]['unique']) {
      $element_id = $element_type;
    }
    $element['#form_builder']['element_id'] = $element_id;
    $element['#form_builder']['is_new'] = TRUE;
    $element = form_builder_add_default_properties($element, $form_type, $element_id);
    $element['#weight'] = count(element_children($cache));
    drupal_alter('form_builder_add_element', $element, $form_type, $form_id);

    // Save any element ID set by the hook_form_builder_add_element_alter().
    $element_id = $element['#form_builder']['element_id'];
    form_builder_cache_field_save($form_type, $form_id, $element);
    if (isset($_REQUEST['js'])) {
      $element = form_builder_cache_field_load($form_type, $form_id, $element_id);
      $form_cache = form_builder_cache_load($form_type, $form_id);
      $data = array(
        'formType' => $form_type,
        'formId' => $form_id,
        'elementId' => $element_id,
        'html' => form_builder_field_render($form_type, $form_id, $element_id),
        'positionForm' => drupal_get_form('form_builder_positions', $form_cache, $form_type, $form_id),
      );
      form_builder_json_output($data);
      exit;
    }
  }

  // Otherwise return to the previous page.
  drupal_goto();
}