annotate sites/all/modules/quicktabs/quicktabs.admin.inc @ 11:b0ee71395280

deleted .DS_Store files
author danieleb <danielebarchiesi@me.com>
date Mon, 28 Oct 2013 16:12:13 +0000
parents a75ead649730
children 134d4b2e75f6
rev   line source
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 }