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 }
|