| [ Index ] |
PHP Cross Reference of Drupal 6 (gatewave) |
[Summary view] [Print] [Text view]
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
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 |