'Form', 'page callback' => 'form_manager_interface', 'page arguments' => array('form_manager', 1), 'access arguments' => array('access content'), 'file' => 'includes/form_manager.pages.inc', 'type' => MENU_CALLBACK, ); // Loop through all of the forms' settings to get the path and access options to generate this $result = db_query("SELECT * FROM {form_manager_settings} WHERE status=1"); while($formdata = db_fetch_array($result)) { //if (!menu_get_item($formdata['path'])) { $items[$formdata['path']] = array( 'title' => 'Form', 'page callback' => 'form_manager_interface', 'page arguments' => array('form_manager', $formdata['form_id']), 'access arguments' => array('access content'), 'file' => 'includes/form_manager.pages.inc', 'type' => MENU_CALLBACK, ); //} } /* Admin page menu items */ $items['admin/build/forms'] = array( 'title' => 'Form Manager', 'page callback' => 'form_manager_admin', 'access arguments' => array('administer form_manager forms'), 'file' => 'includes/form_manager.admin.inc', 'type' => MENU_NORMAL_ITEM, 'file' => 'includes/form_manager.admin.inc', ); $items['admin/build/forms/list'] = array( 'title' => 'Form Manager', 'access arguments' => array('administer form_manager forms'), 'type' => MENU_DEFAULT_LOCAL_TASK, ); $items['admin/build/forms/add'] = array( 'title' => 'Edit', 'page callback' => 'drupal_get_form', 'page arguments' => array('form_manager_add'), 'access arguments' => array('administer form_manager forms'), 'type' => MENU_NORMAL_ITEM, 'file' => 'includes/form_manager.admin.inc', ); $items['admin/build/forms/edit/%'] = array( 'title' => 'Edit', 'page callback' => 'form_manager_edit', 'page arguments' => array('form_manager', 4), 'access arguments' => array('administer form_manager forms'), 'type' => MENU_NORMAL_ITEM, 'file' => 'includes/form_manager.admin.inc', ); $items['admin/build/forms/exportfapi/%'] = array( 'title' => 'Export FAPI code', 'page callback' => 'form_manager_export_form_page', 'page arguments' => array(4), 'access arguments' => array('administer form_manager forms'), 'type' => MENU_NORMAL_ITEM, 'file' => 'includes/form_manager.admin.inc', ); $items['admin/build/forms/export/%'] = array( 'title' => 'Export form', 'page arguments' => array(4), 'page callback' => 'form_manager_admin_exportable', 'access arguments' => array('administer form_manager forms'), 'type' => MENU_NORMAL_ITEM, 'file' => 'includes/form_manager.admin.inc', ); $items['admin/build/forms/import'] = array( 'title' => 'Import', 'page callback' => 'drupal_get_form', 'page arguments' => array('form_manager_admin_import'), 'access arguments' => array('administer form_manager forms'), 'type' => MENU_NORMAL_ITEM, 'file' => 'includes/form_manager.admin.inc', ); $items['admin/build/forms/delete/%'] = array( 'title' => 'Delete', 'page callback' => 'drupal_get_form', 'page arguments' => array('form_manager_confirm_delete'), 'access arguments' => array('administer form_manager forms'), 'type' => MENU_NORMAL_ITEM, 'file' => 'includes/form_manager.admin.inc', ); return $items; } /** * Implementation of hook_perm(). */ function form_manager_perm() { return array('administer form_manager forms'); } /** * Callback function from hook_menu that displays the form to the user. */ function form_manager_interface($form_type, $form_id) { //module_load_include('inc', 'form_manager', 'includes/form_manager.pages'); $output = drupal_get_form('form_manager_form', $form_id); return $output; } function form_manager_form_validate($form, &$form_state) { // Will do things like compare email and email2, etc... } function form_manager_form_submit($form, &$form_state) { // loop through submitted form values foreach ($form_state['values'] as $k => $v) { // add certain fields to storage $form_state['storage'][$k] = $v; } // handle button action switch ($form_state['clicked_button']['#value']) { case 'Previous': // set the state to rebuild $form_state['rebuild'] = TRUE; // set new step if ($form_state['storage']['#navigation']['step'] > 1) { $form_state['storage']['#navigation']['newStep'] = $form_state['storage']['#navigation']['step'] - 1; } break; case 'Next': // set the state to rebuild $form_state['rebuild'] = TRUE; // set new step if ($form_state['storage']['#navigation']['step'] < $form_state['storage']['#navigation']['maxSteps']) { $form_state['storage']['#navigation']['newStep'] = $form_state['storage']['#navigation']['step'] + 1; } break; case 'Save': // TODO break; // tabs default: // check if the button value maps to a tab $key = array_search($form_state['clicked_button']['#value'], $form_state['storage']['#navigation']['tabs']); if ($key) { $form_state['storage']['#navigation']['newStep'] = $key; } break; } } /** * Implementation of hook_form_alter * * Form Builder module hardcodes the options limit, so we have to ovrecome * that by setting it here. This could be a drupal variable, but left hardcoded * for now. Needs to be at least 300 to allow for list of nations; 3000 is arbitrary. */ function form_manager_form_form_builder_field_configure_alter(&$form, &$form_state) { if (isset($form['options']['#limit'])) { // Set the options widget to a more helpful maximum value than 10 if ($form['options']['#limit'] == 10) { $form['options']['#limit'] = 3000; } } // Add a form element to set the form element's internal name to something other than new_`time()` // [#OPP-19] Add an element to Form Builder to define the element's key $form['element_name'] = array( '#title' => 'Element name', '#type' => 'textfield', '#default_value' => ($form['#element']['#element_name']) ? $form['#element']['#element_name'] : $form['#element']['#key'], '#weight' => 6, ); // do this to add our submit handler since the default form_builder_field_configure_submit // function will print JSON and exit Drupal in the same step, preventing any other submit // functions from executing. array_unshift($form['#submit'], 'form_manager_form_form_builder_field_configure_submit'); } /** * Form submission handler to allow adding an element to the AJAX form to set the name of the * form's element key name. [#OPP-19] Add an element to Form Builder to define the element's key */ function form_manager_form_form_builder_field_configure_submit(&$form, &$form_state) { $form['elementname']['#value'] = str_replace(' ', '_', $form['elementname']['#value']); $form['elementname']['#value'] = str_replace('?', '', $form['elementname']['#value']); $form['elementname']['#value'] = str_replace(',', '', $form['elementname']['#value']); $form['elementname']['#value'] = str_replace('.', '', $form['elementname']['#value']); } /** * Implementation of hook_form_builder_types(). * * Define the supported fields and properties supported by CCK. */ function form_manager_form_builder_types() { $fields = array(); $fields['fieldset'] = array( 'title' => t('Fieldset'), 'properties' => array( 'title', 'description', 'collapsible', 'collapsed', 'element_name', ), 'default' => array( '#title' => t('New fieldset'), '#type' => 'fieldset', '#collapsible' => TRUE, '#collapsed' => FALSE, ), ); $fields['number'] = array( 'title' => t('Number'), 'properties' => array( 'title', 'description', 'field_prefix', 'field_suffix', 'default_value', 'required', 'element_name', ), // TODO: how to handle validate functions? 'validate' => array( 'number', ), 'default' => array( '#key' => 'number', '#title' => t('New number'), '#type' => 'textfield', ), ); $fields['select'] = array( 'title' => t('Select list'), 'properties' => array( 'title', 'description', 'default_value', 'required', 'options', 'multiple', // Handled by options element. 'key_type', // Handled by options element. 'element_name', ), 'default' => array( '#title' => t('New select list'), '#type' => 'select', '#options' => array('1' => 'one', '2' => 'two', '3' => 'three'), '#multiple_toggle' => TRUE, '#key_type' => 'mixed', ), ); $fields['checkboxes'] = array( 'title' => t('Checkboxes'), 'properties' => array( 'title', 'description', 'default_value', 'required', 'options', 'multiple', 'key_type', // Handled by options element. 'element_name', ), 'default' => array( '#title' => t('New checkboxes'), '#type' => 'checkboxes', '#options' => array('one' => 'one', 'two' => 'two', 'three' => 'three'), ), ); $fields['radios'] = array( 'title' => t('Radios'), 'properties' => array( 'title', 'description', 'default_value', 'required', 'options', 'key_type', // Handled by options element. 'element_name', ), 'default' => array( '#title' => t('New radios'), '#type' => 'radios', '#options' => array('one' => 'one', 'two' => 'two', 'three' => 'three'), ), ); $fields['textfield'] = array( 'title' => t('Textfield'), 'properties' => array( 'title', 'description', 'field_prefix', 'field_suffix', 'default_value', 'required', 'size', 'element_name', ), 'default' => array( '#title' => t('New textfield'), '#type' => 'textfield', ), ); $fields['textarea'] = array( 'title' => t('Textarea'), 'properties' => array( 'title', 'description', 'default_value', 'required', 'rows', 'cols', 'input_format', 'element_name', ), 'default' => array( '#title' => t('New textarea'), '#type' => 'textarea', ), ); $fields['file'] = array( 'title' => t('File'), 'properties' => array( 'title', 'description', 'required', 'size', 'file_extension_validate', 'file_size_validate', 'element_name', ), 'default' => array( '#title' => t('New file'), '#type' => 'file', '#size' => 30, ), ); $fields['image'] = array( 'title' => t('Image'), 'properties' => array( 'title', 'description', 'required', 'element_name', ), 'validate' => array( 'file_extension_validate', 'file_size_validate', 'file_image_size', ), 'default' => array( '#title' => t('New image'), '#type' => 'file', '#size' => 30, ), ); $fields['date_popup'] = array( 'title' => t('Date'), 'properties' => array( 'title', 'description', 'default_value', 'required', 'element_name', 'date_format', 'date_year_range', ), // TODO: how to handle validate functions? 'validate' => array( 'date_popup', ), 'default' => array( '#title' => t('New date'), '#type' => 'date_popup', '#date_format' => 'm/d/Y', '#default_value' => 'YYYY-MM-DD 00:00:00', '#date_year_range' => '-80:+1', '#size' => 12, ), ); $fields['hidden'] = array( 'title' => t('User ID'), 'properties' => array( 'title', 'value', ), 'default' => array( '#type' => 'hidden', '#value' => 'user_id', // This will be handled as a special case in _form_manager_convert_form() ), ); return array( 'form_manager' => $fields, ); } /** * Implementation of hook_form_builder_load(). * * @param $form_id * The unique identifier for the form being edited. */ function form_manager_form_builder_load($form_type, $form_id) { if ($form_type == 'form_manager') { require_once('includes/form_manager.pages.inc'); $form = array(); $form_state = array(); _form_manager_form_add_fields($form, $form_state); return $form; } } /** * Implementation of hook_form_builder_preview_alter(). */ function form_manager_form_builder_preview_alter($element, $form_type, $form_id) { if ($form_type == 'form_manager') { if (isset($element['#description'])) { $element['#description'] = filter_xss($element['#description']); } } } /* TODO: Move these 2 functions into pages.inc */ /** * Preparring a FAPI form to be editible by Form Builder in form_builder_preview */ function _form_manager_convert_form(&$form, $form_id) { foreach ($form as $key => $value) { //print "Evaluating $key
"; if (!empty($value['#type']) && empty($value['#form_builder'])) { //print "$key needs to be converted ({$value['#type']})
"; $element['#form_builder'] = _form_manager_convert_form_element($key, $form[$key]); foreach (element_children($form[$key]) as $child_key) { //print "$child_key is a child element ($child_key)
"; _form_manager_convert_form($form[$key], $form_id); } } else { if ($value['#type'] == 'hidden') { switch($value['#value']) { case 'user_id': global $user; $form[$key]['#value'] = $user->uid; break; } } } } $form['#form_manager_form_id'] = (empty($form['#form_manager_form_id'])) ? $form_id : $form['#form_manager_form_id']; } function _form_manager_convert_form_element($key, &$element) { $element['#form_builder'] = array( 'element_id' => $key, 'element_type' => $element['#type'], 'configurable' => TRUE, 'removable' => TRUE, ); } function form_manager_theme() { $theme = array( 'form_manager_form' => array( 'arguments' => array('form' => NULL, 'form_id' => NULL), 'template' => 'form_manager_form', ), ); return $theme; } /** * Implementation of hook_preprocess for the form_manager_form theme key. * Sets the template suggestions for form_manager_form.tpl.php and * form_manager_form-FORM_ID.tpl.php. */ function form_manager_preprocess_form_manager_form(&$vars) { if ($vars['form']['#form_manager_form_id']) { $vars['form_id'] = $vars['form']['#form_manager_form_id']; } else { //$($vars['form']['captcha']); } // Add a template suggestion in the form of form_manager_form-FORM_ID.tpl.php $vars['template_files'][] = 'form_manager_form-' . $vars['form_id']; // Set a boolean value whether or not this is the first time the form has been // seen (are we on the start page?) $vars['startpage'] = TRUE; foreach ($vars['form']['#parameters'] as $element) { if (is_array($element)) { if(!empty($element['storage'])) { $vars['startpage'] = FALSE; } } } }