danielebarchiesi@2
|
1 <?php
|
danielebarchiesi@2
|
2 /**
|
danielebarchiesi@2
|
3 * @file
|
danielebarchiesi@2
|
4 * Provides the Quicktabs administrative interface.
|
danielebarchiesi@2
|
5 */
|
danielebarchiesi@2
|
6
|
danielebarchiesi@2
|
7 /**
|
danielebarchiesi@2
|
8 * Page callback to list quicktabs in the system.
|
danielebarchiesi@2
|
9 */
|
danielebarchiesi@2
|
10 function quicktabs_list() {
|
danielebarchiesi@2
|
11 $header = array(
|
danielebarchiesi@2
|
12 array('data' => t('QuickSet')),
|
danielebarchiesi@2
|
13 array('data' => t('Storage')),
|
danielebarchiesi@2
|
14 array('data' => t('Operations'), 'colspan' => 4),
|
danielebarchiesi@2
|
15 );
|
danielebarchiesi@2
|
16 $rows = array();
|
danielebarchiesi@2
|
17
|
danielebarchiesi@2
|
18 foreach (quicktabs_load_multiple() as $qt) {
|
danielebarchiesi@2
|
19 // Determine storage
|
danielebarchiesi@2
|
20 switch ($qt->export_type) {
|
danielebarchiesi@2
|
21 case EXPORT_IN_DATABASE | EXPORT_IN_CODE:
|
danielebarchiesi@2
|
22 $storage = t('Overridden');
|
danielebarchiesi@2
|
23 $delete = l(t('Revert'), 'admin/structure/quicktabs/manage/'. $qt->machine_name .'/delete');
|
danielebarchiesi@2
|
24 break;
|
danielebarchiesi@2
|
25 case EXPORT_IN_DATABASE:
|
danielebarchiesi@2
|
26 $storage = t('Normal');
|
danielebarchiesi@2
|
27 $delete = l(t('Delete'), 'admin/structure/quicktabs/manage/'. $qt->machine_name .'/delete');
|
danielebarchiesi@2
|
28 break;
|
danielebarchiesi@2
|
29 case EXPORT_IN_CODE:
|
danielebarchiesi@2
|
30 $storage = t('Default');
|
danielebarchiesi@2
|
31 $delete = '';
|
danielebarchiesi@2
|
32 break;
|
danielebarchiesi@2
|
33 }
|
danielebarchiesi@2
|
34
|
danielebarchiesi@2
|
35 $tablerow = array(
|
danielebarchiesi@2
|
36 array('data' => check_plain($qt->title)),
|
danielebarchiesi@2
|
37 array('data' => $storage),
|
danielebarchiesi@2
|
38 array('data' => l(t('Edit'), 'admin/structure/quicktabs/manage/'. $qt->machine_name .'/edit')),
|
danielebarchiesi@2
|
39 array('data' => l(t('Export'), 'admin/structure/quicktabs/manage/'. $qt->machine_name .'/export')),
|
danielebarchiesi@2
|
40 array('data' => l(t('Clone'), 'admin/structure/quicktabs/manage/'. $qt->machine_name .'/clone')),
|
danielebarchiesi@2
|
41 array('data' => $delete),
|
danielebarchiesi@2
|
42 );
|
danielebarchiesi@2
|
43 $rows[] = $tablerow;
|
danielebarchiesi@2
|
44 }
|
danielebarchiesi@2
|
45
|
danielebarchiesi@2
|
46 if (empty($rows)) {
|
danielebarchiesi@2
|
47 $rows[] = array(array('data' => t('No quicktabs instances available.'), 'colspan' => 6));
|
danielebarchiesi@2
|
48 }
|
danielebarchiesi@2
|
49
|
danielebarchiesi@2
|
50 $build = array(
|
danielebarchiesi@2
|
51 '#theme' => 'table',
|
danielebarchiesi@2
|
52 '#header' => $header,
|
danielebarchiesi@2
|
53 '#rows' => $rows,
|
danielebarchiesi@2
|
54 '#attributes' => array('id' => 'quicktabs'),
|
danielebarchiesi@2
|
55 );
|
danielebarchiesi@2
|
56 return $build;
|
danielebarchiesi@2
|
57 }
|
danielebarchiesi@2
|
58
|
danielebarchiesi@2
|
59 /**
|
danielebarchiesi@2
|
60 * Clone QuickTabs.
|
danielebarchiesi@2
|
61 */
|
danielebarchiesi@2
|
62 function quicktabs_clone($qt) {
|
danielebarchiesi@2
|
63 unset($qt->machine_name);
|
danielebarchiesi@2
|
64 $qt->title = '';
|
danielebarchiesi@2
|
65 return drupal_get_form('quicktabs_form', 'clone', $qt);
|
danielebarchiesi@2
|
66 }
|
danielebarchiesi@2
|
67
|
danielebarchiesi@2
|
68 /**
|
danielebarchiesi@2
|
69 * Build the quicktab creation and edit form.
|
danielebarchiesi@2
|
70 */
|
danielebarchiesi@6
|
71 function quicktabs_form($form, &$form_state, $formtype, $qt = NULL) {
|
danielebarchiesi@2
|
72 if (!isset($qt)) {
|
danielebarchiesi@2
|
73 $qt = new stdClass;
|
danielebarchiesi@2
|
74 }
|
danielebarchiesi@2
|
75 $form = _quicktabs_admin_main_form($form_state, $qt);
|
danielebarchiesi@2
|
76
|
danielebarchiesi@2
|
77 // If creating a new Quicktabs instance, start off with 2 empty tabs.
|
danielebarchiesi@2
|
78 if (empty($qt->tabs)) {
|
danielebarchiesi@2
|
79 $qt->tabs = array(
|
danielebarchiesi@2
|
80 0 => array(),
|
danielebarchiesi@2
|
81 1 => array(),
|
danielebarchiesi@2
|
82 );
|
danielebarchiesi@2
|
83 }
|
danielebarchiesi@2
|
84
|
danielebarchiesi@2
|
85 // If the "Add another" button was clicked, we need to increment the number of
|
danielebarchiesi@2
|
86 // tabs by one.
|
danielebarchiesi@2
|
87 if (isset($form_state['num_tabs']) && $form_state['num_tabs'] > count($qt->tabs)) {
|
danielebarchiesi@2
|
88 $qt->tabs[] = array();
|
danielebarchiesi@2
|
89 }
|
danielebarchiesi@2
|
90 $form_state['num_tabs'] = count($qt->tabs);
|
danielebarchiesi@2
|
91
|
danielebarchiesi@2
|
92 // If the "Remove" button was clicked for a tab, we need to remove that tab
|
danielebarchiesi@2
|
93 // from the form.
|
danielebarchiesi@2
|
94 if (isset($form_state['to_remove'])) {
|
danielebarchiesi@2
|
95 unset($qt->tabs[$form_state['to_remove']]);
|
danielebarchiesi@2
|
96 unset($form_state['to_remove']);
|
danielebarchiesi@2
|
97 $form_state['num_tabs']--;
|
danielebarchiesi@2
|
98 }
|
danielebarchiesi@2
|
99
|
danielebarchiesi@2
|
100 $tab_titles = array();
|
danielebarchiesi@2
|
101 // Add current tabs to the form.
|
danielebarchiesi@2
|
102 foreach ($qt->tabs as $delta => $tab) {
|
danielebarchiesi@2
|
103 $tab['delta'] = $delta;
|
danielebarchiesi@2
|
104 $form['qt_wrapper']['tabs'][$delta] = _quicktabs_form($tab, $qt);
|
danielebarchiesi@2
|
105 if (isset($tab['title'])) {
|
danielebarchiesi@2
|
106 $tab_titles[$delta] = $tab['title'];
|
danielebarchiesi@2
|
107 }
|
danielebarchiesi@2
|
108 }
|
danielebarchiesi@2
|
109 // If there's only one tab, it shouldn't be removeable.
|
danielebarchiesi@2
|
110 if (count($qt->tabs) == 1) $form['qt_wrapper']['tabs'][$delta]['remove']['#access'] = FALSE;
|
danielebarchiesi@2
|
111
|
danielebarchiesi@2
|
112 $form['default_tab'] = array(
|
danielebarchiesi@2
|
113 '#type' => 'select',
|
danielebarchiesi@2
|
114 '#title' => t('Default tab'),
|
danielebarchiesi@2
|
115 '#options' => $tab_titles,
|
danielebarchiesi@2
|
116 '#default_value' => isset($qt->default_tab) ? $qt->default_tab : 0,
|
danielebarchiesi@2
|
117 '#access' => !empty($tab_titles),
|
danielebarchiesi@2
|
118 '#weight' => -5,
|
danielebarchiesi@2
|
119 );
|
danielebarchiesi@2
|
120
|
danielebarchiesi@2
|
121 return $form;
|
danielebarchiesi@2
|
122 }
|
danielebarchiesi@2
|
123
|
danielebarchiesi@2
|
124 /**
|
danielebarchiesi@2
|
125 * The main section of admin page.
|
danielebarchiesi@2
|
126 */
|
danielebarchiesi@2
|
127 function _quicktabs_admin_main_form($form_state, &$qt) {
|
danielebarchiesi@2
|
128
|
danielebarchiesi@2
|
129 // The contents of $qt will either come from the db or from $form_state.
|
danielebarchiesi@2
|
130 if (isset($form_state['values']['title'])) {
|
danielebarchiesi@2
|
131 $qt = _quicktabs_convert_form_to_quicktabs($form_state);
|
danielebarchiesi@2
|
132 }
|
danielebarchiesi@2
|
133
|
danielebarchiesi@2
|
134 $form['title'] = array(
|
danielebarchiesi@2
|
135 '#title' => t('Title'),
|
danielebarchiesi@2
|
136 '#description' => t('This will appear as the block title.'),
|
danielebarchiesi@2
|
137 '#type' => 'textfield',
|
danielebarchiesi@2
|
138 '#default_value' => isset($qt->title) ? $qt->title : '',
|
danielebarchiesi@2
|
139 '#weight' => -9,
|
danielebarchiesi@2
|
140 '#required' => TRUE,
|
danielebarchiesi@2
|
141 );
|
danielebarchiesi@2
|
142
|
danielebarchiesi@2
|
143 $form['machine_name'] = array(
|
danielebarchiesi@2
|
144 '#type' => 'machine_name',
|
danielebarchiesi@2
|
145 '#maxlength' => 32,
|
danielebarchiesi@2
|
146 '#machine_name' => array(
|
danielebarchiesi@2
|
147 'exists' => 'quicktabs_machine_name_exists',
|
danielebarchiesi@2
|
148 'source' => array('title'),
|
danielebarchiesi@2
|
149 ),
|
danielebarchiesi@2
|
150 '#description' => t('A unique machine-readable name for this Quicktabs instance. It must only contain lowercase letters, numbers, and underscores. The machine name will be used internally by Quicktabs and will be used in the CSS ID of your Quicktabs block.'),
|
danielebarchiesi@2
|
151 '#weight' => -8,
|
danielebarchiesi@2
|
152 );
|
danielebarchiesi@2
|
153
|
danielebarchiesi@2
|
154 if (!empty($qt->machine_name)) {
|
danielebarchiesi@2
|
155 $form['machine_name']['#default_value'] = $qt->machine_name;
|
danielebarchiesi@2
|
156 $form['machine_name']['#disabled'] = TRUE;
|
danielebarchiesi@2
|
157 $form['machine_name']['#value'] = $qt->machine_name;
|
danielebarchiesi@2
|
158 }
|
danielebarchiesi@2
|
159
|
danielebarchiesi@2
|
160 ctools_include('plugins');
|
danielebarchiesi@2
|
161 $renderers = ctools_get_plugins('quicktabs', 'renderers');
|
danielebarchiesi@2
|
162 $renderer_options = array();
|
danielebarchiesi@2
|
163 foreach ($renderers as $name => $info) {
|
danielebarchiesi@2
|
164 if ($class = ctools_plugin_load_class('quicktabs', 'renderers', $name, 'handler')) {
|
danielebarchiesi@2
|
165 // Add the renderer to the dropdown list of renderers
|
danielebarchiesi@2
|
166 $renderer_options[$name] = $name;
|
danielebarchiesi@2
|
167 // Get the renderer's options form elements
|
danielebarchiesi@2
|
168
|
danielebarchiesi@2
|
169 // PHP 5.2 doesn't support $class::staticMethod() syntax, so we have to
|
danielebarchiesi@2
|
170 // use call_user_func_array() until PHP 5.3 is required.
|
danielebarchiesi@2
|
171 $renderer_form_options[$name] = call_user_func_array(array($class, 'optionsForm'), array($qt));
|
danielebarchiesi@2
|
172 }
|
danielebarchiesi@2
|
173 }
|
danielebarchiesi@2
|
174 ksort($renderer_options);
|
danielebarchiesi@2
|
175 $form['renderer'] = array(
|
danielebarchiesi@2
|
176 '#type' => 'select',
|
danielebarchiesi@2
|
177 '#title' => t('Renderer'),
|
danielebarchiesi@2
|
178 '#options' => $renderer_options,
|
danielebarchiesi@2
|
179 '#default_value' => isset($qt->renderer) ? $qt->renderer : 'quicktabs',
|
danielebarchiesi@2
|
180 '#description' => t('Choose how to render the content.'),
|
danielebarchiesi@2
|
181 '#weight' => -7,
|
danielebarchiesi@2
|
182 );
|
danielebarchiesi@2
|
183 // Add the renderer options form elements to the form, to be shown only if the
|
danielebarchiesi@2
|
184 // renderer in question is selected.
|
danielebarchiesi@2
|
185 $form['options'] = array('#tree' => TRUE, '#weight' => -6);
|
danielebarchiesi@2
|
186 foreach ($renderer_form_options as $renderer => $options) {
|
danielebarchiesi@2
|
187 foreach ($options as &$option) {
|
danielebarchiesi@2
|
188 $option['#states'] = array('visible' => array(':input[name="renderer"]' => array('value' => $renderer)));
|
danielebarchiesi@2
|
189 }
|
danielebarchiesi@2
|
190 $form['options'][$renderer] = $options;
|
danielebarchiesi@2
|
191 }
|
danielebarchiesi@2
|
192
|
danielebarchiesi@2
|
193 $styles = module_invoke_all('quicktabs_tabstyles');
|
danielebarchiesi@2
|
194 if (count($styles)) {
|
danielebarchiesi@2
|
195 $style_options = array();
|
danielebarchiesi@2
|
196 // The keys used for options must be valid html IDs.
|
danielebarchiesi@2
|
197 foreach ($styles as $style) {
|
danielebarchiesi@2
|
198 $style_options[$style] = $style;
|
danielebarchiesi@2
|
199 }
|
danielebarchiesi@2
|
200 ksort($style_options);
|
danielebarchiesi@2
|
201 $form['style'] = array(
|
danielebarchiesi@2
|
202 '#type' => 'select',
|
danielebarchiesi@2
|
203 '#title' => t('Style'),
|
danielebarchiesi@2
|
204 '#options' => array('nostyle' => t('No style')) + array('default' => t('Default style')) + $style_options,
|
danielebarchiesi@2
|
205 '#default_value' => isset($qt->style) ? $qt->style : 'default',
|
danielebarchiesi@2
|
206 '#description' => t('Choose the quicktab style.'),
|
danielebarchiesi@2
|
207 '#states' => array('visible' => array(':input[name="renderer"]' => array('value' => 'quicktabs'))),
|
danielebarchiesi@2
|
208 '#weight' => -6,
|
danielebarchiesi@2
|
209 );
|
danielebarchiesi@2
|
210 }
|
danielebarchiesi@2
|
211 else {
|
danielebarchiesi@2
|
212 $form['style'] = array(
|
danielebarchiesi@2
|
213 '#type' => 'value',
|
danielebarchiesi@2
|
214 '#value' => 'nostyle',
|
danielebarchiesi@2
|
215 );
|
danielebarchiesi@2
|
216 }
|
danielebarchiesi@2
|
217
|
danielebarchiesi@2
|
218 $form['ajax'] = array(
|
danielebarchiesi@2
|
219 '#type' => 'radios',
|
danielebarchiesi@2
|
220 '#title' => t('Ajax'),
|
danielebarchiesi@2
|
221 '#options' => array(
|
danielebarchiesi@2
|
222 TRUE => t('Yes') . ': ' . t('Load only the first tab on page view'),
|
danielebarchiesi@2
|
223 FALSE => t('No') . ': ' . t('Load all tabs on page view.'),
|
danielebarchiesi@2
|
224 ),
|
danielebarchiesi@2
|
225 '#default_value' => isset($qt->ajax) ? $qt->ajax : 0,
|
danielebarchiesi@2
|
226 '#description' => t('Choose how the content of tabs should be loaded.<p>By choosing "Yes", only the first tab will be loaded when the page first viewed. Content for other tabs will be loaded only when the user clicks the other tab. This will provide faster initial page loading, but subsequent tab clicks will be slower. This can place less load on a server.</p><p>By choosing "No", all tabs will be loaded when the page is first viewed. This will provide slower initial page loading, and more server load, but subsequent tab clicks will be faster for the user. Use with care if you have heavy views.</p><p>Warning: if you enable Ajax, any block you add to this quicktabs block will be accessible to anonymous users, even if you place role restrictions on the quicktabs block. Do not enable Ajax if the quicktabs block includes any blocks with potentially sensitive information.</p>'),
|
danielebarchiesi@2
|
227 '#states' => array('visible' => array(':input[name="renderer"]' => array('value' => 'quicktabs'))),
|
danielebarchiesi@2
|
228 '#weight' => -5,
|
danielebarchiesi@2
|
229 );
|
danielebarchiesi@2
|
230
|
danielebarchiesi@2
|
231 $form['hide_empty_tabs'] = array(
|
danielebarchiesi@2
|
232 '#type' => 'checkbox',
|
danielebarchiesi@2
|
233 '#title' => t('Hide empty tabs'),
|
danielebarchiesi@2
|
234 '#default_value' => isset($qt->hide_empty_tabs) ? $qt->hide_empty_tabs : 0,
|
danielebarchiesi@2
|
235 '#description' => t('Empty and restricted tabs will not be displayed. Could be useful when the tab content is not accessible.<br />This option does not work in ajax mode.'),
|
danielebarchiesi@2
|
236 '#weight' => -4,
|
danielebarchiesi@2
|
237 );
|
danielebarchiesi@2
|
238
|
danielebarchiesi@2
|
239 // Add a wrapper for the tabs and Add Another Tab button.
|
danielebarchiesi@2
|
240 $form['qt_wrapper'] = array(
|
danielebarchiesi@2
|
241 '#tree' => FALSE,
|
danielebarchiesi@2
|
242 '#weight' => -3,
|
danielebarchiesi@2
|
243 '#prefix' => '<div class="clear-block" id="quicktabs-tabs-wrapper">',
|
danielebarchiesi@2
|
244 '#suffix' => '</div>',
|
danielebarchiesi@2
|
245 );
|
danielebarchiesi@2
|
246
|
danielebarchiesi@2
|
247 $form['qt_wrapper']['tabs'] = array(
|
danielebarchiesi@2
|
248 '#tree' => TRUE,
|
danielebarchiesi@2
|
249 '#prefix' => '<div id="quicktab-tabs">',
|
danielebarchiesi@2
|
250 '#suffix' => '</div>',
|
danielebarchiesi@2
|
251 '#theme' => 'quicktabs_admin_form_tabs',
|
danielebarchiesi@2
|
252 );
|
danielebarchiesi@2
|
253
|
danielebarchiesi@2
|
254 $form['qt_wrapper']['tabs_more'] = array(
|
danielebarchiesi@2
|
255 '#type' => 'submit',
|
danielebarchiesi@2
|
256 '#prefix' => '<div id="add-more-tabs-button">',
|
danielebarchiesi@2
|
257 '#suffix' => '<label for="edit-tabs-more">' . t('Add tab') . '</label></div>',
|
danielebarchiesi@2
|
258 '#value' => t('More tabs'),
|
danielebarchiesi@2
|
259 '#attributes' => array('class' => array('add-tab'), 'title' => t('Click here to add more tabs.')),
|
danielebarchiesi@2
|
260 '#weight' => 1,
|
danielebarchiesi@2
|
261 '#submit' => array('quicktabs_more_tabs_submit'),
|
danielebarchiesi@2
|
262 '#ajax' => array(
|
danielebarchiesi@2
|
263 'callback' => 'quicktabs_ajax_callback',
|
danielebarchiesi@2
|
264 'wrapper' => 'quicktab-tabs',
|
danielebarchiesi@2
|
265 'effect' => 'fade',
|
danielebarchiesi@2
|
266 ),
|
danielebarchiesi@2
|
267 '#limit_validation_errors' => array(),
|
danielebarchiesi@2
|
268 );
|
danielebarchiesi@2
|
269
|
danielebarchiesi@2
|
270 $form['actions'] = array('#type' => 'actions');
|
danielebarchiesi@2
|
271 $form['actions']['submit_form'] = array(
|
danielebarchiesi@2
|
272 '#type' => 'submit',
|
danielebarchiesi@2
|
273 '#value' => t('Save'),
|
danielebarchiesi@2
|
274 );
|
danielebarchiesi@2
|
275
|
danielebarchiesi@2
|
276 return $form;
|
danielebarchiesi@2
|
277 }
|
danielebarchiesi@2
|
278
|
danielebarchiesi@2
|
279 /*
|
danielebarchiesi@2
|
280 * Build one row (one tabpage) on the QT admin form.
|
danielebarchiesi@2
|
281 *
|
danielebarchiesi@2
|
282 * @param array $tab
|
danielebarchiesi@2
|
283 * An array containing the details of this particular tabpage.
|
danielebarchiesi@2
|
284 *
|
danielebarchiesi@2
|
285 * @param object $qt
|
danielebarchiesi@2
|
286 * An object representing the Quicktabs instance that the tabs are
|
danielebarchiesi@2
|
287 * being built for.
|
danielebarchiesi@2
|
288 */
|
danielebarchiesi@2
|
289 function _quicktabs_form(array $tab, $qt) {
|
danielebarchiesi@2
|
290 $form['#tree'] = TRUE;
|
danielebarchiesi@2
|
291 $delta = $tab['delta'];
|
danielebarchiesi@2
|
292
|
danielebarchiesi@2
|
293 $form['weight'] = array(
|
danielebarchiesi@2
|
294 '#type' => 'weight',
|
danielebarchiesi@2
|
295 '#default_value' => isset($tab['weight']) ? $tab['weight'] : $delta-100,
|
danielebarchiesi@2
|
296 '#delta' => 100,
|
danielebarchiesi@2
|
297 );
|
danielebarchiesi@2
|
298
|
danielebarchiesi@2
|
299 $form['title'] = array(
|
danielebarchiesi@2
|
300 '#type' => 'textfield',
|
danielebarchiesi@2
|
301 '#size' => '10',
|
danielebarchiesi@2
|
302 '#default_value' => isset($tab['title']) ? $tab['title'] : '',
|
danielebarchiesi@2
|
303 );
|
danielebarchiesi@2
|
304
|
danielebarchiesi@2
|
305 // Load all "contents" plugins to display a choice of content types.
|
danielebarchiesi@2
|
306 ctools_include('plugins');
|
danielebarchiesi@2
|
307 $contents = ctools_get_plugins('quicktabs', 'contents');
|
danielebarchiesi@2
|
308 foreach ($contents as $name => $info) {
|
danielebarchiesi@2
|
309 if (isset($info['dependencies'])) {
|
danielebarchiesi@2
|
310 foreach ($info['dependencies'] as $dep) {
|
danielebarchiesi@2
|
311 // Do not load the options form for any plugin that is missing dependencies.
|
danielebarchiesi@2
|
312 if (!module_exists($dep)) continue 2;
|
danielebarchiesi@2
|
313 }
|
danielebarchiesi@2
|
314 }
|
danielebarchiesi@2
|
315 $tabtypes[$name] = $name;
|
danielebarchiesi@2
|
316 $content_provider = quick_content_factory($name, $tab);
|
danielebarchiesi@2
|
317 $form = array_merge_recursive($form, $content_provider->optionsForm($delta, $qt));
|
danielebarchiesi@2
|
318 }
|
danielebarchiesi@2
|
319
|
danielebarchiesi@2
|
320 $form['type'] = array(
|
danielebarchiesi@2
|
321 '#type' => 'radios',
|
danielebarchiesi@2
|
322 '#options' => $tabtypes,
|
danielebarchiesi@2
|
323 '#default_value' => isset($tab['type']) ? $tab['type'] : key($tabtypes),
|
danielebarchiesi@2
|
324 );
|
danielebarchiesi@2
|
325
|
danielebarchiesi@2
|
326 $form['remove'] = array(
|
danielebarchiesi@2
|
327 '#type' => 'submit',
|
danielebarchiesi@2
|
328 '#prefix' => '<div>',
|
danielebarchiesi@2
|
329 '#suffix' => '<label for="edit-remove">' . t('Delete') . '</label></div>',
|
danielebarchiesi@2
|
330 '#value' => 'remove_' . $delta,
|
danielebarchiesi@2
|
331 '#attributes' => array('class' => array('delete-tab'), 'title' => t('Click here to delete this tab.')),
|
danielebarchiesi@2
|
332 '#submit' => array('quicktabs_remove_tab_submit'),
|
danielebarchiesi@2
|
333 '#ajax' => array(
|
danielebarchiesi@2
|
334 'callback' => 'quicktabs_ajax_callback',
|
danielebarchiesi@2
|
335 'wrapper' => 'quicktab-tabs',
|
danielebarchiesi@2
|
336 'method' => 'replace',
|
danielebarchiesi@2
|
337 'effect' => 'fade',
|
danielebarchiesi@2
|
338 ),
|
danielebarchiesi@2
|
339 '#limit_validation_errors' => array(),
|
danielebarchiesi@2
|
340 );
|
danielebarchiesi@2
|
341
|
danielebarchiesi@2
|
342 return $form;
|
danielebarchiesi@2
|
343 }
|
danielebarchiesi@2
|
344
|
danielebarchiesi@2
|
345 /**
|
danielebarchiesi@2
|
346 * Theme function for quicktabs admin page.
|
danielebarchiesi@2
|
347 * Theme the form elements for the tabs as draggable table rows.
|
danielebarchiesi@2
|
348 *
|
danielebarchiesi@2
|
349 * @ingroup themeable
|
danielebarchiesi@2
|
350 */
|
danielebarchiesi@2
|
351 function theme_quicktabs_admin_form_tabs($variables) {
|
danielebarchiesi@2
|
352 $tabs = $variables['tabs'];
|
danielebarchiesi@2
|
353
|
danielebarchiesi@2
|
354 drupal_add_tabledrag('qt-tablist-table', 'order', 'sibling', 'qt-tabs-weight');
|
danielebarchiesi@2
|
355 $rows = array();
|
danielebarchiesi@2
|
356 $header = array(
|
danielebarchiesi@2
|
357 t('Tab title'),
|
danielebarchiesi@2
|
358 t('Tab weight'),
|
danielebarchiesi@2
|
359 t('Tab type'),
|
danielebarchiesi@2
|
360 t('Tab content'),
|
danielebarchiesi@2
|
361 t('Operations'),
|
danielebarchiesi@2
|
362 );
|
danielebarchiesi@2
|
363
|
danielebarchiesi@2
|
364 foreach (element_children($tabs) as $key) {
|
danielebarchiesi@2
|
365 $tab = &$tabs[$key];
|
danielebarchiesi@2
|
366 $tab['weight']['#attributes']['class'] = array('qt-tabs-weight');
|
danielebarchiesi@2
|
367
|
danielebarchiesi@2
|
368 // tab settings fields
|
danielebarchiesi@2
|
369 $tab_fields = array(
|
danielebarchiesi@2
|
370 array('data' => drupal_render($tab['title']), 'class' => array('qt-tab-title')),
|
danielebarchiesi@2
|
371 array('data' => drupal_render($tab['weight']), 'class' => array('qt-tab-weight')),
|
danielebarchiesi@2
|
372 array('data' => drupal_render($tab['type']), 'class' => array('qt-tab-type')),
|
danielebarchiesi@2
|
373 );
|
danielebarchiesi@2
|
374
|
danielebarchiesi@2
|
375 // content plugins
|
danielebarchiesi@2
|
376 $content_plugins = '';
|
danielebarchiesi@2
|
377 foreach ($tab['type']['#options'] as $content_provider ) {
|
danielebarchiesi@2
|
378 $tab[$content_provider]['#prefix'] = '<div class="qt-tab-options-form qt-tab-'. $content_provider .'-options-form">';
|
danielebarchiesi@2
|
379 $tab[$content_provider]['#suffix'] = '</div>';
|
danielebarchiesi@2
|
380 $content_plugins .= drupal_render($tab[$content_provider]);
|
danielebarchiesi@2
|
381 }
|
danielebarchiesi@2
|
382 $tab_fields[] = array('data' => $content_plugins);
|
danielebarchiesi@2
|
383 $tab_fields[] = array('data' => drupal_render($tab['remove']), 'class' => array('qt-tab-remove'));
|
danielebarchiesi@2
|
384
|
danielebarchiesi@2
|
385 // Build the table row.
|
danielebarchiesi@2
|
386 $row = array(
|
danielebarchiesi@2
|
387 'data' => $tab_fields,
|
danielebarchiesi@2
|
388 'class' => array('draggable'),
|
danielebarchiesi@2
|
389 );
|
danielebarchiesi@2
|
390
|
danielebarchiesi@2
|
391 // Add additional attributes to the row, such as a class for this row.
|
danielebarchiesi@2
|
392 if (isset($tab['#attributes'])) {
|
danielebarchiesi@2
|
393 $row = array_merge($row, $tab['#attributes']);
|
danielebarchiesi@2
|
394 }
|
danielebarchiesi@2
|
395 $rows[] = $row;
|
danielebarchiesi@2
|
396 }
|
danielebarchiesi@2
|
397
|
danielebarchiesi@2
|
398 $build['quicktab'] = array(
|
danielebarchiesi@2
|
399 '#theme' => 'table',
|
danielebarchiesi@2
|
400 '#header' => $header,
|
danielebarchiesi@2
|
401 '#rows' => $rows,
|
danielebarchiesi@2
|
402 '#attributes' => array('id' => 'qt-tablist-table'),
|
danielebarchiesi@2
|
403 '#weight' => -1,
|
danielebarchiesi@2
|
404 );
|
danielebarchiesi@2
|
405 $build['#attached']['css'][] = drupal_get_path('module', 'quicktabs') . '/css/quicktabs-admin.css';
|
danielebarchiesi@2
|
406 $build['#attached']['js'][] = drupal_get_path('module', 'quicktabs') . '/js/quicktabs_form.js';
|
danielebarchiesi@2
|
407
|
danielebarchiesi@2
|
408 $output = drupal_render($build);
|
danielebarchiesi@2
|
409 return $output;
|
danielebarchiesi@2
|
410 }
|
danielebarchiesi@2
|
411
|
danielebarchiesi@2
|
412 /**
|
danielebarchiesi@2
|
413 * Ajax callback for the add tab and remove tab buttons.
|
danielebarchiesi@2
|
414 */
|
danielebarchiesi@2
|
415 function quicktabs_ajax_callback($form, $form_state) {
|
danielebarchiesi@2
|
416 $form_tabs = $form['qt_wrapper']['tabs'];
|
danielebarchiesi@2
|
417 return $form_tabs;
|
danielebarchiesi@2
|
418 }
|
danielebarchiesi@2
|
419
|
danielebarchiesi@2
|
420 /**
|
danielebarchiesi@2
|
421 * Submit handler for the "Add Tab" button.
|
danielebarchiesi@2
|
422 */
|
danielebarchiesi@2
|
423 function quicktabs_more_tabs_submit($form, &$form_state) {
|
danielebarchiesi@2
|
424 // Increment the number of tabs to be rendered.
|
danielebarchiesi@2
|
425 $form_state['num_tabs']++;
|
danielebarchiesi@2
|
426 $form_state['rebuild'] = TRUE;
|
danielebarchiesi@2
|
427 }
|
danielebarchiesi@2
|
428
|
danielebarchiesi@2
|
429 /**
|
danielebarchiesi@2
|
430 * Submit handler for the "Remove Tab" button.
|
danielebarchiesi@2
|
431 */
|
danielebarchiesi@2
|
432 function quicktabs_remove_tab_submit($form, &$form_state) {
|
danielebarchiesi@2
|
433 // Get the tab delta for the clicked button.
|
danielebarchiesi@2
|
434 $delta = $form_state['clicked_button']['#parents'][1];
|
danielebarchiesi@2
|
435 $form_state['to_remove'] = $delta;
|
danielebarchiesi@2
|
436 $form_state['rebuild'] = TRUE;
|
danielebarchiesi@2
|
437 }
|
danielebarchiesi@2
|
438
|
danielebarchiesi@2
|
439 /**
|
danielebarchiesi@2
|
440 * Validation handler for quicktabs admin page.
|
danielebarchiesi@2
|
441 */
|
danielebarchiesi@2
|
442 function quicktabs_form_validate($form, &$form_state) {
|
danielebarchiesi@2
|
443 if (empty($form_state['values']['machine_name'])) {
|
danielebarchiesi@2
|
444 form_set_error('machine_name', t('The quicktabs machine name is required.'));
|
danielebarchiesi@2
|
445 }
|
danielebarchiesi@2
|
446 elseif (!preg_match('!^[a-z0-9_]+$!', $form_state['values']['machine_name'])) {
|
danielebarchiesi@2
|
447 form_set_error('machine_name', t('The quicktabs machine name must contain only lowercase letters, numbers, and underscores.'));
|
danielebarchiesi@2
|
448 }
|
danielebarchiesi@2
|
449
|
danielebarchiesi@2
|
450 if (!isset($form_state['values']['tabs'])) {
|
danielebarchiesi@2
|
451 form_set_error('', t('At least one tab should be created.'));
|
danielebarchiesi@2
|
452 }
|
danielebarchiesi@2
|
453 else {
|
danielebarchiesi@2
|
454 foreach ($form_state['values']['tabs'] as $j => $tab) {
|
danielebarchiesi@2
|
455 if (empty($tab['title'])) {
|
danielebarchiesi@2
|
456 form_set_error('tabs][' . $j . '][title', t('Title is required for each tab.'));
|
danielebarchiesi@2
|
457 }
|
danielebarchiesi@2
|
458 }
|
danielebarchiesi@2
|
459 }
|
danielebarchiesi@2
|
460 }
|
danielebarchiesi@2
|
461
|
danielebarchiesi@2
|
462 function quicktabs_callback_element_validate($element, &$form_state, $form) {
|
danielebarchiesi@2
|
463 // We can tell which tab delta the element is for from the element's #parents
|
danielebarchiesi@2
|
464 // property, which is an array based on the tree structure.
|
danielebarchiesi@2
|
465 $delta = $element['#parents'][1];
|
danielebarchiesi@2
|
466 if ($form_state['values']['tabs'][$delta]['type'] == 'callback') {
|
danielebarchiesi@2
|
467 if (empty($element['#value']) || url_is_external($element['#value'])) {
|
danielebarchiesi@2
|
468 form_error($element, t('You must specify a valid path.'));
|
danielebarchiesi@2
|
469 }
|
danielebarchiesi@2
|
470 if (strpos($element['#value'], '%') === 0) {
|
danielebarchiesi@2
|
471 form_error($element, t('"%" may not be used for the first segment of a path.'));
|
danielebarchiesi@2
|
472 }
|
danielebarchiesi@2
|
473 // automatically remove '/' from path.
|
danielebarchiesi@2
|
474 $form_state['values']['tabs'][$delta]['callback']['path'] = trim($form_state['values']['tabs'][$delta]['callback']['path'], '/');
|
danielebarchiesi@2
|
475 }
|
danielebarchiesi@2
|
476 }
|
danielebarchiesi@2
|
477
|
danielebarchiesi@2
|
478
|
danielebarchiesi@2
|
479 /**
|
danielebarchiesi@2
|
480 * Submit handler for quicktabs admin page.
|
danielebarchiesi@2
|
481 */
|
danielebarchiesi@2
|
482 function quicktabs_form_submit($form, &$form_state) {
|
danielebarchiesi@2
|
483 if ($form_state['clicked_button']['#id'] == 'edit-submit-form') {
|
danielebarchiesi@2
|
484 $qt = _quicktabs_convert_form_to_quicktabs($form_state);
|
danielebarchiesi@2
|
485
|
danielebarchiesi@2
|
486 $exists = quicktabs_load($qt->machine_name);
|
danielebarchiesi@2
|
487 if ($exists && empty($exists->in_code_only)) {
|
danielebarchiesi@6
|
488 if (quicktabs_update($qt)) {
|
danielebarchiesi@2
|
489 drupal_set_message(t('The Quicktabs instance has been updated.'));
|
danielebarchiesi@2
|
490 }
|
danielebarchiesi@2
|
491 }
|
danielebarchiesi@2
|
492 else {
|
danielebarchiesi@6
|
493 if (quicktabs_save($qt)) {
|
danielebarchiesi@2
|
494 drupal_set_message(t('The Quicktabs instance has been created.'));
|
danielebarchiesi@2
|
495 }
|
danielebarchiesi@2
|
496 }
|
danielebarchiesi@6
|
497 $form_state['redirect'] = 'admin/structure/quicktabs';
|
danielebarchiesi@2
|
498 }
|
danielebarchiesi@2
|
499 }
|
danielebarchiesi@2
|
500
|
danielebarchiesi@2
|
501 /**
|
danielebarchiesi@2
|
502 * Deletion of quicktab block.
|
danielebarchiesi@2
|
503 */
|
danielebarchiesi@2
|
504 function quicktabs_block_delete($form, $form_state, $qt) {
|
danielebarchiesi@2
|
505 $form['machine_name'] = array('#type' => 'hidden', '#value' => $qt->machine_name);
|
danielebarchiesi@2
|
506 $form['title'] = array('#type' => 'hidden', '#value' => $qt->title);
|
danielebarchiesi@2
|
507 return confirm_form($form, t('Are you sure you want to delete the quicktab block %title?', array('%title' => $qt->title)), 'admin/structure/quicktabs', '', t('Delete'), t('Cancel'));
|
danielebarchiesi@2
|
508 }
|
danielebarchiesi@2
|
509
|
danielebarchiesi@2
|
510 /**
|
danielebarchiesi@2
|
511 * Submit handler for quicktab block deletion.
|
danielebarchiesi@2
|
512 */
|
danielebarchiesi@2
|
513 function quicktabs_block_delete_submit($form, &$form_state) {
|
danielebarchiesi@6
|
514 quicktabs_delete($form_state['values']['machine_name']);
|
danielebarchiesi@2
|
515 drupal_set_message(t('The Quicktabs instance %name has been removed.', array('%name' => $form_state['values']['title'])));
|
danielebarchiesi@2
|
516 cache_clear_all();
|
danielebarchiesi@2
|
517 $form_state['redirect'] = 'admin/structure/quicktabs';
|
danielebarchiesi@2
|
518 };
|
danielebarchiesi@2
|
519
|
danielebarchiesi@2
|
520 /**
|
danielebarchiesi@2
|
521 * Export form for quicktabs.
|
danielebarchiesi@2
|
522 */
|
danielebarchiesi@2
|
523 function quicktabs_export_form($form, &$form_state, $qt) {
|
danielebarchiesi@2
|
524 ctools_include('export');
|
danielebarchiesi@2
|
525 // Generate export code
|
danielebarchiesi@2
|
526 $code = '$items = array();' ."\n";
|
danielebarchiesi@2
|
527 $code .= ctools_export_object('quicktabs', $qt, '');
|
danielebarchiesi@2
|
528 $code .= '$items["'. $qt->machine_name .'"] = $quicktabs;' ."\n";
|
danielebarchiesi@2
|
529 $code .= 'return $items;';
|
danielebarchiesi@2
|
530
|
danielebarchiesi@2
|
531 // Create form
|
danielebarchiesi@2
|
532 $form = array();
|
danielebarchiesi@2
|
533 $form['export'] = array(
|
danielebarchiesi@2
|
534 '#type' => 'textarea',
|
danielebarchiesi@2
|
535 '#default_value' => $code,
|
danielebarchiesi@2
|
536 '#rows' => substr_count($code, "\n") + 1,
|
danielebarchiesi@2
|
537 '#resizable' => FALSE,
|
danielebarchiesi@2
|
538 '#description' => t('Place this code in your module\'s implementation of <code>hook_quicktabs_default_quicktabs()</code> to provide it as a default quicktab.'),
|
danielebarchiesi@2
|
539 );
|
danielebarchiesi@2
|
540 $form['done'] = array(
|
danielebarchiesi@2
|
541 '#type' => 'submit',
|
danielebarchiesi@2
|
542 '#value' => t('Done'),
|
danielebarchiesi@2
|
543 );
|
danielebarchiesi@2
|
544 $form['#redirect'] = 'admin/structure/quicktabs';
|
danielebarchiesi@2
|
545
|
danielebarchiesi@2
|
546 return $form;
|
danielebarchiesi@2
|
547 }
|
danielebarchiesi@2
|
548
|
danielebarchiesi@2
|
549 /**
|
danielebarchiesi@2
|
550 * Helper function to get all blocks.
|
danielebarchiesi@2
|
551 */
|
danielebarchiesi@2
|
552 function quicktabs_get_blocks() {
|
danielebarchiesi@2
|
553 $blocksarray = &drupal_static(__FUNCTION__, array());
|
danielebarchiesi@2
|
554 if (empty($blocksarray)) {
|
danielebarchiesi@2
|
555 $blocks = _block_rehash();
|
danielebarchiesi@2
|
556 $blocksarray = array();
|
danielebarchiesi@2
|
557 foreach ($blocks as $block) {
|
danielebarchiesi@2
|
558 if ($block['module'] != 'quicktabs') {
|
danielebarchiesi@2
|
559 $key = $block['module'] . '_delta_' . $block['delta'];
|
danielebarchiesi@2
|
560 $blocksarray[$key] = $block['info'] . ' (' . $block['module'] . ':' . $block['delta'] . ')';
|
danielebarchiesi@2
|
561 }
|
danielebarchiesi@2
|
562 }
|
danielebarchiesi@2
|
563 }
|
danielebarchiesi@2
|
564 return $blocksarray;
|
danielebarchiesi@2
|
565 }
|
danielebarchiesi@2
|
566
|
danielebarchiesi@2
|
567 /**
|
danielebarchiesi@2
|
568 * Ajax callback, triggered when view is changed.
|
danielebarchiesi@2
|
569 */
|
danielebarchiesi@2
|
570 function _quicktabs_replace_view_displays_callback($form, $form_state) {
|
danielebarchiesi@2
|
571 $view_name = $form_state['triggering_element']['#value'];
|
danielebarchiesi@2
|
572 $delta = $form_state['triggering_element']['#parents'][1];
|
danielebarchiesi@2
|
573 $display_options = _quicktabs_get_views_displays($view_name);
|
danielebarchiesi@2
|
574 $form['qt_wrapper']['tabs'][$delta]['view']['display']['#options'] = $display_options;
|
danielebarchiesi@2
|
575
|
danielebarchiesi@2
|
576 $commands = array();
|
danielebarchiesi@2
|
577 // Replace the view display dropdown.
|
danielebarchiesi@2
|
578 $commands[] = ajax_command_replace("#view-display-dropdown-$delta", drupal_render($form['qt_wrapper']['tabs'][$delta]['view']['display']));
|
danielebarchiesi@2
|
579 return array('#type' => 'ajax', '#commands' => $commands);
|
danielebarchiesi@2
|
580 }
|
danielebarchiesi@2
|
581
|
danielebarchiesi@2
|
582 /**
|
danielebarchiesi@2
|
583 * Helper function to get all views.
|
danielebarchiesi@2
|
584 */
|
danielebarchiesi@2
|
585 function quicktabs_get_views() {
|
danielebarchiesi@2
|
586 $enabled_views = array();
|
danielebarchiesi@2
|
587 $views = views_get_all_views();
|
danielebarchiesi@2
|
588
|
danielebarchiesi@2
|
589 foreach ($views as $view) {
|
danielebarchiesi@2
|
590 // Skip disabled views.
|
danielebarchiesi@2
|
591 if (!empty($views[$view->name]->disabled)) {
|
danielebarchiesi@2
|
592 continue;
|
danielebarchiesi@2
|
593 }
|
danielebarchiesi@2
|
594 $enabled_views[$view->name] = $view->name;
|
danielebarchiesi@2
|
595 }
|
danielebarchiesi@2
|
596 ksort($enabled_views);
|
danielebarchiesi@2
|
597 return $enabled_views;
|
danielebarchiesi@2
|
598 }
|
danielebarchiesi@2
|
599
|
danielebarchiesi@2
|
600 /**
|
danielebarchiesi@2
|
601 * Helper function to get all view displays.
|
danielebarchiesi@2
|
602 */
|
danielebarchiesi@2
|
603 function _quicktabs_get_views_displays($view_name) {
|
danielebarchiesi@2
|
604 $displays = array();
|
danielebarchiesi@2
|
605 if (empty($view_name)) {
|
danielebarchiesi@2
|
606 // No view.
|
danielebarchiesi@2
|
607 return $displays;
|
danielebarchiesi@2
|
608 }
|
danielebarchiesi@2
|
609
|
danielebarchiesi@2
|
610 $views = views_get_all_views();
|
danielebarchiesi@2
|
611 $view = $views[$view_name];
|
danielebarchiesi@2
|
612
|
danielebarchiesi@2
|
613 if (empty($view->display)) {
|
danielebarchiesi@2
|
614 // This view is broken.
|
danielebarchiesi@2
|
615 return $displays;
|
danielebarchiesi@2
|
616 }
|
danielebarchiesi@2
|
617
|
danielebarchiesi@2
|
618 foreach ($view->display as $id => $display) {
|
danielebarchiesi@2
|
619 $displays[$id] = $id .': '. $display->display_title;
|
danielebarchiesi@2
|
620 }
|
danielebarchiesi@2
|
621 return $displays;
|
danielebarchiesi@2
|
622 }
|
danielebarchiesi@2
|
623
|
danielebarchiesi@2
|
624 /**
|
danielebarchiesi@2
|
625 * Helper function to convert the data on admin form into quicktab presentation.
|
danielebarchiesi@2
|
626 */
|
danielebarchiesi@2
|
627 function _quicktabs_convert_form_to_quicktabs($form_state) {
|
danielebarchiesi@2
|
628 $formvalues_tabs = array();
|
danielebarchiesi@2
|
629 if (!empty($form_state['values']['tabs'])) {
|
danielebarchiesi@2
|
630 foreach ($form_state['values']['tabs'] as $j => $tab) {
|
danielebarchiesi@2
|
631 $formvalues_tabs[$j] = $tab[$tab['type']];
|
danielebarchiesi@2
|
632 $formvalues_tabs[$j]['title'] = $tab['title'];
|
danielebarchiesi@2
|
633 $formvalues_tabs[$j]['weight'] = $tab['weight'];
|
danielebarchiesi@2
|
634 $formvalues_tabs[$j]['type'] = $tab['type'];
|
danielebarchiesi@2
|
635 $weight[$j] = $tab['weight'];
|
danielebarchiesi@2
|
636 }
|
danielebarchiesi@2
|
637 array_multisort($weight, SORT_ASC, $formvalues_tabs);
|
danielebarchiesi@2
|
638 }
|
danielebarchiesi@2
|
639 $renderer = $form_state['values']['renderer'];
|
danielebarchiesi@2
|
640 $qt = new stdClass();
|
danielebarchiesi@2
|
641 $qt->title = $form_state['values']['title'];
|
danielebarchiesi@2
|
642 $qt->ajax = $form_state['values']['ajax'];
|
danielebarchiesi@2
|
643 $qt->default_tab = isset($form_state['values']['default_tab']) ? $form_state['values']['default_tab'] : 0;
|
danielebarchiesi@2
|
644 $qt->hide_empty_tabs = $form_state['values']['hide_empty_tabs'];
|
danielebarchiesi@2
|
645 $qt->renderer = $renderer;
|
danielebarchiesi@2
|
646 $qt->style = $form_state['values']['style'];
|
danielebarchiesi@2
|
647 $qt->tabs = $formvalues_tabs;
|
danielebarchiesi@2
|
648 $qt->options = isset($form_state['values']['options'][$renderer]) ? $form_state['values']['options'][$renderer] : array();
|
danielebarchiesi@2
|
649
|
danielebarchiesi@2
|
650 if (isset($form_state['values']['machine_name'])) {
|
danielebarchiesi@2
|
651 $qt->machine_name = $form_state['values']['machine_name'];
|
danielebarchiesi@2
|
652 }
|
danielebarchiesi@2
|
653
|
danielebarchiesi@2
|
654 return $qt;
|
danielebarchiesi@2
|
655 }
|