annotate sites/all/modules/ctools/includes/plugins-admin.inc @ 11:b0ee71395280

deleted .DS_Store files
author danieleb <danielebarchiesi@me.com>
date Mon, 28 Oct 2013 16:12:13 +0000
parents ff03f76ab3fe
children
rev   line source
danielebarchiesi@0 1 <?php
danielebarchiesi@0 2
danielebarchiesi@0 3 /**
danielebarchiesi@0 4 * @file
danielebarchiesi@0 5 * Contains generic plugin administration functions.
danielebarchiesi@0 6 *
danielebarchiesi@0 7 * CTools includes the ability to (relatively) easily provide wizard based
danielebarchiesi@0 8 * configuration for plugins, meaning plugins that need configuration can
danielebarchiesi@0 9 * automatically allow multi-step forms.
danielebarchiesi@0 10 *
danielebarchiesi@0 11 * Implementing this
danielebarchiesi@0 12 */
danielebarchiesi@0 13 /**
danielebarchiesi@0 14 * Get a plugin configuration form.
danielebarchiesi@0 15 *
danielebarchiesi@0 16 * The $form_info and $form_state need to be preconfigured with data you'll need
danielebarchiesi@0 17 * such as whether or not you're using ajax, or the modal. $form_info will need
danielebarchiesi@0 18 * your next/submit callbacks so that you can cache your data appropriately.
danielebarchiesi@0 19 *
danielebarchiesi@0 20 * @param array $form_info
danielebarchiesi@0 21 * This form_info *must* contain at least the path. next and finish callbacks
danielebarchiesi@0 22 * are advisable but not necessary if using wizard's auto caching. Setting
danielebarchiesi@0 23 * a cache mechanism is advisable. If not using auto caching, next and finish
danielebarchiesi@0 24 * callbacks will be necessary.
danielebarchiesi@0 25 *
danielebarchiesi@0 26 * Also be sure to set up things such as AJAX settings and any temporary
danielebarchiesi@0 27 * data you will need. Simply setting 'modal' => TRUE and
danielebarchiesi@0 28 * 'modal return' => TRUE should make this system work well in the modal.
danielebarchiesi@0 29 *
danielebarchiesi@0 30 * In addition to standard wizard fields, this supports one extra field:
danielebarchiesi@0 31 * - 'default form': A callback to a 'wrapper' that will be applied to either
danielebarchiesi@0 32 * the first or a marked form. This is useful for adding global features that
danielebarchiesi@0 33 * are applicable to all instances of a plugin, such as identifiers, or
danielebarchiesi@0 34 * contexts, or the like.
danielebarchiesi@0 35 *
danielebarchiesi@0 36 * @param array &$form_state
danielebarchiesi@0 37 * This is a standard form state array. This system imposes some requirements
danielebarchiesi@0 38 * on what will be in the form state:
danielebarchiesi@0 39 *
danielebarchiesi@0 40 * - 'plugin': The plugin definition being edited.
danielebarchiesi@0 41 * - 'conf': The configuration that is being edited, presumed to be an array.
danielebarchiesi@0 42 * Ultimately at the end, this is where the modified config will be
danielebarchiesi@0 43 * found.
danielebarchiesi@0 44 * - 'op': The operation, either 'add' or 'edit'. This is used to derive form
danielebarchiesi@0 45 * names and can also be used to derive default values from the plugin.
danielebarchiesi@0 46 * - 'step': The current step. May be null if it is the 'first' step, but
danielebarchiesi@0 47 * generally needs to be defined in the path.
danielebarchiesi@0 48 *
danielebarchiesi@0 49 * @param string $default_form
danielebarchiesi@0 50 * An optional default form that can be added.
danielebarchiesi@0 51 *
danielebarchiesi@0 52 * @return
danielebarchiesi@0 53 * If this function returns false, no form exists.
danielebarchiesi@0 54 */
danielebarchiesi@0 55 function ctools_plugin_configure_form($form_info, &$form_state) {
danielebarchiesi@0 56 // Turn the forms defined in the plugin into the format the wizard needs.
danielebarchiesi@0 57 _ctools_plugin_configure_create_form_info($form_info, $form_state['plugin'], $form_state['op']);
danielebarchiesi@0 58
danielebarchiesi@0 59 if (empty($form_info['order'])) {
danielebarchiesi@0 60 return FALSE;
danielebarchiesi@0 61 }
danielebarchiesi@0 62
danielebarchiesi@0 63 ctools_include('wizard');
danielebarchiesi@0 64 return ctools_wizard_multistep_form($form_info, $form_state['step'], $form_state);
danielebarchiesi@0 65 }
danielebarchiesi@0 66
danielebarchiesi@0 67 function _ctools_plugin_configure_create_form_info(&$form_info, $plugin_definition, $op) {
danielebarchiesi@0 68 // Provide a few extra defaults.
danielebarchiesi@0 69 $form_info += array(
danielebarchiesi@0 70 'id' => 'ctools_plugin_configure_form',
danielebarchiesi@0 71 'show back' => TRUE,
danielebarchiesi@0 72 );
danielebarchiesi@0 73
danielebarchiesi@0 74 $add_form = isset($form_info['add form name']) ? $form_info['add form name'] : 'add form';
danielebarchiesi@0 75 $edit_form = isset($form_info['edit form name']) ? $form_info['edit form name'] : 'edit form';
danielebarchiesi@0 76
danielebarchiesi@0 77 // Figure out what the forms should actually be. Since they can be specified
danielebarchiesi@0 78 // in a couple of different ways (in order to support simple declarations for
danielebarchiesi@0 79 // the minimal forms but more complex declarations for powerful wizards).
danielebarchiesi@0 80 if ($op == 'add') {
danielebarchiesi@0 81 if (!empty($plugin_definition[$add_form])) {
danielebarchiesi@0 82 $info = $plugin_definition[$add_form];
danielebarchiesi@0 83 }
danielebarchiesi@0 84 }
danielebarchiesi@0 85 if (!isset($info) || $op == 'edit') {
danielebarchiesi@0 86 // Use the edit form for the add form if add form was completely left off.
danielebarchiesi@0 87 if (!empty($plugin_definition[$edit_form])) {
danielebarchiesi@0 88 $info = $plugin_definition[$edit_form];
danielebarchiesi@0 89 }
danielebarchiesi@0 90 }
danielebarchiesi@0 91
danielebarchiesi@0 92 // If there is a default form wrapper, but no form is supplied,
danielebarchiesi@0 93 // use the wrapper as the form.
danielebarchiesi@0 94 if (empty($info) && !empty($form_info['default form'])) {
danielebarchiesi@0 95 $info = $form_info['default form'];
danielebarchiesi@0 96 }
danielebarchiesi@0 97
danielebarchiesi@0 98 // @todo we may want to make these titles more settable?
danielebarchiesi@0 99 if (is_string($info)) {
danielebarchiesi@0 100 if (empty($plugin_definition['title'])) {
danielebarchiesi@0 101 $title = t('Configure');
danielebarchiesi@0 102 }
danielebarchiesi@0 103 else if ($op == 'add') {
danielebarchiesi@0 104 $title = t('Configure new !plugin_title', array('!plugin_title' => $plugin_definition['title']));
danielebarchiesi@0 105 }
danielebarchiesi@0 106 else {
danielebarchiesi@0 107 $title = t('Configure !plugin_title', array('!plugin_title' => $plugin_definition['title']));
danielebarchiesi@0 108 }
danielebarchiesi@0 109 if (empty($form_info['order'])) {
danielebarchiesi@0 110 $form_info['order'] = array();
danielebarchiesi@0 111 }
danielebarchiesi@0 112 $form_info['order']['form'] = $title;
danielebarchiesi@0 113
danielebarchiesi@0 114 if (empty($form_info['forms'])) {
danielebarchiesi@0 115 $form_info['forms'] = array();
danielebarchiesi@0 116 }
danielebarchiesi@0 117 $form_info['forms']['form'] = array(
danielebarchiesi@0 118 'title' => $title,
danielebarchiesi@0 119 'form id' => $info,
danielebarchiesi@0 120 );
danielebarchiesi@0 121
danielebarchiesi@0 122 // Add the default form if one is specified.
danielebarchiesi@0 123 if (!empty($form_info['default form']) && $form_info['forms']['form']['form id'] != $form_info['default form']) {
danielebarchiesi@0 124 $form_info['forms']['form']['wrapper'] = $form_info['default form'];
danielebarchiesi@0 125 }
danielebarchiesi@0 126
danielebarchiesi@0 127 // If no submit is supplied, supply the default submit which will do the
danielebarchiesi@0 128 // most obvious task.
danielebarchiesi@0 129 if (!function_exists($form_info['forms']['form']['form id'] . '_submit')) {
danielebarchiesi@0 130 // Store the original wrapper so we can chain it.
danielebarchiesi@0 131 if (!empty($form_info['forms']['form']['wrapper'])) {
danielebarchiesi@0 132 $form_info['forms']['form']['original wrapper'] = $form_info['forms']['form']['wrapper'];
danielebarchiesi@0 133 }
danielebarchiesi@0 134 $form_info['forms']['form']['wrapper'] = 'ctools_plugins_default_form_wrapper';
danielebarchiesi@0 135 }
danielebarchiesi@0 136 }
danielebarchiesi@0 137 else if (is_array($info)) {
danielebarchiesi@0 138 if (empty($form_info['order'])) {
danielebarchiesi@0 139 $form_info['order'] = array();
danielebarchiesi@0 140 }
danielebarchiesi@0 141 if (empty($form_info['forms'])) {
danielebarchiesi@0 142 $form_info['forms'] = array();
danielebarchiesi@0 143 }
danielebarchiesi@0 144 $count = 0;
danielebarchiesi@0 145 $base = 'step';
danielebarchiesi@0 146 $wrapper = NULL;
danielebarchiesi@0 147 foreach ($info as $form_id => $title) {
danielebarchiesi@0 148 $step = $base . ++$count;
danielebarchiesi@0 149 if (empty($wrapper)) {
danielebarchiesi@0 150 $wrapper = $step;
danielebarchiesi@0 151 }
danielebarchiesi@0 152
danielebarchiesi@0 153 if (is_array($title)) {
danielebarchiesi@0 154 if (!empty($title['default'])) {
danielebarchiesi@0 155 $wrapper = $step;
danielebarchiesi@0 156 }
danielebarchiesi@0 157 $title = $title['title'];
danielebarchiesi@0 158 }
danielebarchiesi@0 159
danielebarchiesi@0 160 $form_info['order'][$step] = $title;
danielebarchiesi@0 161 $form_info['forms'][$step] = array(
danielebarchiesi@0 162 'title' => $title,
danielebarchiesi@0 163 'form id' => $form_id,
danielebarchiesi@0 164 );
danielebarchiesi@0 165 }
danielebarchiesi@0 166 if ($wrapper && !empty($form_info['default form'])) {
danielebarchiesi@0 167 $form_info['forms'][$wrapper]['wrapper'] = $form_info['default form'];
danielebarchiesi@0 168 }
danielebarchiesi@0 169 }
danielebarchiesi@0 170 }
danielebarchiesi@0 171
danielebarchiesi@0 172 /**
danielebarchiesi@0 173 * A wrapper to provide a default submit so that plugins don't have to duplicate
danielebarchiesi@0 174 * a whole bunch of code to do what most of them want to do anyway.
danielebarchiesi@0 175 */
danielebarchiesi@0 176 function ctools_plugins_default_form_wrapper($form, &$form_state) {
danielebarchiesi@0 177 $form_info = &$form_state['form_info'];
danielebarchiesi@0 178 $info = $form_info['forms'][$form_state['step']];
danielebarchiesi@0 179
danielebarchiesi@0 180 if (isset($info['original wrapper']) && function_exists($info['original wrapper'])) {
danielebarchiesi@0 181 $form = $info['original wrapper']($form, $form_state);
danielebarchiesi@0 182 }
danielebarchiesi@0 183
danielebarchiesi@0 184 if (isset($form['buttons']['next'])) {
danielebarchiesi@0 185 if (empty($form['buttons']['next']['#submit'])) {
danielebarchiesi@0 186 $form['buttons']['next']['#submit'] = $form['#submit'];
danielebarchiesi@0 187 }
danielebarchiesi@0 188 $form['buttons']['next']['#submit'][] = 'ctools_plugins_default_form_wrapper_submit';
danielebarchiesi@0 189 }
danielebarchiesi@0 190 if (isset($form['buttons']['return'])) {
danielebarchiesi@0 191 if (empty($form['buttons']['return']['#submit'])) {
danielebarchiesi@0 192 $form['buttons']['return']['#submit'] = $form['#submit'];
danielebarchiesi@0 193 }
danielebarchiesi@0 194 $form['buttons']['return']['#submit'][] = 'ctools_plugins_default_form_wrapper_submit';
danielebarchiesi@0 195 }
danielebarchiesi@0 196 return $form;
danielebarchiesi@0 197 }
danielebarchiesi@0 198
danielebarchiesi@0 199 /**
danielebarchiesi@0 200 * Provide a default storage mechanism.
danielebarchiesi@0 201 */
danielebarchiesi@0 202 function ctools_plugins_default_form_wrapper_submit(&$form, &$form_state) {
danielebarchiesi@0 203 foreach (array_keys($form_state['plugin']['defaults']) as $key) {
danielebarchiesi@0 204 if (isset($form_state['values'][$key])) {
danielebarchiesi@0 205 $form_state['conf'][$key] = $form_state['values'][$key];
danielebarchiesi@0 206 }
danielebarchiesi@0 207 }
danielebarchiesi@0 208 }