[ Index ]

PHP Cross Reference of Drupal 6 (gatewave)

title

Body

[close]

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

   1  <?php
   2  // $Id: skinr_ui.admin.inc,v 1.1.2.18 2010/10/08 00:41:55 jgirlygirl Exp $
   3  
   4  /**
   5   * @file
   6   * Admin page callbacks for the skinr module.
   7   */
   8  
   9  /**
  10   * Menu callback; displays the skinr listing page.
  11   */
  12  function skinr_ui_list($form_state) {
  13    if (isset($form_state['values']['operation']) && $form_state['values']['operation'] == 'delete') {
  14      return skinr_ui_settings_multiple_delete_confirm($form_state, array_filter($form_state['values']['skinr_settings']));
  15    }
  16    $form = skinr_ui_filter_form();
  17  
  18    $form['#theme'] = 'skinr_ui_filter_form';
  19    $form['admin']  = skinr_ui_admin_skins();
  20  
  21    return $form;
  22  }
  23  
  24  /**
  25   * Form builder: Builds the skinr administration overview.
  26   */
  27  function skinr_ui_admin_skins() {
  28    $session = !empty($_SESSION['skinr_ui_overview_filter']) && is_array($_SESSION['skinr_ui_overview_filter']) ? $_SESSION['skinr_ui_overview_filter'] : array();
  29    $filters = array();
  30    foreach ($session as $filter) {
  31      list($key, $value) = $filter;
  32      $filters[$key] = $value;
  33    }
  34  
  35    $sorts = array();
  36  
  37    $form['options'] = array(
  38      '#type' => 'fieldset',
  39      '#title' => t('Update options'),
  40      '#prefix' => '<div class="container-inline">',
  41      '#suffix' => '</div>',
  42    );
  43    $options = array();
  44    foreach (module_invoke_all('skinr_operations') as $operation => $array) {
  45      $options[$operation] = $array['label'];
  46    }
  47    $form['options']['operation'] = array(
  48      '#type' => 'select',
  49      '#options' => $options,
  50      '#default_value' => 'approve',
  51    );
  52    $form['options']['submit'] = array(
  53      '#type' => 'submit',
  54      '#value' => t('Update'),
  55      '#submit' => array('skinr_ui_admin_skins_submit'),
  56    );
  57  
  58    $themes = list_themes();
  59    ksort($themes);
  60  
  61    $skinr_settings = array();
  62    $options = array();
  63    $destination = drupal_get_destination();
  64    $type = !empty($filters['type']) ? $filters['type'] : NULL;
  65  
  66    foreach ($themes as $theme) {
  67      if (!$theme->status || (!empty($filters['theme']) && $filters['theme'] != $theme->name)) {
  68        continue;
  69      }
  70      if (empty($type)) {
  71        $skinrs = skinr_get($theme->name);
  72      }
  73      else {
  74        $skinrs = array($type => skinr_get($theme->name, $type));
  75      }
  76  
  77      foreach ($skinrs as $module => $elements) {
  78        foreach ($elements as $sid => $skin) {
  79          $key = $theme->name .'__'. $module .'__'. $sid;
  80          $skinr_settings[$key] = '';
  81  
  82          if ($module == 'page') {
  83            $url_edit   = 'admin/build/skinr/rules/edit/'. $sid;
  84          }
  85          else {
  86            $url_edit = 'admin/build/skinr/edit/nojs/'. $module .'/'. $sid;
  87          }
  88          $url_delete = 'admin/build/skinr/delete/'. $theme->name .'/'. $module .'/'. $sid;
  89          $operations = array(
  90            'edit' => array(
  91              'title' => t('edit'),
  92              'href' => $url_edit,
  93              'query' => $destination,
  94            ),
  95            'delete' => array(
  96              'title' => t('delete'),
  97              'href' => $url_delete,
  98              'query' => $destination,
  99            ),
 100          );
 101          $options[$key] = array(
 102            'theme' => $theme->info['name'],
 103            'type' => $module,
 104            'sid' => $sid,
 105            'operations' => theme('links', $operations, array('class' => 'links inline')),
 106          );
 107        }
 108      }
 109    }
 110  
 111    $form['rows'] = array('#type' => 'value', '#value' => $options);
 112    $form['skinr_settings'] = array('#type' => 'checkboxes', '#options' => $skinr_settings);
 113    $form['#theme'] = 'skinr_ui_admin_skins';
 114  
 115    return $form;
 116  }
 117  
 118  /**
 119   * Validate skinr_ui_admin_skins form submissions.
 120   *
 121   * Check if any skinr settings have been selected to perform the chosen
 122   * 'Update option' on.
 123   */
 124  function skinr_ui_admin_skins_validate($form, &$form_state) {
 125    $skinr_settings = array_filter($form_state['values']['skinr_settings']);
 126    if (count($skinr_settings) == 0) {
 127      form_set_error('', t('No items selected.'));
 128    }
 129  }
 130  
 131  /**
 132   * Process skinr_ui_admin_skins form submissions.
 133   * 
 134   * Execute the chosen 'Update option' on the selected nodes.
 135   */
 136  function skinr_ui_admin_skins_submit($form, &$form_state) {
 137    $operations = module_invoke_all('skinr_operations');
 138    $operation = $operations[$form_state['values']['operation']];
 139    // Filter out unchecked nodes
 140    $skinr_settings = array_filter($form_state['values']['skinr_settings']);
 141    if ($function = $operation['callback']) {
 142      // Add in callback arguments if present.
 143      if (isset($operation['callback arguments'])) {
 144        $args = array_merge(array($nodes), $operation['callback arguments']);
 145      }
 146      else {
 147        $args = array($skinr_settings);
 148      }
 149      call_user_func_array($function, $args);
 150  
 151      cache_clear_all();
 152    }
 153    else {
 154      // We need to rebuild the form to go to a second step.  For example, to
 155      // show the confirmation form for the deletion of nodes.
 156      $form_state['rebuild'] = TRUE;
 157    }
 158  }
 159  
 160  /**
 161   * Implementation of hook_skinr_operations().
 162   */
 163  function skinr_ui_skinr_operations() {
 164    $operations = array(
 165      'delete' => array(
 166        'label' => t('Delete'),
 167        'callback' => NULL,
 168      ),
 169    );
 170    return $operations;
 171  }
 172  
 173  /**
 174   * List skinr administration filters that can be applied.
 175   */
 176  function skinr_ui_filters() {
 177    // Theme filter.
 178    $themes = list_themes();
 179    ksort($themes);
 180  
 181    $options = array();
 182    foreach ($themes as $theme) {
 183      if (!$theme->status) {
 184        continue;
 185      }
 186      $options[$theme->name] = $theme->info['name'];
 187    }
 188  
 189    $filters['theme'] = array(
 190      'title' => t('theme'),
 191      'options' => $options,
 192    );
 193  
 194    // Type filter.
 195    $config = skinr_fetch_config();
 196  
 197    $options = array();
 198    foreach ($config as $type => $data) {
 199      $options[$type] = $type;
 200    }
 201  
 202    $filters['type'] = array(
 203      'title' => t('type'),
 204      'options' => $options,
 205    );
 206  
 207    return $filters;
 208  }
 209  
 210  /**
 211   * Return form for skinr administration filters.
 212   */
 213  function skinr_ui_filter_form() {
 214    $session = &$_SESSION['skinr_ui_overview_filter'];
 215    $session = is_array($session) ? $session : array();
 216    $filters = skinr_ui_filters();
 217  
 218    $i = 0;
 219    $form['filters'] = array(
 220      '#type' => 'fieldset',
 221      '#title' => t('Show only items where'),
 222      '#theme' => 'skinr_ui_filters',
 223    );
 224    $form['#submit'][] = 'skinr_ui_filter_form_submit';
 225    foreach ($session as $filter) {
 226      list($type, $value) = $filter;
 227      $value = $filters[$type]['options'][$value];
 228  
 229      if ($i++) {
 230        $form['filters']['current'][] = array('#value' => t('<em>and</em> where <strong>%a</strong> is <strong>%b</strong>', array('%a' => $filters[$type]['title'], '%b' => $value)));
 231      }
 232      else {
 233        $form['filters']['current'][] = array('#value' => t('<strong>%a</strong> is <strong>%b</strong>', array('%a' => $filters[$type]['title'], '%b' => $value)));
 234      }
 235      if (in_array($type, array('theme', 'type'))) {
 236        // Remove the option if it is already being filtered on.
 237        unset($filters[$type]);
 238      }
 239    }
 240  
 241    foreach ($filters as $key => $filter) {
 242      $names[$key] = $filter['title'];
 243      $form['filters']['status'][$key] = array('#type' => 'select', '#options' => $filter['options']);
 244    }
 245  
 246    $form['filters']['filter'] = array('#type' => 'radios', '#options' => $names, '#default_value' => 'status');
 247    if (count($filters)) {
 248      $form['filters']['buttons']['submit'] = array('#type' => 'submit', '#value' => (count($session) ? t('Refine') : t('Filter')));
 249    }
 250    if (count($session)) {
 251      $form['filters']['buttons']['undo'] = array('#type' => 'submit', '#value' => t('Undo'));
 252      $form['filters']['buttons']['reset'] = array('#type' => 'submit', '#value' => t('Reset'));
 253    }
 254  
 255    drupal_add_js('misc/form.js', 'core');
 256  
 257    return $form;
 258  }
 259  
 260  /**
 261   * Theme skinr administration filter form.
 262   *
 263   * @ingroup themeable
 264   */
 265  function theme_skinr_ui_filter_form($form) {
 266    $output = '';
 267    $output .= '<div id="skinr-ui-admin-filter">';
 268    $output .= drupal_render($form['filters']);
 269    $output .= '</div>';
 270    $output .= drupal_render($form);
 271    return $output;
 272  }
 273  
 274  /**
 275   * Theme skinr administration filter selector.
 276   *
 277   * @ingroup themeable
 278   */
 279  function theme_skinr_ui_filters($form) {
 280    $output = '';
 281    $output .= '<ul class="clear-block">';
 282    if (!empty($form['current'])) {
 283      foreach (element_children($form['current']) as $key) {
 284        $output .= '<li>'. drupal_render($form['current'][$key]) .'</li>';
 285      }
 286    }
 287  
 288    $output .= '<li><dl class="multiselect">';
 289    
 290    $element_children = element_children($form['filter']);
 291    if (!empty($element_children)) {
 292      $output .= (!empty($form['current']) ? '<dt><em>'. t('and') .'</em> '. t('where') .'</dt>' : '') .'<dd class="a">';
 293      foreach ($element_children as $key) {
 294        $output .= drupal_render($form['filter'][$key]);
 295      }
 296      $output .= '</dd>';
 297    
 298      $output .= '<dt>'. t('is') .'</dt>';
 299    }
 300    
 301    $output .= '<dd class="b">';
 302  
 303    foreach (element_children($form['status']) as $key) {
 304      $output .= drupal_render($form['status'][$key]);
 305    }
 306    $output .= '</dd>';
 307  
 308    $output .= '</dl>';
 309    $output .= '<div class="container-inline" id="node-admin-buttons">'. drupal_render($form['buttons']) .'</div>';
 310    $output .= '</li></ul>';
 311  
 312    return $output;
 313  }
 314  
 315  /**
 316   * Process result from node administration filter form.
 317   */
 318  function skinr_ui_filter_form_submit($form, &$form_state) {
 319    $filters = skinr_ui_filters();
 320    switch ($form_state['values']['op']) {
 321      case t('Filter'):
 322      case t('Refine'):
 323        if (isset($form_state['values']['filter'])) {
 324          $filter = $form_state['values']['filter'];
 325  
 326          // Flatten the options array to accommodate hierarchical/nested options.
 327          $flat_options = form_options_flatten($filters[$filter]['options']);
 328  
 329          if (isset($flat_options[$form_state['values'][$filter]])) {
 330            $_SESSION['skinr_ui_overview_filter'][] = array($filter, $form_state['values'][$filter]);
 331          }
 332        }
 333        break;
 334      case t('Undo'):
 335        array_pop($_SESSION['skinr_ui_overview_filter']);
 336        break;
 337      case t('Reset'):
 338        $_SESSION['skinr_ui_overview_filter'] = array();
 339        break;
 340    }
 341  }
 342  
 343  /**
 344   * Menu callback; displays the skinr settings administration form.
 345   */
 346  function skinr_ui_admin_form(&$form_state) {
 347    $form = array();
 348  
 349    $form['overlay'] = array(
 350      '#type' => 'fieldset',
 351      '#title' => t('Overlay'),
 352      '#collapsible' => TRUE,
 353    );
 354    $form['overlay']['skinr_overlay_width'] = array(
 355      '#type' => 'textfield',
 356      '#title' => t('Window width'),
 357      '#default_value' => variable_get('skinr_overlay_width', 600),
 358      '#description' => t('The width of the overlay window. Leave this field blank to allow the window to automatically resize itself to a minimal width.'),
 359    );
 360    $form['overlay']['skinr_overlay_height'] = array(
 361      '#type' => 'textfield',
 362      '#title' => t('Window height'),
 363      '#default_value' => variable_get('skinr_overlay_height', NULL),
 364      '#description' => t('The height of the overlay window. Leave this field blank to allow the window to automatically resize itself to the height of your browser.'),
 365    );
 366  
 367    return system_settings_form($form);
 368  }
 369  
 370  /**
 371   * Validation handler for skinr settings administration form.
 372   */
 373  function skinr_ui_admin_form_validate(&$form, &$form_state) {
 374    if (empty($form_state['values']['skinr_overlay_width'])) {
 375      $form_state['values']['skinr_overlay_width'] = NULL;
 376    }
 377    if (empty($form_state['values']['skinr_overlay_height'])) {
 378      $form_state['values']['skinr_overlay_height'] = NULL;
 379    }
 380  }
 381  
 382  /**
 383   * Helper function to sort skinsets by the name in their .info file.
 384   */
 385  function skinr_ui_sort_by_info_name($a, $b) {
 386    return strcasecmp($a->info['name'], $b->info['name']);
 387  }
 388  
 389  /**
 390   * Menu callback; displays a listing of all non-theme skinsets.
 391   *
 392   * @ingroup forms
 393   * @see skinr_ui_skinsets_form_submit()
 394   */
 395  function skinr_ui_skinsets_form() {
 396    $skinsets = skinr_rebuild_skinset_data();
 397  
 398    uasort($skinsets, 'skinr_ui_sort_by_info_name');
 399  
 400    // Store module list for use in the theme function.
 401    $form['skinsets'] = array('#type' => 'value', '#value' => $skinsets);
 402  
 403    $options = array();
 404    $status = array();
 405    $incompatible_core = array();
 406    $incompatible_php = array();
 407  
 408    foreach ($skinsets as $skinset) {
 409      $screenshot = NULL;
 410      $skinset_keys = array($skinset->name);
 411      // Look for a screenshot in the current skinset.
 412      if (isset($skinsets[$skinset->name]) && file_exists($skinsets[$skinset->name]->info['screenshot'])) {
 413        $screenshot = $skinsets[$skinset->name]->info['screenshot'];
 414      }
 415      $screenshot = $screenshot ? theme('image', $screenshot, t('Screenshot for %theme theme', array('%theme' => $skinset->info['name'])), '', array('class' => 'screenshot'), FALSE) : t('no screenshot');
 416  
 417      $form[$skinset->name]['screenshot'] = array('#value' => $screenshot);
 418      $form[$skinset->name]['info'] = array(
 419        '#type' => 'value',
 420        '#value' => $skinset->info,
 421      );
 422      $options[$skinset->name] = '';
 423  
 424      if (!empty($skinset->status)) {
 425        $status[] = $skinset->name;
 426      }
 427      else {
 428        // Ensure this theme is compatible with this version of core.
 429        if (!isset($skinset->info['core']) || $skinset->info['core'] != DRUPAL_CORE_COMPATIBILITY) {
 430          $incompatible_core[] = $skinset->name;
 431        }
 432        if (version_compare(phpversion(), $skinset->info['php']) < 0) {
 433          $incompatible_php[$skinset->name] = $skinset->info['php'];
 434        }
 435      }
 436  
 437      $form[$skinset->name]['operations'] = array(
 438        '#value' => l('configure', 'admin/build/skinr/skins/settings/'. $skinset->name),
 439      );
 440    }
 441  
 442    $form['status'] = array(
 443      '#type' => 'checkboxes',
 444      '#options' => $options,
 445      '#default_value' => $status,
 446      '#incompatible_skinsets_core' => drupal_map_assoc($incompatible_core),
 447      '#incompatible_skinsets_php' => $incompatible_php,
 448    );
 449    $form['buttons']['submit'] = array(
 450      '#type' => 'submit',
 451      '#value' => t('Save configuration'),
 452    );
 453    $form['buttons']['reset'] = array(
 454      '#type' => 'submit',
 455      '#value' => t('Reset to defaults'),
 456    );
 457    return $form;
 458  }
 459  
 460  /**
 461   * Menu callback; displays a listing of all skins in a skinsets, allowing you
 462   * to enable or disable them individually for each theme.
 463   *
 464   * @ingroup forms
 465   * @see skinr_ui_skinsets_settings_form_submit()
 466   */
 467  function skinr_ui_skinsets_settings_form($form_state, $skinset_name) {
 468    $form = array(
 469      '#tree' => TRUE,
 470    );
 471  
 472    $skinsets = skinr_skinsets('skinset');
 473    if (!empty($skinsets[$skinset_name])) {
 474      $skinset = $skinsets[$skinset_name];
 475    }
 476  
 477    $themes = list_themes();
 478    ksort($themes);
 479  
 480    foreach ($skinset->skins as $skin_name => $skin) {
 481      $form[$skin_name]['info'] = array(
 482        '#type' => 'value',
 483        '#value' => $skin,
 484      );
 485  
 486      $status = array();
 487      $options = array();
 488      foreach ($themes as $theme) {
 489        if (!$theme->status) {
 490          continue;
 491        }
 492  
 493        $options[$theme->name] = '';
 494  
 495        if (!empty($skin['status'][$theme->name])) {
 496          $status[] = $theme->name;
 497        }
 498      }
 499  
 500      $form[$skin_name]['status'] = array(
 501        '#type' => 'checkboxes',
 502        '#options' => $options,
 503        '#default_value' => $status,
 504      );
 505    }
 506  
 507    $form['skinset'] = array(
 508      '#type' => 'value',
 509      '#value' => $skinset_name,
 510    );
 511    $form['buttons']['submit'] = array(
 512      '#type' => 'submit',
 513      '#value' => t('Save configuration'),
 514    );
 515    $form['buttons']['reset'] = array(
 516      '#type' => 'submit',
 517      '#value' => t('Reset to defaults'),
 518    );
 519  
 520    return $form;
 521  }
 522  
 523  /**
 524   * Process skinr_ui_skinsets_form form submissions.
 525   */
 526  function skinr_ui_skinsets_form_submit($form, &$form_state) {
 527    // Store list of previously enabled themes and disable all themes
 528    $old_skinset_list = $new_skinset_list = array();
 529    foreach (skinr_skinsets('skinset') as $skinset) {
 530      if ($skinset->status) {
 531        $old_skinset_list[] = $skinset->name;
 532      }
 533    }
 534    db_query("UPDATE {skinr_skinsets} SET status = 0");
 535  
 536    if ($form_state['values']['op'] == t('Save configuration')) {
 537      if (is_array($form_state['values']['status'])) {
 538        foreach ($form_state['values']['status'] as $key => $choice) {
 539          if ($choice) {
 540            $new_theme_list[] = $key;
 541            db_query("UPDATE {skinr_skinsets} SET status = 1 WHERE name = '%s'", $key);
 542          }
 543        }
 544      }
 545    }
 546    else {
 547      // Revert to defaults: disable all skinsets.
 548    }
 549  
 550    // Refresh skinsets from DB.
 551    skinr_skinsets('skinset', TRUE);
 552  
 553    // @todo Disable any skins from skinsets that are now disabled.
 554  
 555    drupal_set_message(t('The configuration options have been saved.'));
 556    $form_state['redirect'] = 'admin/build/skinr/skins';
 557  
 558    return;
 559  }
 560  
 561  /**
 562   * Process skinr_ui_skinsets_settings_form form submissions.
 563   */
 564  function skinr_ui_skinsets_settings_form_submit($form, &$form_state) {
 565    if ($form_state['values']['op'] == t('Save configuration')) {
 566      foreach ($form_state['values'] as $skin_name => $skin) {
 567        if (is_array($form_state['values'][$skin_name]['status'])) {
 568          $skinr_skin = new StdClass();
 569          $skinr_skin->name = $form_state['values']['skinset'];
 570          $skinr_skin->type = 'skinset';
 571          $skinr_skin->skin = $skin_name;
 572          $skinr_skin->status = _skinr_array_strip_empty($form_state['values'][$skin_name]['status']);
 573  
 574          if (db_result(db_query("SELECT 1 FROM {skinr_skins} WHERE name = '%s' AND skin = '%s'", $skinr_skin->name, $skinr_skin->skin))) {
 575            // Record exists, so let's update.
 576            drupal_write_record('skinr_skins', $skinr_skin, array('name', 'skin'));
 577          }
 578          else {
 579            // Insert a new record.
 580            drupal_write_record('skinr_skins', $skinr_skin);
 581          }
 582        }
 583      }
 584    }
 585    else {
 586      // Revert to defaults: disable all skinsets.
 587    }
 588  
 589    drupal_set_message(t('The configuration options have been saved.'));
 590    $form_state['redirect'] = 'admin/build/skinr/skins';
 591  
 592    return;
 593  }
 594  
 595  /**
 596   * Skinr settings export form.
 597   */
 598  function skinr_ui_export_form(&$form_state, $theme = NULL) {
 599    $form = array();
 600    $themes = list_themes();
 601  
 602    if ($theme) {
 603      // Export an individual theme.
 604      $theme = str_replace('-', '_', $theme);
 605      $skinrs = skinr_get($theme);
 606  
 607      // Convert classes to arrays.
 608      foreach ($skinrs as $module => $data) {
 609        foreach ($data as $sid => $skinr) {
 610          $skinrs[$module][$sid] = (array) $skinrs[$module][$sid];
 611        }
 612      }
 613  
 614      $code = '$skinrs = '. var_export($skinrs, TRUE) .';';
 615      $lines = substr_count($code, "\n") + 1;
 616  
 617      $form['theme'] = array(
 618        '#type' => 'textfield',
 619        '#title' => t('Theme'),
 620        '#value' => $themes[$theme]->info['name'],
 621        '#disabled' => TRUE,
 622      );
 623  
 624      $form['skinr_settings'] = array(
 625        '#type' => 'textarea',
 626        '#title' => t('Skinr settings'),
 627        '#default_value' => $code,
 628        '#rows' => min($lines, 150),
 629      );
 630    }
 631    else {
 632      // Give the option for which theme to export.
 633  
 634      $options = array();
 635      ksort($themes);
 636      $current_theme = skinr_current_theme(TRUE);
 637  
 638      // Put default theme at the top.
 639      $options[$current_theme] = $themes[$current_theme]->info['name'].' ['. t('default') .']';
 640  
 641      foreach ($themes as $theme) {
 642        if ($theme->name == $current_theme) {
 643          // Do nothing.
 644        }
 645        elseif ($theme->status) {
 646          $options[$theme->name] = $theme->info['name'] .' ['. t('enabled') .']';
 647        }
 648        else {
 649          $options[$theme->name] = $theme->info['name'];
 650        }
 651      }
 652  
 653      $form['theme'] = array(
 654        '#type' => 'select',
 655        '#title' => t('Theme'),
 656        '#description' => t('Theme to export the skinr settings for.'),
 657        '#options' => $options,
 658        '#required' => TRUE,
 659      );
 660      $form['submit'] = array(
 661        '#type' => 'submit',
 662        '#value' => t('Export'),
 663      );
 664    }
 665  
 666    return $form;
 667  }
 668  
 669  /**
 670   * Validation handler for skinr settings export form.
 671   */
 672  function skinr_ui_export_form_validate(&$form, &$form_state) {
 673    if (!empty($form_state['values']['theme']) && preg_match('/[^a-zA-Z0-9_]/', $form_state['values']['theme'])) {
 674      form_error($form['theme'], t('The theme name must be alphanumeric and can contain underscores only.'));
 675    }
 676  }
 677  
 678  /**
 679   * Submit handler for skinr settings export form.
 680   */
 681  function skinr_ui_export_form_submit(&$form, &$form_state) {
 682    drupal_goto('admin/build/skinr/export/'. str_replace('_', '-', $form_state['values']['theme']));
 683  }
 684  
 685  /**
 686   * Skinr settings import form.
 687   */
 688  function skinr_ui_import_form(&$form_state) {
 689    $form = array();
 690  
 691    $options = array();
 692    $themes = list_themes();
 693    ksort($themes);
 694    $current_theme = skinr_current_theme(TRUE);
 695  
 696    // Put default theme at the top.
 697    $options[$current_theme] = $themes[$current_theme]->info['name'].' ['. t('default') .']';
 698  
 699    foreach ($themes as $theme) {
 700      if ($theme->name == $current_theme) {
 701        // Do nothing.
 702      }
 703      elseif ($theme->status) {
 704        $options[$theme->name] = $theme->info['name'] .' ['. t('enabled') .']';
 705      }
 706      else {
 707        $options[$theme->name] = $theme->info['name'];
 708      }
 709    }
 710  
 711    $form['theme'] = array(
 712      '#type' => 'select',
 713      '#title' => t('Theme'),
 714      '#options' => $options,
 715      '#required' => TRUE,
 716    );
 717    $form['skinr_settings'] = array(
 718      '#type' => 'textarea',
 719      '#title' => t('Skinr settings'),
 720      '#description' => t('Paste skinr settings here.'),
 721      '#rows' => 16,
 722    );
 723    $form['submit'] = array(
 724      '#type' => 'submit',
 725      '#value' => t('Import'),
 726    );
 727  
 728    return $form;
 729  }
 730  
 731  /**
 732   * Validation handler for Skinr settings import form.
 733   */
 734  function skinr_ui_import_form_validate(&$form, &$form_state) {
 735    if (empty($form_state['values']['skinr_settings'])) {
 736      // Error.
 737      form_error($form['skinr_settings'], t('These are not valid Skinr settings.'));
 738      return;
 739    }
 740  
 741    $skinrs = '';
 742    ob_start();
 743    eval($form_state['values']['skinr_settings']);
 744    ob_end_clean();
 745  
 746    foreach ($skinrs as $module => $ignored) {
 747      if (!is_array($skinrs[$module])) {
 748        // Error.
 749        form_error($form['skinr_settings'], t('These are not valid Skinr settings.'));
 750      }
 751      foreach ($skinrs[$module] as $sid => $ignored) {
 752        if (!is_array($skinrs[$module][$sid])) {
 753          // Error.
 754          form_error($form['skinr_settings'], t('These are not valid Skinr settings.'));
 755        }
 756  
 757        // Cast skinr array to object so we can actually use it.
 758        $skinrs[$module][$sid] = (object) $skinrs[$module][$sid];
 759        if (!skinr_validate($skinrs[$module][$sid])) {
 760          // Error.
 761          form_error($form['skinr_settings'], t('These are not valid Skinr settings.'));
 762        }
 763      }
 764    }
 765  
 766    if (!empty($form_state['values']['theme']) && preg_match('/[^a-zA-Z0-9_]/', $form_state['values']['theme'])) {
 767      form_error($form['theme'], t('The theme name must be alphanumeric and can contain underscores only.'));
 768    }
 769  
 770    $form_state['skinrs'] = &$skinrs;
 771  }
 772  
 773  /**
 774   * Submit handler for skinr settings import form.
 775   */
 776  function skinr_ui_import_form_submit(&$form, &$form_state) {
 777    foreach ($form_state['skinrs'] as $module => $skinrs) {
 778      foreach ($skinrs as $sid => $skinr) {
 779        if (!skinr_set($skinr)) {
 780          drupal_set_message(t('Skinr settings for the theme %theme could not be saved!', array('%theme' => $form_state['values']['theme'])), 'error');
 781        }
 782      }
 783    }
 784  
 785    drupal_set_message(t('Skinr settings for the theme %theme have been saved.', array('%theme' => $form_state['values']['theme'])));
 786    drupal_goto('admin/build/skinr');
 787  }
 788  
 789  /**
 790   * Menu callback; displays the delete confirmation for a skinr page rule.
 791   */
 792  function skinr_ui_delete_confirm(&$form_state, $theme, $module, $sid) {
 793    $form['theme'] = array(
 794      '#type' => 'value',
 795      '#value' => isset($form_state['theme']) ? $form_state['theme'] : $theme,
 796    );
 797    $form['module'] = array(
 798      '#type' => 'value',
 799      '#value' => isset($form_state['module']) ? $form_state['module'] : $module,
 800    );
 801    $form['sid'] = array(
 802      '#type' => 'value',
 803      '#value' => isset($form_state['sid']) ? $form_state['sid'] : $sid,
 804    );
 805  
 806    $themes = list_themes();
 807  
 808    return confirm_form($form,
 809      t('Are you sure you want to delete these Skinr settings?'),
 810      isset($_GET['destination']) ? $_GET['destination'] : 'admin/build/skinr',
 811      t('This action cannot be undone.<br /> Theme: !theme<br />Module: !module<br />Skinr ID: !sid', array('!theme' => $themes[$theme]->info['name'], '!module' => $module, '!sid' => $sid)),
 812      t('Delete'),
 813      t('Cancel')
 814    );
 815  }
 816  
 817  function skinr_ui_delete_confirm_submit($form, &$form_state) {
 818    if ($form_state['values']['confirm']) {
 819      $skinr = new stdClass();
 820      $skinr->theme = $form_state['values']['theme'];
 821      $skinr->module = $form_state['values']['module'];
 822      $skinr->sid = $form_state['values']['sid'];
 823      $skinr->skins = array();
 824      $skinr->settings = array();
 825  
 826      skinr_set($skinr);
 827    }
 828  
 829    $form_state['redirect'] = 'admin/build/skinr';
 830  }
 831  
 832  /**
 833   * Theme function for Skinr UI's list form.
 834   *
 835   * @param $form
 836   *   An associative array containing the structure of the form.
 837   * @ingroup themeable
 838   */
 839  function theme_skinr_ui_admin_skins($form) {
 840    $output = '';
 841    $has_skins = isset($form['rows']['#value']) && is_array($form['rows']['#value']);
 842    $select_header = $has_skins ? theme('table_select_header_cell') : '';
 843    $headers = array(
 844      $select_header,
 845      array('data' => t('Theme'), 'field' => 'theme'),
 846      array('data' => t('Type'), 'field' => 'type'),
 847      array('data' => t('Skinr ID'), 'field' => 'sid'),
 848      t('Operations'),
 849    );
 850  
 851    $output .= drupal_render($form['options']);
 852    if ($has_skins) {
 853      $ts = tablesort_init($headers);
 854      $sort = SORT_DESC;
 855      if ($ts['sort'] == 'asc') {
 856        $sort = SORT_ASC;
 857      }
 858  
 859      switch ($ts['sql']) {
 860        case 'type':
 861          $sortby = 2;
 862          break;
 863  
 864        case 'sid':
 865          $sortby = 3;
 866          break;
 867  
 868        case 'theme':
 869        default:
 870          $sortby = 1;
 871          break;
 872      }
 873  
 874      $rows = array();
 875      $sorts = array();
 876      foreach ($form['rows']['#value'] as $key => $value) {
 877        $row = array();
 878        $row[] = drupal_render($form['skinr_settings'][$key]);
 879        $row[] = $value['theme'];
 880        $row[] = $value['type'];
 881        $row[] = $value['sid'];
 882        $row[] = $value['operations'];
 883        $rows[$key] = $row;
 884        $sorts[] = strip_tags($rows[$key][$sortby]);
 885      }
 886  
 887      // Sort table.
 888      array_multisort($sorts, $sort, $rows);
 889    }
 890    else {
 891      $rows[] = array(array('data' => t('No skinr settings available.'), 'colspan' => '5'));
 892    }
 893  
 894    // Output table.
 895    $output .= theme('table', $headers, $rows);
 896  
 897    $output .= drupal_render($form);
 898  
 899    return $output;
 900  }
 901  
 902  /**
 903   * Theme function for Skinr UI's skinsets form.
 904   *
 905   * @param $form
 906   *   An associative array containing the structure of the form.
 907   * @ingroup themeable
 908   */
 909  function theme_skinr_ui_skinsets_form($form) {
 910    // Individual table headers.
 911    $header = array(t('Screenshot'), t('Name'), t('Version'), t('Enabled'), t('Operations'));
 912  
 913    // Pull package information from skinsets list and start grouping skinsets.
 914    $skinsets = $form['skinsets']['#value'];
 915    $packages = array();
 916    foreach ($skinsets as $skinset) {
 917      if (!isset($skinset->info['package']) || !$skinset->info['package']) {
 918        $skinset->info['package'] = t('Other');
 919      }
 920      $packages[$skinset->info['package']][$skinset->name] = $skinset->info;
 921    }
 922    ksort($packages);
 923  
 924    // Display packages.
 925    $output = '';
 926    foreach ($packages as $package => $skinsets) {
 927      $rows = array();
 928      foreach ($skinsets as $key => $skinset) {
 929        // Only look for skinsets.
 930        if (!isset($form[$key]['info'])) {
 931          continue;
 932        }
 933  
 934        // Fetch info.
 935        $info = $form[$key]['info']['#value'];
 936        // Localize skinset description.
 937        $description = t($info['description']);
 938  
 939        // Make sure it is compatible and render the checkbox if so.
 940        if (isset($form['status']['#incompatible_skinsets_core'][$key])) {
 941          unset($form['status'][$key]);
 942          $status = theme('image', 'misc/watchdog-error.png', t('incompatible'), t('Incompatible with this version of Drupal core'));
 943          $description .= '<div class="incompatible">'. t('This version is incompatible with the !core_version version of Drupal core.', array('!core_version' => VERSION)) .'</div>';
 944        }
 945        elseif (isset($form['status']['#incompatible_skinsets_php'][$key])) {
 946          unset($form['status'][$key]);
 947          $status = theme('image', 'misc/watchdog-error.png', t('incompatible'), t('Incompatible with this version of PHP'));
 948          $php_required = $form['status']['#incompatible_themes_php'][$key];
 949          if (substr_count($php_required, '.') < 2) {
 950            $php_required .= '.*';
 951          }
 952          $description .= '<div class="incompatible">'. t('This skinset requires PHP version @php_required and is incompatible with PHP version !php_version.', array('@php_required' => $php_required, '!php_version' => phpversion())) .'</div>';
 953        }
 954        else {
 955          $status = drupal_render($form['status'][$key]);
 956        }
 957  
 958        // Style theme info
 959        $content = '<div class="skinset-info"><h2>'. $info['name'] .'</h2><div class="description">'. $description .'</div></div>';
 960  
 961        // Build rows
 962        $row = array();
 963        $row[] = drupal_render($form[$key]['screenshot']);
 964        $row[] = $content;
 965        $row[] = isset($info['version']) ? $info['version'] : '';
 966        $row[] = array('data' => $status, 'align' => 'center');
 967        $row[] = array('data' => drupal_render($form[$key]['operations']), 'align' => 'center');
 968        $rows[] = $row;
 969      }
 970  
 971      $fieldset = array(
 972        '#title' => t($package),
 973        '#collapsible' => TRUE,
 974        '#collapsed' => FALSE,
 975        '#value' => theme('table', $header, $rows, array('class' => 'package')),
 976      );
 977      $output .= theme('fieldset', $fieldset);
 978    }
 979  
 980    $output .= drupal_render($form);
 981    return $output;
 982  }
 983  
 984  /**
 985   * Theme function for Skinr UI's skinsets form.
 986   *
 987   * @param $form
 988   *   An associative array containing the structure of the form.
 989   * @ingroup themeable
 990   */
 991  function theme_skinr_ui_skinsets_settings_form($form) {
 992    // Individual table headers.
 993    $header = array(t('Enabled'), t('Name'), t('Operations'));
 994  
 995    // Display skins.
 996    $output = '';
 997  
 998    // Get current theme, but make sure it's not the admin theme when we're editing with AJAX.
 999    $current_theme = skinr_current_theme(TRUE);
1000  
1001    $themes = list_themes();
1002    ksort($themes);
1003  
1004    foreach ($themes as $theme) {
1005      if (!$theme->status) {
1006        continue;
1007      }
1008  
1009      $rows = array();
1010      foreach ($form as $key => $skin) {
1011        // Only look for skins.
1012        if (!is_array($form[$key]) || !isset($form[$key]['info'])) {
1013          continue;
1014        }
1015  
1016        // Fetch info.
1017        $info = $form[$key]['info']['#value'];
1018        // Localize skinset title and description.
1019        $title = t($info['title']);
1020        $description = t($info['description']);
1021  
1022        // The hooks this skin is working with.
1023        $features = array();
1024        foreach ($info['features'] as $feature) {
1025          $features[] = $feature == '*' ? t('all hooks') : $feature;
1026        }
1027        $features = t('Used by: !features', array('!features' => implode(', ', $features)));
1028  
1029        $status = drupal_render($form[$key]['status'][$theme->name]);
1030  
1031        // Style theme info
1032        $content = '<div class="skin-info"><h2>'. $title .'</h2><div class="description">'. $description .'</div><div class="features">'. $features .'</div></div>';
1033  
1034        // Build rows
1035        $row = array();
1036        $row[] = array('data' => $status, 'align' => 'center');
1037        $row[] = $content;
1038        $row[] = array('data' => drupal_render($form[$key]['operations']), 'align' => 'center');
1039        $rows[] = $row;
1040      }
1041  
1042      $fieldset = array(
1043        '#title' => t($theme->info['name']),
1044        '#collapsible' => TRUE,
1045        '#collapsed' => $theme->name == $current_theme ? FALSE : TRUE,
1046        '#value' => theme('table', $header, $rows, array('class' => 'theme')),
1047      );
1048      $output .= theme('fieldset', $fieldset);
1049    }
1050  
1051    $output .= drupal_render($form);
1052    return $output;
1053  }
1054  
1055  function skinr_ui_settings_multiple_delete_confirm(&$form_state, $skinr_settings) {
1056    $themes = list_themes();
1057  
1058    $form['skinr_settings'] = array(
1059      '#prefix' => '<ul>',
1060      '#suffix' => '</ul>',
1061      '#tree' => TRUE,
1062    );
1063    // array_filter returns only elements with TRUE values
1064    foreach ($skinr_settings as $skinr_setting => $value) {
1065      $parts = explode('__', $skinr_setting, 3);
1066      $form['skinr_settings'][$skinr_setting] = array(
1067        '#type' => 'hidden',
1068        '#value' => $skinr_setting,
1069        '#prefix' => '<li>',
1070        '#suffix' => t('Skinr ID %sid of type %type for theme %theme', array('%sid' => $parts[2], '%type' => $parts[1], '%theme' => $themes[$parts[0]]->info['name'])) ."</li>\n",
1071      );
1072    }
1073    $form['operation'] = array('#type' => 'hidden', '#value' => 'delete');
1074    $form['#submit'][] = 'skinr_ui_settings_multiple_delete_confirm_submit';
1075    return confirm_form($form,
1076                        t('Are you sure you want to delete these items?'),
1077                        'admin/build/skinr', t('This action cannot be undone.'),
1078                        t('Delete all'), t('Cancel'));
1079  }
1080  
1081  function skinr_ui_settings_multiple_delete_confirm_submit($form, &$form_state) {
1082    if ($form_state['values']['confirm']) {
1083      foreach ($form_state['values']['skinr_settings'] as $skinr_setting => $value) {
1084        $parts = explode('__', $skinr_setting, 3);
1085  
1086        $skinr = new StdClass();
1087        $skinr->theme = $parts[0];
1088        $skinr->module = $parts[1];
1089        $skinr->sid = $parts[2];
1090        $skinr->skins = array();
1091  
1092        skinr_set($skinr);
1093      }
1094      drupal_set_message(t('The items have been deleted.'));
1095    }
1096    $form_state['redirect'] = 'admin/build/skinr';
1097    return;
1098  }


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