danielebarchiesi@0: TRUE and danielebarchiesi@0: * 'modal return' => TRUE should make this system work well in the modal. danielebarchiesi@0: * danielebarchiesi@0: * In addition to standard wizard fields, this supports one extra field: danielebarchiesi@0: * - 'default form': A callback to a 'wrapper' that will be applied to either danielebarchiesi@0: * the first or a marked form. This is useful for adding global features that danielebarchiesi@0: * are applicable to all instances of a plugin, such as identifiers, or danielebarchiesi@0: * contexts, or the like. danielebarchiesi@0: * danielebarchiesi@0: * @param array &$form_state danielebarchiesi@0: * This is a standard form state array. This system imposes some requirements danielebarchiesi@0: * on what will be in the form state: danielebarchiesi@0: * danielebarchiesi@0: * - 'plugin': The plugin definition being edited. danielebarchiesi@0: * - 'conf': The configuration that is being edited, presumed to be an array. danielebarchiesi@0: * Ultimately at the end, this is where the modified config will be danielebarchiesi@0: * found. danielebarchiesi@0: * - 'op': The operation, either 'add' or 'edit'. This is used to derive form danielebarchiesi@0: * names and can also be used to derive default values from the plugin. danielebarchiesi@0: * - 'step': The current step. May be null if it is the 'first' step, but danielebarchiesi@0: * generally needs to be defined in the path. danielebarchiesi@0: * danielebarchiesi@0: * @param string $default_form danielebarchiesi@0: * An optional default form that can be added. danielebarchiesi@0: * danielebarchiesi@0: * @return danielebarchiesi@0: * If this function returns false, no form exists. danielebarchiesi@0: */ danielebarchiesi@0: function ctools_plugin_configure_form($form_info, &$form_state) { danielebarchiesi@0: // Turn the forms defined in the plugin into the format the wizard needs. danielebarchiesi@0: _ctools_plugin_configure_create_form_info($form_info, $form_state['plugin'], $form_state['op']); danielebarchiesi@0: danielebarchiesi@0: if (empty($form_info['order'])) { danielebarchiesi@0: return FALSE; danielebarchiesi@0: } danielebarchiesi@0: danielebarchiesi@0: ctools_include('wizard'); danielebarchiesi@0: return ctools_wizard_multistep_form($form_info, $form_state['step'], $form_state); danielebarchiesi@0: } danielebarchiesi@0: danielebarchiesi@0: function _ctools_plugin_configure_create_form_info(&$form_info, $plugin_definition, $op) { danielebarchiesi@0: // Provide a few extra defaults. danielebarchiesi@0: $form_info += array( danielebarchiesi@0: 'id' => 'ctools_plugin_configure_form', danielebarchiesi@0: 'show back' => TRUE, danielebarchiesi@0: ); danielebarchiesi@0: danielebarchiesi@0: $add_form = isset($form_info['add form name']) ? $form_info['add form name'] : 'add form'; danielebarchiesi@0: $edit_form = isset($form_info['edit form name']) ? $form_info['edit form name'] : 'edit form'; danielebarchiesi@0: danielebarchiesi@0: // Figure out what the forms should actually be. Since they can be specified danielebarchiesi@0: // in a couple of different ways (in order to support simple declarations for danielebarchiesi@0: // the minimal forms but more complex declarations for powerful wizards). danielebarchiesi@0: if ($op == 'add') { danielebarchiesi@0: if (!empty($plugin_definition[$add_form])) { danielebarchiesi@0: $info = $plugin_definition[$add_form]; danielebarchiesi@0: } danielebarchiesi@0: } danielebarchiesi@0: if (!isset($info) || $op == 'edit') { danielebarchiesi@0: // Use the edit form for the add form if add form was completely left off. danielebarchiesi@0: if (!empty($plugin_definition[$edit_form])) { danielebarchiesi@0: $info = $plugin_definition[$edit_form]; danielebarchiesi@0: } danielebarchiesi@0: } danielebarchiesi@0: danielebarchiesi@0: // If there is a default form wrapper, but no form is supplied, danielebarchiesi@0: // use the wrapper as the form. danielebarchiesi@0: if (empty($info) && !empty($form_info['default form'])) { danielebarchiesi@0: $info = $form_info['default form']; danielebarchiesi@0: } danielebarchiesi@0: danielebarchiesi@0: // @todo we may want to make these titles more settable? danielebarchiesi@0: if (is_string($info)) { danielebarchiesi@0: if (empty($plugin_definition['title'])) { danielebarchiesi@0: $title = t('Configure'); danielebarchiesi@0: } danielebarchiesi@0: else if ($op == 'add') { danielebarchiesi@0: $title = t('Configure new !plugin_title', array('!plugin_title' => $plugin_definition['title'])); danielebarchiesi@0: } danielebarchiesi@0: else { danielebarchiesi@0: $title = t('Configure !plugin_title', array('!plugin_title' => $plugin_definition['title'])); danielebarchiesi@0: } danielebarchiesi@0: if (empty($form_info['order'])) { danielebarchiesi@0: $form_info['order'] = array(); danielebarchiesi@0: } danielebarchiesi@0: $form_info['order']['form'] = $title; danielebarchiesi@0: danielebarchiesi@0: if (empty($form_info['forms'])) { danielebarchiesi@0: $form_info['forms'] = array(); danielebarchiesi@0: } danielebarchiesi@0: $form_info['forms']['form'] = array( danielebarchiesi@0: 'title' => $title, danielebarchiesi@0: 'form id' => $info, danielebarchiesi@0: ); danielebarchiesi@0: danielebarchiesi@0: // Add the default form if one is specified. danielebarchiesi@0: if (!empty($form_info['default form']) && $form_info['forms']['form']['form id'] != $form_info['default form']) { danielebarchiesi@0: $form_info['forms']['form']['wrapper'] = $form_info['default form']; danielebarchiesi@0: } danielebarchiesi@0: danielebarchiesi@0: // If no submit is supplied, supply the default submit which will do the danielebarchiesi@0: // most obvious task. danielebarchiesi@0: if (!function_exists($form_info['forms']['form']['form id'] . '_submit')) { danielebarchiesi@0: // Store the original wrapper so we can chain it. danielebarchiesi@0: if (!empty($form_info['forms']['form']['wrapper'])) { danielebarchiesi@0: $form_info['forms']['form']['original wrapper'] = $form_info['forms']['form']['wrapper']; danielebarchiesi@0: } danielebarchiesi@0: $form_info['forms']['form']['wrapper'] = 'ctools_plugins_default_form_wrapper'; danielebarchiesi@0: } danielebarchiesi@0: } danielebarchiesi@0: else if (is_array($info)) { danielebarchiesi@0: if (empty($form_info['order'])) { danielebarchiesi@0: $form_info['order'] = array(); danielebarchiesi@0: } danielebarchiesi@0: if (empty($form_info['forms'])) { danielebarchiesi@0: $form_info['forms'] = array(); danielebarchiesi@0: } danielebarchiesi@0: $count = 0; danielebarchiesi@0: $base = 'step'; danielebarchiesi@0: $wrapper = NULL; danielebarchiesi@0: foreach ($info as $form_id => $title) { danielebarchiesi@0: $step = $base . ++$count; danielebarchiesi@0: if (empty($wrapper)) { danielebarchiesi@0: $wrapper = $step; danielebarchiesi@0: } danielebarchiesi@0: danielebarchiesi@0: if (is_array($title)) { danielebarchiesi@0: if (!empty($title['default'])) { danielebarchiesi@0: $wrapper = $step; danielebarchiesi@0: } danielebarchiesi@0: $title = $title['title']; danielebarchiesi@0: } danielebarchiesi@0: danielebarchiesi@0: $form_info['order'][$step] = $title; danielebarchiesi@0: $form_info['forms'][$step] = array( danielebarchiesi@0: 'title' => $title, danielebarchiesi@0: 'form id' => $form_id, danielebarchiesi@0: ); danielebarchiesi@0: } danielebarchiesi@0: if ($wrapper && !empty($form_info['default form'])) { danielebarchiesi@0: $form_info['forms'][$wrapper]['wrapper'] = $form_info['default form']; danielebarchiesi@0: } danielebarchiesi@0: } danielebarchiesi@0: } danielebarchiesi@0: danielebarchiesi@0: /** danielebarchiesi@0: * A wrapper to provide a default submit so that plugins don't have to duplicate danielebarchiesi@0: * a whole bunch of code to do what most of them want to do anyway. danielebarchiesi@0: */ danielebarchiesi@0: function ctools_plugins_default_form_wrapper($form, &$form_state) { danielebarchiesi@0: $form_info = &$form_state['form_info']; danielebarchiesi@0: $info = $form_info['forms'][$form_state['step']]; danielebarchiesi@0: danielebarchiesi@0: if (isset($info['original wrapper']) && function_exists($info['original wrapper'])) { danielebarchiesi@0: $form = $info['original wrapper']($form, $form_state); danielebarchiesi@0: } danielebarchiesi@0: danielebarchiesi@0: if (isset($form['buttons']['next'])) { danielebarchiesi@0: if (empty($form['buttons']['next']['#submit'])) { danielebarchiesi@0: $form['buttons']['next']['#submit'] = $form['#submit']; danielebarchiesi@0: } danielebarchiesi@0: $form['buttons']['next']['#submit'][] = 'ctools_plugins_default_form_wrapper_submit'; danielebarchiesi@0: } danielebarchiesi@0: if (isset($form['buttons']['return'])) { danielebarchiesi@0: if (empty($form['buttons']['return']['#submit'])) { danielebarchiesi@0: $form['buttons']['return']['#submit'] = $form['#submit']; danielebarchiesi@0: } danielebarchiesi@0: $form['buttons']['return']['#submit'][] = 'ctools_plugins_default_form_wrapper_submit'; danielebarchiesi@0: } danielebarchiesi@0: return $form; danielebarchiesi@0: } danielebarchiesi@0: danielebarchiesi@0: /** danielebarchiesi@0: * Provide a default storage mechanism. danielebarchiesi@0: */ danielebarchiesi@0: function ctools_plugins_default_form_wrapper_submit(&$form, &$form_state) { danielebarchiesi@0: foreach (array_keys($form_state['plugin']['defaults']) as $key) { danielebarchiesi@0: if (isset($form_state['values'][$key])) { danielebarchiesi@0: $form_state['conf'][$key] = $form_state['values'][$key]; danielebarchiesi@0: } danielebarchiesi@0: } danielebarchiesi@0: }