[ Index ]

PHP Cross Reference of Drupal 6 (gatewave)

title

Body

[close]

/sites/all/modules/skinr/ -> skinr_ui.module (source)

   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('' => '&lt;none&gt;'), 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  }


Generated: Thu Mar 24 11:18:33 2011 Cross-referenced by PHPXref 0.7