| [ Index ] |
PHP Cross Reference of Drupal 6 (gatewave) |
[Summary view] [Print] [Text view]
1 <?php 2 // $Id: skinr_ui.module,v 1.1.2.46 2010/10/08 00:41:55 jgirlygirl Exp $ 3 4 /** 5 * Implementation of hook_perm(). 6 */ 7 function skinr_ui_perm() { 8 return array('access skinr', 'access skinr classes', 'administer skinr'); 9 } 10 11 /** 12 * Implementation of hook_menu(). 13 */ 14 function skinr_ui_menu() { 15 $items['admin/build/skinr'] = array( 16 'title' => 'Skinr', 17 'description' => 'Manage your skinr settings and rules, import and export skinr settings for each theme, and configure skinr\'s overlay settings.', 18 'page callback' => 'drupal_get_form', 19 'page arguments' => array('skinr_ui_list', NULL), 20 'access arguments' => array('administer skinr'), 21 'file' => 'skinr_ui.admin.inc', 22 ); 23 $items['admin/build/skinr/list'] = array( 24 'title' => 'List', 25 'type' => MENU_DEFAULT_LOCAL_TASK, 26 'weight' => -10, 27 ); 28 29 // Themes. 30 $items['admin/build/skinr/skins'] = array( 31 'title' => 'Skins', 32 'description' => 'Manage which skins are available when changing Skinr settings.', 33 'page callback' => 'drupal_get_form', 34 'page arguments' => array('skinr_ui_skinsets_form', NULL), 35 'type' => MENU_LOCAL_TASK, 36 'access arguments' => array('administer site configuration'), 37 'file' => 'skinr_ui.admin.inc', 38 ); 39 $items['admin/build/skinr/skins/select'] = array( 40 'title' => 'List', 41 'description' => 'Manage your skins.', 42 'type' => MENU_DEFAULT_LOCAL_TASK, 43 'weight' => -1, 44 ); 45 $items['admin/build/skinr/skins/settings/%'] = array( 46 'title' => 'Skin settings', 47 'description' => 'Manage which options are available for each Skin when changing Skinr settings.', 48 'page callback' => 'drupal_get_form', 49 'page arguments' => array('skinr_ui_skinsets_settings_form', 5), 50 'access arguments' => array('administer site configuration'), 51 'file' => 'skinr_ui.admin.inc', 52 ); 53 54 // Rules. 55 $items['admin/build/skinr/rules'] = array( 56 'title' => 'Rules', 57 'page callback' => 'skinr_rules', 58 'type' => MENU_LOCAL_TASK, 59 'access arguments' => array('administer skinr'), 60 'parent' => 'admin/build/skinr', 61 'weight' => 1, 62 'file' => 'skinr_ui.rules.inc', 63 ); 64 $items['admin/build/skinr/rules/add'] = array( 65 'title' => 'Add rule', 66 'page callback' => 'drupal_get_form', 67 'page arguments' => array('skinr_rule_edit'), 68 'type' => MENU_CALLBACK, 69 'access arguments' => array('administer skinr'), 70 'file' => 'skinr_ui.rules.inc', 71 ); 72 $items['admin/build/skinr/rules/edit'] = array( 73 'title' => 'Edit rule', 74 'page callback' => 'drupal_get_form', 75 'page arguments' => array('skinr_rule_edit'), 76 'type' => MENU_CALLBACK, 77 'access arguments' => array('administer skinr'), 78 'file' => 'skinr_ui.rules.inc', 79 ); 80 $items['admin/build/skinr/rules/delete'] = array( 81 'title' => 'Add rule', 82 'page callback' => 'drupal_get_form', 83 'page arguments' => array('skinr_rule_delete_confirm'), 84 'type' => MENU_CALLBACK, 85 'access arguments' => array('administer skinr'), 86 'file' => 'skinr_ui.rules.inc', 87 ); 88 89 // Import & Export. 90 $items['admin/build/skinr/import'] = array( 91 'title' => 'Import', 92 'page callback' => 'drupal_get_form', 93 'page arguments' => array('skinr_ui_import_form'), 94 'type' => MENU_LOCAL_TASK, 95 'access arguments' => array('administer skinr'), 96 'parent' => 'admin/build/skinr', 97 'weight' => 2, 98 'file' => 'skinr_ui.admin.inc', 99 ); 100 $items['admin/build/skinr/export'] = array( 101 'title' => 'Export', 102 'page callback' => 'drupal_get_form', 103 'page arguments' => array('skinr_ui_export_form'), 104 'type' => MENU_LOCAL_TASK, 105 'access arguments' => array('administer skinr'), 106 'parent' => 'admin/build/skinr', 107 'weight' => 3, 108 'file' => 'skinr_ui.admin.inc', 109 ); 110 111 // Settings. 112 $items['admin/build/skinr/settings'] = array( 113 'title' => 'Settings', 114 'page callback' => 'drupal_get_form', 115 'page arguments' => array('skinr_ui_admin_form'), 116 'type' => MENU_LOCAL_TASK, 117 'access arguments' => array('administer skinr'), 118 'parent' => 'admin/build/skinr', 119 'weight' => 4, 120 'file' => 'skinr_ui.admin.inc', 121 ); 122 123 // Edit Skinr settings. 124 $items['admin/build/skinr/edit/%ctools_js/%/%'] = array( 125 'title' => 'Edit skin', 126 'title callback' => 'skinr_ui_edit_title', 127 'title arguments' => array(5, 6), 128 'page callback' => 'skinr_ui_edit', 129 'page arguments' => array(4, 5, 6), // js|nojs, module, sid 130 'type' => MENU_CALLBACK, 131 'access arguments' => array('administer skinr'), 132 ); 133 134 // Delete Skinr settings. 135 $items['admin/build/skinr/delete/%/%/%'] = array( 136 'title' => 'Delete skin', 137 'page callback' => 'drupal_get_form', 138 'page arguments' => array('skinr_ui_delete_confirm', 4, 5, 6), // theme, module, sid 139 'type' => MENU_CALLBACK, 140 'access arguments' => array('administer skinr'), 141 'file' => 'skinr_ui.admin.inc', 142 ); 143 144 // Fetch skin file info through AJAX. 145 $items['admin/build/skinr/info/%'] = array( 146 'title' => 'Skinr file information', 147 'page callback' => 'skinr_ui_skin_get_files', 148 'page arguments' => array(4), 149 'type' => MENU_CALLBACK, 150 'access arguments' => array('administer skinr'), 151 ); 152 153 return $items; 154 } 155 156 /** 157 * Implementation of hook_theme(). 158 */ 159 function skinr_ui_theme() { 160 return array( 161 'skinr_ui_admin_skins' => array( 162 'arguments' => array('form' => NULL), 163 'file' => 'skinr_ui.admin.inc', 164 ), 165 'skinr_ui_filter_form' => array( 166 'arguments' => array('form' => NULL), 167 'file' => 'skinr_ui.admin.inc', 168 ), 169 'skinr_ui_filters' => array( 170 'arguments' => array('form' => NULL), 171 'file' => 'skinr_ui.admin.inc', 172 ), 173 'skinr_ui_skinsets_form' => array( 174 'arguments' => array('form' => NULL), 175 'file' => 'skinr_ui.admin.inc', 176 ), 177 'skinr_ui_skinsets_settings_form' => array( 178 'arguments' => array('form' => NULL), 179 'file' => 'skinr_ui.admin.inc', 180 ), 181 ); 182 } 183 184 /** 185 * Implementation of hook_help(). 186 */ 187 function skinr_ui_help($path, $arg) { 188 switch ($path) { 189 case 'admin/build/skinr': 190 case 'admin/build/skinr/rules': 191 if (module_exists('advanced_help')) { 192 return t('Visit the <a href="@skinr-help">help page</a> for full documentation.', array('@skinr-help' => url('admin/advanced_help/skinr'))); 193 } 194 else { 195 return t('Please download and enable the <a href="http://drupal.org/project/advanced_help">Advanced Help</a> module for full Skinr documentation.'); 196 } 197 break; 198 case 'admin/build/skinr/skins': 199 return t('This is a placeholder for the actual help text!'); 200 break; 201 } 202 } 203 204 /** 205 * Check if overlay functionality is enabled. 206 */ 207 function skinr_ui_overlay_enabled() { 208 static $warned = FALSE; 209 210 if (!module_exists('dialog') && !$warned) { 211 // Ensure that dialog module is enabled, else functionality will be crippled. 212 $message = 'The dialog module is now required by skinr to function properly. Please enable this module.'; 213 drupal_set_message(t($message), 'error', FALSE); 214 watchdog('skinr', $message, array(), WATCHDOG_CRITICAL); 215 216 $warned = TRUE; 217 } 218 219 return module_exists('dialog'); 220 } 221 222 /** 223 * Title callback for a skinr form. 224 */ 225 function skinr_ui_edit_title($module, $sid) { 226 return t('Skinr settings for !module type !sid', array('!module' => $module, '!sid' => $sid)); 227 } 228 229 /** 230 * Menu callback; prepares some variables and displays a Skinr edit form. 231 * 232 * @param $js 233 * ... 234 * @param $module 235 * The module that we're editing settings of. 236 * @param $sid 237 * The sid of the object we're editing settings of. 238 * @param $sids 239 * ... 240 * 241 * @todo Enter description of parameters. 242 */ 243 function skinr_ui_edit($js = FALSE, $module, $sid, $sids = NULL) { 244 global $gskinr; 245 246 if ($js) { 247 ctools_include('ajax'); 248 $form_state = array( 249 'ajax' => TRUE, 250 'title' => skinr_ui_edit_title($module, $sid), 251 'skinr' => array( 252 'module' => $module, 253 'sid' => $sid, 254 'sids' => $sids, 255 ), 256 ); 257 $output = dialog_form_wrapper('skinr_ui_form', $form_state); 258 if (empty($output)) { 259 $output[] = dialog_command_loading(); 260 261 if (isset($gskinr[$module][$sid])) { 262 if (is_null($sids)) { 263 $sids = $sid; 264 } 265 $output[] = skinr_ui_command_afterupdate($module, $sids, $gskinr[$module][$sid]['classes']['remove'], $gskinr[$module][$sid]['classes']['add'], $gskinr[$module][$sid]['css'], $gskinr[$module][$sid]['js']); 266 unset($gskinr[$module][$sid]); 267 } 268 269 $output[] = dialog_command_dismiss(); 270 } 271 else { 272 foreach ($output as $i => $command) { 273 if ($command['command'] == 'dialog_display') { 274 $output[$i]['options']['height'] = variable_get('skinr_overlay_height', NULL); 275 $output[$i]['options']['width'] = variable_get('skinr_overlay_width', 600); 276 $output[$i]['options']['position'] = 'center'; 277 $output[$i]['options']['resizable'] = TRUE; 278 } 279 } 280 } 281 ctools_ajax_render($output); 282 } 283 else { 284 $arguments = array( 285 'skinr' => array( 286 'module' => $module, 287 'sid' => $sid, 288 'sids' => $sids, 289 ), 290 ); 291 return drupal_get_form('skinr_ui_form', $arguments); 292 } 293 } 294 295 /** 296 * Skinr form. 297 */ 298 function skinr_ui_form(&$form_state, $arguments = array()) { 299 $form = array( 300 '#attributes' => array('class' => 'skinr-form'), 301 ); 302 303 $form['skinr']['module'] = array( 304 '#type' => 'hidden', 305 '#value' => !empty($form_state['skinr']['module']) ? $form_state['skinr']['module'] : $arguments['skinr']['module'], 306 ); 307 $form['skinr']['sid'] = array( 308 '#type' => 'hidden', 309 '#value' => !empty($form_state['skinr']['sid']) ? $form_state['skinr']['sid'] : $arguments['skinr']['sid'], 310 ); 311 if (!empty($form_state['skinr']['sids']) || !empty($arguments['skinr']['sids'])) { 312 $form['skinr']['sids'] = array( 313 '#type' => 'hidden', 314 '#value' => !empty($form_state['skinr']['sids']) ? $form_state['skinr']['sids'] : $arguments['skinr']['sids'], 315 ); 316 } 317 318 $form['submit'] = array( 319 '#type' => 'submit', 320 '#value' => t('Save'), 321 '#weight' => 50, 322 ); 323 324 return $form; 325 } 326 327 /** 328 * Implementation of hook_form_alter(). 329 */ 330 function skinr_ui_form_alter(&$form, $form_state, $form_id) { 331 $skinr_config = skinr_fetch_config(); 332 $info = skinr_skin_data(); 333 334 foreach ($skinr_config as $module => $settings) { 335 if (isset($settings['form'][$form_id])) { 336 if (!empty($form['skinr']) && $form['skinr']['module']['#value'] !== $module) { 337 continue; 338 } 339 340 $form_settings = array_merge(_skinr_fetch_config_defaults('form'), $settings['form'][$form_id]); 341 342 // Check for access. 343 if (!skinr_handler('access_handler', 'access skinr', $form_settings['access_handler'], $form, $form_state)) { 344 // Deny access. 345 break; 346 } 347 348 // Ensure we have the required preprocess_hook or preprocess_hook_callback. 349 if (empty($form_settings['preprocess_hook']) && empty($form_settings['preprocess_hook_callback'])) { 350 trigger_error(sprintf("No preprocess_hook or preprocess_hook_callback was found for form_id '%s' in module '%s'.", $form_id, $module), E_USER_ERROR); 351 } 352 353 $themes = list_themes(); 354 ksort($themes); 355 356 // There's a bug that sometimes disables all themes. This will check for 357 // the bug in question. http://drupal.org/node/305653 358 $enabled_themes = 0; 359 360 foreach ($themes as $theme) { 361 if (!$theme->status) { 362 continue; 363 } 364 $enabled_themes++; 365 366 if (!isset($form['skinr_settings'])) { 367 $form['skinr_settings'] = array( 368 '#tree' => TRUE, 369 '#weight' => $form_settings['skinr_weight'], 370 ); 371 } 372 373 $preprocess_hooks = isset($form_settings['preprocess_hook']) ? $form_settings['preprocess_hook'] : skinr_handler('preprocess_hook_callback', '', $form_settings['preprocess_hook_callback'], $form, $form_state); 374 if (!is_array($preprocess_hooks)) { 375 $preprocess_hooks = array($preprocess_hooks); 376 } 377 378 if (!$form_state['submitted']) { 379 if ($skinr = skinr_handler('data_handler', 'form', $form_settings['data_handler'], $form, $form_state, $theme->name, $module, $form_settings)) { 380 $defaults = $skinr->skins; 381 $additional_default = isset($skinr->skins['_additional']) ? $skinr->skins['_additional'] : ''; 382 $template_default = isset($skinr->skins['_template']) ? $skinr->skins['_template'] : ''; 383 } 384 else { 385 $defaults = array(); 386 $additional_default = ''; 387 $template_default = ''; 388 } 389 } 390 else { 391 // Handle preview before submit. 392 $defaults = $form_state['values']['widgets']; 393 $additional_default = $form_state['values']['_additional']; 394 $template_default = $form_state['values']['_template']; 395 } 396 397 if (!isset($form['skinr_settings'][$module .'_group'])) { 398 $form['skinr_settings'][$module .'_group'] = array( 399 '#type' => 'fieldset', 400 '#title' => t('@skinr_title @title', array('@skinr_title' => $form_settings['skinr_title'], '@title' => $form_settings['title'])), 401 '#description' => t($form_settings['description']) .' <strong>'. implode(', ', $preprocess_hooks) .'</strong>.', 402 '#weight' => $form_settings['weight'], 403 '#collapsible' => TRUE, 404 '#collapsed' => $form_settings['collapsed'], 405 ); 406 } 407 408 // Get current theme, but make sure it's not the admin theme when we're editing with AJAX. 409 $current_theme = skinr_current_theme(TRUE); 410 411 $form['skinr_settings'][$module .'_group'][$theme->name] = array( 412 '#type' => 'fieldset', 413 '#title' => $theme->info['name'] . ($theme->name == $current_theme ? ' ('. t('enabled + default') .')' : ''), 414 '#collapsible' => TRUE, 415 '#collapsed' => $theme->name == $current_theme ? FALSE : TRUE, 416 ); 417 if ($theme->name == $current_theme) { 418 $form['skinr_settings'][$module .'_group'][$theme->name]['#attributes'] = array('class' => 'skinr-ui-current-theme'); 419 $form['skinr_settings'][$module .'_group'][$theme->name]['#weight'] = -10; 420 } 421 422 // Create individual widgets for each skin. 423 $template_options = array(); 424 if (isset($info[$theme->name]->skins)) { 425 foreach ($info[$theme->name]->skins as $skin_id => $skin) { 426 // Check if this skin is disabled. 427 if (empty($skin['status'][$theme->name])) { 428 continue; 429 } 430 431 // Check if this skin applies to this hook. 432 if (!is_array($skin['features']) || (!in_array('*', $skin['features']) && !_skinr_is_featured($preprocess_hooks, $skin['features']))) { 433 continue; 434 } 435 436 // Create widget. 437 switch ($skin['type']) { 438 case 'checkboxes': 439 $field = array( 440 '#type' => 'checkboxes', 441 '#multiple' => TRUE, 442 '#title' => t($skin['title']), 443 '#options' => skinr_ui_info_options_to_form_options($skin['options']), 444 '#default_value' => isset($defaults[$skin_id]) ? $defaults[$skin_id] : array(), 445 '#description' => t($skin['description']), 446 '#weight' => isset($skin['weight']) ? $skin['weight'] : NULL, 447 ); 448 break; 449 case 'radios': 450 $field = array( 451 '#type' => 'radios', 452 '#title' => t($skin['title']), 453 '#options' => array_merge(array('' => '<none>'), skinr_ui_info_options_to_form_options($skin['options'])), 454 '#default_value' => isset($defaults[$skin_id]) ? $defaults[$skin_id] : '', 455 '#description' => t($skin['description']), 456 '#weight' => isset($skin['weight']) ? $skin['weight'] : NULL, 457 ); 458 break; 459 case 'select': 460 $field = array( 461 '#type' => 'select', 462 '#title' => t($skin['title']), 463 '#options' => array_merge(array('' => '<none>'), skinr_ui_info_options_to_form_options($skin['options'])), 464 '#default_value' => isset($defaults[$skin_id]) ? $defaults[$skin_id] : '', 465 '#description' => t($skin['description']), 466 '#weight' => isset($skin['weight']) ? $skin['weight'] : NULL, 467 ); 468 break; 469 } 470 if (empty($skin['group'])) { 471 $form['skinr_settings'][$module .'_group'][$theme->name]['widgets'][$skin_id] = $field; 472 } 473 else { 474 if (!isset($form['skinr_settings'][$module .'_group'][$theme->name]['widgets'][$skin['group']])) { 475 $group = $info[$theme->name]->options['groups'][$skin['group']]; 476 $form['skinr_settings'][$module .'_group'][$theme->name]['widgets'][$skin['group']] = array( 477 '#type' => 'fieldset', 478 '#title' => t($group['title']), 479 '#description' => t($group['description']), 480 '#collapsible' => $group['collapsible'], 481 '#collapsed' => $group['collapsed'], 482 '#weight' => isset($group['weight']) ? $group['weight'] : NULL, 483 ); 484 } 485 $form['skinr_settings'][$module .'_group'][$theme->name]['widgets'][$skin['group']][$skin_id] = $field; 486 } 487 488 // Prepare templates. 489 $templates = skinr_ui_info_templates_filter($skin['templates'], $preprocess_hooks); 490 $template_options = array_merge($template_options, skinr_ui_info_templates_to_form_options($templates)); 491 } 492 } 493 494 // Check for access. 495 if (skinr_handler('access_handler', 'access skinr classes', $form_settings['access_handler'], $form, $form_state)) { 496 $form['skinr_settings'][$module .'_group'][$theme->name]['_additional'] = array( 497 '#type' => 'textfield', 498 '#title' => t('CSS classes'), 499 '#size' => 40, 500 '#description' => t('To add CSS classes manually, enter classes separated by a single space i.e. <code>first-class second-class</code>'), 501 '#default_value' => $additional_default, 502 ); 503 $form['skinr_settings'][$module .'_group'][$theme->name]['_template'] = array( 504 '#type' => !empty($template_options) ? 'select' : 'hidden', 505 '#title' => t('Template file'), 506 '#options' => array_merge(array('' => 'Default'), $template_options), 507 '#default_value' => $template_default, 508 '#description' => t('Optionally, select a template file to use. The "Default" option allows Drupal to handle this.'), 509 ); 510 511 // Only add validation handler once. 512 if (!isset($form['#validate']) || !in_array('skinr_ui_form_validate', $form['#validate'])) { 513 $form['#validate'][] = 'skinr_ui_form_validate'; 514 } 515 // Special for views. 516 if (isset($form['buttons']['submit']['#validate']) && !in_array('skinr_ui_form_validate', $form['buttons']['submit']['#validate'])) { 517 $form['buttons']['submit']['#validate'][] = 'skinr_ui_form_validate'; 518 } 519 } 520 } 521 522 if ($enabled_themes == 0) { 523 drupal_set_message(t('Skinr has detected that none of your themes are enabled. This is likely related the Drupal bug: <a href="http://drupal.org/node/305653">Themes disabled during update</a>. Please re-enable your theme to continue using Skinr.'), 'warning', FALSE); 524 } 525 526 // Only add submit handler once. 527 if (is_string($form_settings['submit_handler_attach_to'])) { 528 // Backwards compatibility with previous versions 529 $form_settings['submit_handler_attach_to'] = explode('][', preg_replace('/(^\[|\]$|\'|")/', '', $form_settings['submit_handler_attach_to'])); 530 } 531 // Find the property to check. 532 $attr = &$form; 533 foreach($form_settings['submit_handler_attach_to'] as $part) { 534 $attr = &$attr[$part]; 535 } 536 if (!empty($attr) && !in_array('skinr_ui_form_submit', $attr)) { 537 $string = $attr[] = 'skinr_ui_form_submit'; 538 } 539 540 // Keep looping, there might be other modules that implement the same form_id. 541 } 542 } 543 } 544 545 /** 546 * Update a skinr area. 547 * 548 * @param $title 549 * The title of the modal. 550 * @param $html 551 * The html to place within the modal. 552 */ 553 function skinr_ui_command_afterupdate($module, $sids, $classes_old, $classes_new, $css = array(), $js = array()) { 554 return array( 555 'command' => 'skinrAfterupdate', 556 'module' => $module, 557 'sids' => $sids, 558 'classes' => array( 559 'remove' => $classes_old, 560 'add' => $classes_new, 561 ), 562 'css' => $css, 563 'js' => $js, 564 ); 565 } 566 567 /** 568 * Validation handler. 569 */ 570 function skinr_ui_form_validate(&$form, &$form_state) { 571 $form_id = $form_state['values']['form_id']; 572 $skinr_config = skinr_fetch_config(); 573 574 $error = FALSE; 575 foreach ($skinr_config as $module => $settings) { 576 if (isset($settings['form'][$form_id]) && isset($form_state['values']['skinr_settings'][$module .'_group'])) { 577 foreach ($form_state['values']['skinr_settings'][$module .'_group'] as $theme_name => $theme) { 578 if (isset($theme['_additional'])) { 579 $form_settings = array_merge(_skinr_fetch_config_defaults('form'), $settings['form'][$form_id]); 580 581 // Validate additional classes field. 582 if (preg_match('/[^a-zA-Z0-9\-\_\s]/', $theme['_additional'])) { 583 form_set_error('skinr_settings]['. $module .'_group]['. $theme_name .'][_additional', t('Additional classes for Skinr may only contain alphanumeric characters, spaces, - and _.')); 584 $error = TRUE; 585 } 586 587 // Keep looping, there might be other modules that implement the same form_id. 588 } 589 } 590 } 591 } 592 593 // Undo any grouping to ease processing on submit. 594 if (!$error) { 595 $info = skinr_skin_data(); 596 foreach ($skinr_config as $module => $settings) { 597 if (isset($settings['form'][$form_id]) && isset($form_state['values']['skinr_settings'][$module .'_group'])) { 598 foreach ($form_state['values']['skinr_settings'][$module .'_group'] as $theme_name => $theme) { 599 if (empty($info[$theme_name]->options['groups'])) { 600 continue; 601 } 602 603 foreach ($info[$theme_name]->options['groups'] as $group_name => $group) { 604 if (!empty($theme['widgets'][$group_name]) && is_array($theme['widgets'][$group_name])) { 605 $group_values = $theme['widgets'][$group_name]; 606 unset($form_state['values']['skinr_settings'][$module .'_group'][$theme_name]['widgets'][$group_name]); 607 $form_state['values']['skinr_settings'][$module .'_group'][$theme_name]['widgets'] = array_merge($form_state['values']['skinr_settings'][$module .'_group'][$theme_name]['widgets'], $group_values); 608 } 609 } 610 } 611 } 612 } 613 } 614 } 615 616 /** 617 * Submit handler. 618 */ 619 function skinr_ui_form_submit(&$form, &$form_state) { 620 global $gskinr; 621 622 $form_id = $form_state['values']['form_id']; 623 $skinr_config = skinr_fetch_config(); 624 $current_theme = skinr_current_theme(TRUE); 625 626 if ($form_id == 'skinr_ui_form') { 627 $module = $form_state['values']['module']; 628 $sids = !empty($form_state['values']['sids']) ? explode(',', $form_state['values']['sids']) : array($form_state['values']['sid']); 629 $settings = $skinr_config[$module]; 630 631 if (isset($settings['form'][$form_id])) { 632 $original_classes = array(); 633 if ($extracted = skinr_skin_extract($module, $sids, $settings, $current_theme)) { 634 $original_classes = $extracted['classes']; 635 } 636 637 $form_settings = array_merge(_skinr_fetch_config_defaults('form'), $settings['form'][$form_id]); 638 skinr_handler('submit_handler', '', $form_settings['submit_handler'], $form, $form_state, $module, $form_settings); 639 640 // Fetch the updated style object. 641 if ($extracted = skinr_skin_extract($module, $sids, $settings, $current_theme, TRUE)) { 642 // Initialize global skinr array to store information for retrieval by js. 643 if (!is_array($gskinr)) { 644 $gskinr = array(); 645 } 646 $sid = $form_state['values']['sid']; 647 648 // Store class information for js to retrieve later on. 649 // @todo Figure out what to do when a custom template file is required. 650 $gskinr[$module][$sid] = array( 651 'module' => $module, 652 'sid' => $sid, 653 'classes' => array( 654 'remove' => implode(' ', $original_classes), 655 'add' => implode(' ', $extracted['classes']), 656 ), 657 'css' => $extracted['css'], 658 'js' => $extracted['js'], 659 ); 660 } 661 } 662 } 663 else { 664 foreach ($skinr_config as $module => $settings) { 665 if (isset($settings['form'][$form_id])) { 666 $form_settings = array_merge(_skinr_fetch_config_defaults('form'), $settings['form'][$form_id]); 667 skinr_handler('submit_handler', '', $form_settings['submit_handler'], $form, $form_state, $module, $form_settings); 668 669 // Keep looping, there might be other modules that implement the same form_id. 670 } 671 } 672 } 673 } 674 675 /** 676 * Implementation of hook_skinr_alter(). 677 */ 678 function skinr_ui_skinr_skins_alter(&$skins, $module, $sids, $settings) { 679 static $once = FALSE; 680 681 if (arg(4) != 'ajax' && user_access('access skinr') && isset($settings['form']['skinr_ui_form']) && skinr_ui_overlay_enabled()) { 682 // Add classes for ajax, and set skinr variable. 683 $skinr_id = _skinr_ui_ajax_id(); 684 $skins += array('_skinr' => 'skinr-region', '_skinr_id' => 'skinr-id-'. $skinr_id); 685 686 // Only need to add these scripts and css files once. 687 if (!$once) { 688 // Load the dialog javascript. 689 dialog_add_js(); 690 691 // Add drupal's form js files. 692 drupal_add_js('misc/collapse.js'); 693 drupal_add_js('misc/form.js'); 694 695 // Add ajax editor js files and css file. 696 drupal_add_css(drupal_get_path('module', 'skinr') .'/css/skinr.css'); 697 drupal_add_js(drupal_get_path('module', 'skinr') .'/js/skinr.js'); 698 699 drupal_add_js(array('skinr' => array('css_js_query_string' => substr(variable_get('css_js_query_string', '0'), 0, 1))), 'setting'); 700 701 $once = TRUE; 702 } 703 704 // Set js variables. 705 $js_settings = array('skinr' => array( 706 'areas' => array( 707 'id-'. $skinr_id => array( 708 'id' => $skinr_id, 709 'module' => $module, 710 'sids' => $sids, 711 ), 712 ), 713 )); 714 drupal_add_js($js_settings, 'setting'); 715 } 716 } 717 718 /** 719 * AJAX Callback function to fetch all css or js files from a particular skin. 720 * 721 * @param $skin 722 * The name of the skin. 723 * @param $value 724 * The classes for this skin. 725 * 726 * @return 727 * An array of file data in JSON format. 728 */ 729 function skinr_ui_skin_get_files($skin, $value = '') { 730 $skins = array($skin => $value); 731 732 return drupal_json(array( 733 'css' => skinr_skin_get_files($skins, 'css'), 734 'js' => skinr_skin_get_files($skins, 'js'), 735 )); 736 exit; 737 } 738 739 /** 740 * Helper function determine whether one of a set of hooks exists in a list of 741 * required features. 742 */ 743 function _skinr_is_featured($preprocess_hooks, $features) { 744 foreach ($preprocess_hooks as $preprocess_hook) { 745 if (in_array($preprocess_hook, $features)) { 746 return TRUE; 747 } 748 } 749 return FALSE; 750 } 751 752 /** 753 * Helper function to retrieve a unique id for each skinr class. Used by AJAX. 754 */ 755 function _skinr_ui_ajax_id() { 756 static $skinr_id = 0; 757 return ++$skinr_id; 758 } 759 760 /** 761 * Helper function to convert an array of options, as specified in the info 762 * file, into an array usable by form api. 763 */ 764 function skinr_ui_info_options_to_form_options($options) { 765 $form_options = array(); 766 foreach ($options as $option) { 767 $form_options[$option['class']] = t($option['label']); 768 } 769 return $form_options; 770 } 771 772 /** 773 * Helper function to convert an array of template filenames, as specified in 774 * the info file, into an array usable by form api. 775 */ 776 function skinr_ui_info_templates_to_form_options($templates) { 777 $form_options = array(); 778 foreach ($templates as $template) { 779 // If it exists, strip .tpl.php from template. 780 $template = str_replace('.tpl.php', '', $template); 781 $form_options[$template] = $template .'.tpl.php'; 782 } 783 return $form_options; 784 } 785 786 /** 787 * Helper function to filter templates by preprocess_hooks. 788 */ 789 function skinr_ui_info_templates_filter($templates, $preprocess_hooks) { 790 $filtered_templates = array(); 791 foreach ($templates as $template) { 792 // If it exists, strip .tpl.php from template. 793 $template = str_replace('.tpl.php', '', $template); 794 foreach ($preprocess_hooks as $preprocess_hook) { 795 if (drupal_substr(str_replace('_', '-', $template), (drupal_strlen($preprocess_hook) * -1)) == str_replace('_', '-', $preprocess_hook)) { 796 $filtered_templates[] = $template; 797 } 798 } 799 } 800 return $filtered_templates; 801 }
title
Description
Body
title
Description
Body
title
Description
Body
title
Body
| Generated: Thu Mar 24 11:18:33 2011 | Cross-referenced by PHPXref 0.7 |