[ Index ]

PHP Cross Reference of Drupal 6 (gatewave)

title

Body

[close]

/sites/all/modules/project/release/includes/ -> project_edit_releases.inc (source)

   1  <?php
   2  // $Id: project_edit_releases.inc,v 1.3 2010/01/17 01:03:58 dww Exp $
   3  
   4  /**
   5   * @file
   6   * Code for the "releases" subtab to the edit tab on project nodes.
   7   */
   8  
   9  /**
  10   * Releases subtab for the project edit tab.
  11   */
  12  function project_release_project_edit_releases($node) {
  13    project_project_set_breadcrumb($node);
  14    drupal_set_title(check_plain($node->title));
  15    return drupal_get_form('project_release_project_edit_form', $node);
  16  }
  17  
  18  function project_release_project_edit_form($form_state, $node) {
  19    $active_tids = project_release_compatibility_list();
  20    if (count($active_tids) > 0) {
  21      // Get all the data about major versions for this project.
  22      $data = _project_release_get_version_major_data($node);
  23  
  24      // Build the form elements for supported and recommended major versions.
  25      $form = _project_release_edit_version_major_form($data);
  26  
  27      // Now, add a header and some help text for those elements.
  28      $form['header'] = array(
  29        '#type' => 'markup',
  30        '#value' => t('Supported versions'),
  31      );
  32  
  33      $vocab = taxonomy_vocabulary_load(_project_release_get_api_vid());
  34      $form['help'] = array(
  35        '#type' => 'markup',
  36        '#value' => t('For each term in the %api_vocabulary_name vocabulary, the following tables allow you to define which major versions are supported. You can also control if the development snapshot releases should be displayed on the front page of the project. Finally, for each term in the %api_vocabulary_name vocabulary, you can select which major version (if any) should be recommended for new users to download.', array('%api_vocabulary_name' => $vocab->name)),
  37      );
  38    }
  39  
  40    // Finally, add everything else (currently, the "Advanced options").
  41    $form['advanced'] = array(
  42      '#type' => 'fieldset',
  43      '#title' => t('Advanced options'),
  44      '#collapsible' => TRUE,
  45      '#collapsed' => $node->project_release['releases'],
  46      '#weight' => 5,
  47    );
  48  
  49    $form['advanced']['releases'] = array(
  50      '#type' => 'checkbox',
  51      '#title' => t('Enable releases'),
  52      '#return_value' => 1,
  53      '#weight' => -10,
  54      '#default_value' => isset($node->project_release['releases']) ? $node->project_release['releases'] : 1,
  55      '#description' => t('Allow releases of this project with specific versions.'),
  56    );
  57  
  58    if (user_access('administer projects')) {
  59      $form['advanced']['version_format'] = array(
  60        '#type' => 'textfield',
  61        '#title' => t('Version format string'),
  62        '#default_value' => $node->project_release['version_format'],
  63        '#size' => 50,
  64        '#maxlength' => 255,
  65        '#description' => t('Customize the format of the version strings for releases of this project.') .' '. PROJECT_RELEASE_VERSION_FORMAT_HELP .' '. t('If blank, this project will use the site-wide default (currently set to: %default)', array('%default' => variable_get('project_release_default_version_format', PROJECT_RELEASE_DEFAULT_VERSION_FORMAT))),
  66      );
  67    }
  68  
  69    $form['nid'] = array('#type' => 'value', '#value' => $node->nid);
  70    $form['submit'] = array(
  71      '#type' => 'submit',
  72      '#value' => t('Save'),
  73      '#weight' => 45,
  74    );
  75  
  76    return $form;
  77  }
  78  
  79  function _project_release_get_version_major_data($node) {
  80    $data = array();
  81    $data['node'] = $node;
  82    $params = array();
  83    $params[] = $node->nid;
  84    $active_tids = project_release_compatibility_list();
  85    $tid_where = '';
  86    if (!empty($active_tids)) {
  87      $tid_where = 'prsv.tid IN ('. db_placeholders($active_tids) .')';
  88      $params = array_merge($params, array_keys($active_tids));
  89    }
  90    $result = db_query("SELECT prsv.*, td.name AS term_name FROM {project_release_supported_versions} prsv INNER JOIN {term_data} td ON prsv.tid = td.tid WHERE prsv.nid = %d AND $tid_where ORDER BY td.weight, td.name", $params);
  91    while ($obj = db_fetch_object($result)) {
  92      $tid = $obj->tid;
  93      if (empty($data[$tid])) {
  94        $data[$tid] = array(
  95          'name' => $obj->term_name,
  96          'majors' => array(),
  97        );
  98      }
  99      $data[$tid]['majors'][$obj->major] = array(
 100        '#snapshot' => $obj->snapshot ? TRUE : FALSE,
 101        '#supported' => $obj->supported ? TRUE : FALSE,
 102        '#recommended' => $obj->recommended ? TRUE : FALSE,
 103      );
 104    }
 105    return $data;
 106  }
 107  
 108  function _project_release_edit_version_major_form($data) {
 109  // Since this form is used relatively infrequently, don't allow the js to be aggregated.
 110    drupal_add_js(drupal_get_path('module', 'project_release') .'/project_release.js', 'module', 'header', FALSE, TRUE, FALSE);
 111    $form = array();
 112  
 113    $node = $data['node'];
 114    unset($data['node']);
 115  
 116    $form['api'] = array(
 117      '#tree' => TRUE,
 118    );
 119    foreach ($data as $api_tid => $api_data) {
 120      $form['api'][$api_tid] = array(
 121        '#api_term_name' => $api_data['name'],
 122        'major' => array(),
 123      );
 124      $recommended_version = -1;
 125      $recommended_options = array(-1 => t('None'));
 126      foreach ($api_data['majors'] as $major_version => $major_data) {
 127        if ($major_data['#recommended'] == TRUE) {
 128          $recommended_version = $major_version;
 129        }
 130  
 131        $recommended_options[$major_version] = $major_version;
 132        $form['api'][$api_tid]['major'][$major_version] = array(
 133          'current' => array(
 134            '#type' => 'markup',
 135            '#value' => project_release_get_current_recommended($node->nid, $api_tid, $major_version)->version,
 136          ),
 137          'supported' => array(
 138            '#type' => 'checkbox',
 139            '#title' => t('Supported'),
 140            '#default_value' => $major_data['#supported'],
 141            '#attributes' => array('class' => 'supported'),
 142          ),
 143          'snapshot' => array(
 144            '#type' => 'checkbox',
 145            '#title' => t('Show snapshot release'),
 146            '#default_value' => $major_data['#snapshot'],
 147            '#attributes' => array('class' => 'snapshot'),
 148          ),
 149          'version_name' => array(
 150            // Normally, form elements of #type 'hidden' are evil, since the
 151            // values can be easily tampered with. However, in this case, we
 152            // totally don't care: the values are all completely ignored by the
 153            // submit handler. We need these values sent on to the browser so
 154            // they can be hidden/show by project_release.js, so we need to use
 155            // 'hidden' here or the values are never sent to the browser.
 156            // @TODO: We could replace these with drupal JS settings.
 157            '#type' => 'hidden',
 158            '#value' => $version_name,
 159            '#attributes' => array('class' => 'version-name'),
 160          ),
 161        );
 162      }
 163      $form['api'][$api_tid]['recommended'] = array(
 164        '#title' => t('Recommended major version'),
 165        '#type' => 'select',
 166        '#options' => $recommended_options,
 167        '#default_value' => $recommended_version,
 168        '#prefix' => '<div class="container-inline">',
 169        '#suffix' => '</div>',
 170        '#attributes' => array('class' => 'recommended'),
 171      );
 172    }
 173    return $form;
 174  }
 175  
 176  function theme_project_release_form_value($element) {
 177    return check_plain($element['#value']);
 178  }
 179  
 180  function theme_project_release_project_edit_form($form) {
 181    $output = '';
 182    if (!empty($form['api'])) {
 183      $output .= '<h3>'. drupal_render($form['header']) ."</h3>\n";
 184      $output .= '<p>'. drupal_render($form['help']) ."</p>\n";
 185  
 186      $header = array(
 187        t('Major version'),
 188        t('Current Release'),
 189        t('Supported'),
 190        array(
 191          'data' => t('Show snapshot release'),
 192          'colspan' => 2,
 193        ),
 194      );
 195      foreach (element_children($form['api']) as $tid) {
 196        $output .= '<h3>'. $form['api'][$tid]['#api_term_name'] .'</h3>';
 197        $rows = array();
 198        krsort($form['api'][$tid]['major']);
 199        foreach (element_children($form['api'][$tid]['major']) as $major) {
 200          $row = array();
 201          $row[] = $major;
 202          $row[] = drupal_render($form['api'][$tid]['major'][$major]['current']);
 203          // We want to unset the titles for each element, since we already have
 204          // table headers to label each column.
 205          unset($form['api'][$tid]['major'][$major]['supported']['#title']);
 206          $row[] = drupal_render($form['api'][$tid]['major'][$major]['supported']);
 207          unset($form['api'][$tid]['major'][$major]['snapshot']['#title']);
 208          $row[] = drupal_render($form['api'][$tid]['major'][$major]['snapshot']);
 209          $rows[] = $row;
 210        }
 211        // Finally, add a row for the currently recommended version.
 212        $row = array();
 213        $row[] = array(
 214          'data' => drupal_render($form['api'][$tid]['recommended']),
 215          'colspan' => 5,
 216        );
 217        $rows[] = $row;
 218        $output .= theme('table', $header, $rows);
 219      }
 220      unset($form['api']);
 221    }
 222  
 223    $output .= drupal_render($form['advanced']);
 224    $output .= drupal_render($form);
 225    return $output;
 226  }
 227  
 228  /**
 229   * Validates the project form regarding release-specific fields.
 230   * Ensures that the version format string doesn't contain bad characters.
 231   * @ingroup project_release_fapi
 232   * @see project_release_project_edit_releases
 233   */
 234  function project_release_project_edit_form_validate($form, &$form_state) {
 235    if (!empty($form_state['values']['version_format'])) {
 236      _project_release_validate_format_string($form_state['values'], 'version_format');
 237    }
 238    if (isset($form_state['values']['api'])) {
 239      foreach ($form_state['values']['api'] as $tid => $api_info) {
 240        $supported = FALSE;
 241        // First, we just iterate through to see if *any* majors are supported.
 242        foreach ($api_info['major'] as $major => $flags) {
 243          // At least 1 major is supported, so validate the settings.
 244          if ($flags['supported'] == FALSE && $flags['snapshot'] == TRUE) {
 245            $element = 'api]['. $tid .'][major]['. $major .'][snapshot';
 246            form_set_error($element, t('You can not show a snapshot release for a major version that is not supported for %api_term_name.', array('%api_term_name' => $form_state['values']['api'][$tid]['#api_term_name'])));
 247          }
 248          if ($flags['supported'] == FALSE && $api_info['recommended'] == $major) {
 249            form_set_error("api][$tid][recommended", t('You can not recommend a major version that is not supported for %api_term_name.', array('%api_term_name' => $form_state['values']['api'][$tid]['#api_term_name'])));
 250          }
 251        }
 252      }
 253    }
 254  }
 255  
 256  /**
 257   * Submit handler when project admins use the releases subtab.
 258   * @ingroup project_release_fapi
 259   * @see project_release_project_edit_releases
 260   */
 261  function project_release_project_edit_form_submit($form, &$form_state) {
 262    $nid = $form_state['values']['nid'];
 263    db_query("UPDATE {project_release_projects} SET releases = %d, version_format = '%s' WHERE nid = %d", $form_state['values']['releases'], $form_state['values']['version_format'], $nid);
 264  
 265    if (!empty($form_state['values']['api'])) {
 266      foreach ($form_state['values']['api'] as $tid => $values) {
 267        if (!empty($values['major'])) {
 268          foreach ($values['major'] as $major => $major_values) {
 269            $major_values['recommended'] = ($values['recommended'] == $major) ? 1 : 0;
 270            if ($obj = db_fetch_object(db_query("SELECT * FROM {project_release_supported_versions} WHERE nid = %d AND tid = %d AND major = %d", $nid, $tid, $major))) {
 271              if ($obj->supported != $major_values['supported']
 272                  || $obj->recommended != $major_values['recommended']
 273                  || $obj->snapshot != $major_values['snapshot']) {
 274                db_query("UPDATE {project_release_supported_versions} SET supported = %d, recommended = %d, snapshot = %d WHERE nid = %d AND tid = %d AND major = %d", $major_values['supported'], $major_values['recommended'], $major_values['snapshot'], $nid, $tid, $major);
 275              }
 276            }
 277            else {
 278              db_query("INSERT INTO {project_release_supported_versions} (nid, tid, major, supported, recommended, snapshot) VALUES (%d, %d, %d, %d, %d, %d)", $nid, $tid, $major, $major_values['supported'], $major_values['recommended'], $major_values['snapshot']);
 279            }
 280          }
 281        }
 282      }
 283    }
 284    db_query("UPDATE {node} SET changed = %d WHERE nid = %d", time(), $form_state['values']['nid']);
 285  
 286    $cid = 'table:'. $form_state['values']['nid'] .':';
 287    cache_clear_all($cid, 'cache_project_release', TRUE);
 288  
 289    drupal_set_message(t('Release settings have been saved.'));
 290  }
 291  


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