/[drupal]/contributions/modules/admin_enhance/admin_enhance.module
ViewVC logotype

Contents of /contributions/modules/admin_enhance/admin_enhance.module

Parent Directory Parent Directory | Revision Log Revision Log | View Revision Graph Revision Graph


Revision 1.2 - (show annotations) (download) (as text)
Wed Oct 15 02:09:42 2008 UTC (13 months, 1 week ago) by jdubbwya
Branch: MAIN
CVS Tags: DRUPAL-5--0-1, HEAD
Changes since 1.1: +93 -36 lines
File MIME type: text/x-php
Adding placeholders for packages to allow the module cache to be rebuilt on each pageload
1 <?php
2 /*
3 * Copyright 2008 Jacob Henke ( jacob.henke@gmail.com http://www.jacobhenke.net )
4 */
5 define( 'ADMIN_ENHANCED_RESTRICTED_PACKAGE', "Core - required" );
6 define( 'ADMIN_ENHANCED_OTHER_PACKAGE', "%other%" );
7 define( 'ADMIN_ENHANCED_PACKAGE_KEY_PREFIX', "package" );
8
9 /**
10 * @see hook_menu()
11 */
12 function admin_enhance_menu( $may_cache ){
13 $items = array();
14 if( $may_cache ){
15 $access = user_access('administer site configuration');
16 $packages = array();
17 $modules = module_rebuild_cache();
18
19 uasort($modules, 'system_sort_modules_by_info_name');
20 foreach ($modules as $module) {
21 if (!isset($module->info['package']) || !$module->info['package']) {
22 $module->info['package'] = ADMIN_ENHANCED_OTHER_PACKAGE;
23 }
24 $packages[$module->info['package']][$module->name] = $module->info;
25 }
26 ksort($packages);
27
28 reset($packages);
29 $keys = array_keys($packages);
30 reset($keys);
31 $index = 0;
32 while( list(,$package) = each($keys) ){
33 if( $package == ADMIN_ENHANCED_RESTRICTED_PACKAGE ) {
34 unset( $packages[$package] );
35 continue;
36 }
37 $key = admin_enhance_get_package_key($package);
38 if($package == ADMIN_ENHANCED_OTHER_PACKAGE) $package = t('Other');
39 $item = array(
40 'title' => t($package),
41 'type' => MENU_LOCAL_TASK,
42 'path' => 'admin/build/modules/package/'.$key,
43 'access' => $access,
44 'callback' => 'drupal_get_form',
45 'callback arguments' => array( 'admin_enhance_system_modules', $key)
46 );
47 $item_confirm = array(
48 'title' => t($package),
49 'type' => MENU_CALLBACK,
50 'path' => "admin/build/modules/package/{$key}/confirm",
51 'access' => $access,
52 'callback' => 'drupal_get_form',
53 'callback arguments' => array( 'admin_enhance_system_modules', $key)
54 );
55 if( $index == 0 ){
56 $items[] = array(
57 'title' => t("List By Package"),
58 'type' => MENU_LOCAL_TASK,
59 'path' => 'admin/build/modules/package',
60 'callback' => $item['callback'],
61 'callback arguments' => $item['callback arguments'],
62 'access' => $access
63 );
64 $item['type'] = MENU_DEFAULT_LOCAL_TASK;
65 }
66
67 $items[] = $item;
68 $items[] = $item_confirm;
69 $index++;
70 }
71 variable_set( 'admin_enhance_packages', $packages );
72 }
73 else {
74 if( strpos( $_GET['q'], 'admin/build/modules' ) !== false && $key = arg(4) && strpos($key, ADMIN_ENHANCED_PACKAGE_KEY_PREFIX) !== false){
75 $packages = admin_enhance_get_package_list();
76 if( $index >= sizeof($packages) ){
77 $items[] = array(
78 'title' => t($package),
79 'type' => MENU_LOCAL_TASK,
80 'path' => 'admin/build/modules/package/'.$key,
81 'access' => $access,
82 'callback' => 'drupal_goto',
83 'callback arguments' => array( 'admin/build/modules/package')
84 );
85 $items[] = array(
86 'title' => t($package),
87 'type' => MENU_CALLBACK,
88 'path' => "admin/build/modules/package/{$key}/confirm",
89 'access' => $access,
90 'callback' => 'drupal_get_form',
91 'callback arguments' => array( 'admin_enhance_system_modules', $key)
92 );
93 }
94 }
95 }
96 return $items;
97 }
98
99 function admin_enhance_get_package_key( $package ){
100 $package_cache = variable_get( 'admin_enhance_package_cache', array() );
101 if( !in_array($package, $package_cache) ){
102 $package_cache[] = $package;
103 variable_set( 'admin_enhance_package_cache', $package_cache );
104 }
105 $index = array_search($package,$package_cache);
106 return ADMIN_ENHANCED_PACKAGE_KEY_PREFIX.$index;
107 }
108
109 function admin_enhance_get_package_from_key( $key ){
110 $package_cache = variable_get( 'admin_enhance_package_cache', array() );
111 $package_index = intval( str_replace( ADMIN_ENHANCED_PACKAGE_KEY_PREFIX,'', $key ) );
112 if( array_key_exists( $package_index, $package_cache ) ){
113 return $package_cache[$package_index];
114 }
115 return false;
116 }
117
118
119 function admin_enhance_get_package_list( $key = null ){
120 $return_value = variable_get( 'admin_enhance_packages', array() );
121 if( !is_null($key) ){
122 if( strpos($key, ADMIN_ENHANCED_PACKAGE_KEY_PREFIX) !== false ){
123 $key = admin_enhance_get_package_from_key($key);
124 }
125 if( array_key_exists( $key, $return_value) ){
126 $return_value = array(
127 'name' => $key,
128 'modules' => $return_value[$key]
129 );
130 }
131 else {
132 $return_value = false;
133 }
134 }
135
136 return $return_value;
137 }
138
139 function admin_enhance_system_modules( $path_key, $form_values = null ){
140 $package_key = admin_enhance_get_package_from_key($path_key );
141 $package = admin_enhance_get_package_list( $package_key );
142 $name = ($package['name'] == ADMIN_ENHANCED_OTHER_PACKAGE) ? t('Other'):$package['name'];
143 drupal_set_title( "{$name} : Modules" );
144 $form = array();
145 $form['package_key'] = array( '#type' => 'value', '#value' => $path_key );
146 // Get current list of modules.
147 $files = module_rebuild_cache();
148
149 uasort($files, 'system_sort_modules_by_info_name');
150
151 if ($confirm_form = admin_enhance_system_modules_confirm_form($files, $form_values)) {
152 return $confirm_form;
153 }
154
155 // Store module list for validation callback.
156 $form['validation_modules'] = array('#type' => 'value', '#value' => $files);
157
158 // Create storage for disabled modules as browser will disable checkboxes.
159 $form['disabled_modules'] = array('#type' => 'value', '#value' => array());
160
161 // Array for disabling checkboxes in callback system_module_disable.
162 $hidden_values = array();
163 $status = array();
164 $disabled = array();
165 $throttle = array();
166 $package_modules = array();
167 // Traverse the files retrieved and build the form.
168 foreach ($files as $filename => $file) {
169 $options[$filename] = '';
170 if ($file->status) {
171 $status[] = $file->name;
172 }
173 if ($file->throttle) {
174 $throttle[] = $file->name;
175 }
176
177 if( (isset($file->info['package']) && $package['name'] != $file->info['package']) || (!isset($file->info['package']) && $package['name'] != ADMIN_ENHANCED_OTHER_PACKAGE) ) {
178 $hidden_values[] = $filename;
179 continue;
180 }
181
182 $package_modules[] = $file;
183 $form['name'][$filename] = array('#value' => $file->info['name']);
184 $form['version'][$filename] = array('#value' => $file->info['version']);
185 $form['description'][$filename] = array('#value' => t($file->info['description']));
186
187 $dependencies = array();
188 // Check for missing dependencies.
189 if (is_array($file->info['dependencies'])) {
190 foreach ($file->info['dependencies'] as $dependency) {
191 if (!isset($files[$dependency]) || !$files[$dependency]->status) {
192 if (isset($files[$dependency])) {
193 $dependencies[] = $files[$dependency]->info['name'] . t(' (<span class="admin-disabled">disabled</span>)');
194 }
195 else {
196 $dependencies[] = drupal_ucfirst($dependency) . t(' (<span class="admin-missing">missing</span>)');
197 $disabled[] = $filename;
198 $form['disabled_modules']['#value'][$filename] = FALSE;
199 }
200 }
201 else {
202 $dependencies[] = $files[$dependency]->info['name'] . t(' (<span class="admin-enabled">enabled</span>)');
203 }
204 }
205
206 // Add text for dependencies.
207 if (!empty($dependencies)) {
208 $form['description'][$filename]['dependencies'] = array(
209 '#value' => t('Depends on: !dependencies', array('!dependencies' => implode(', ', $dependencies))),
210 '#prefix' => '<div class="admin-dependencies">',
211 '#suffix' => '</div>',
212 );
213 }
214 }
215
216 // Mark dependents disabled so user can not remove modules being depended on.
217 $dependents = array();
218 if (is_array($file->info['dependents'])) {
219 foreach ($file->info['dependents'] as $dependent) {
220 if ($files[$dependent]->status == 1) {
221 $dependents[] = $files[$dependent]->info['name'] . t(' (<span class="admin-enabled">enabled</span>)');
222 $disabled[] = $filename;
223 $form['disabled_modules']['#value'][$filename] = TRUE;
224 }
225 else {
226 $dependents[] = $files[$dependent]->info['name'] . t(' (<span class="admin-disabled">disabled</span>)');
227 }
228 }
229 }
230
231 // Add text for enabled dependents.
232 if (!empty($dependents)) {
233 $form['description'][$filename]['required'] = array(
234 '#value' => t('Required by: !required', array('!required' => implode(', ', $dependents))),
235 '#prefix' => '<div class="admin-required">',
236 '#suffix' => '</div>',
237 );
238 }
239 }
240
241 //Package Modules
242 $form['package_modules'] = array('#type' => 'value', '#value' => $package_modules);
243
244 // Merge in required modules.
245 $modules_required = array('block', 'filter', 'node', 'system', 'user', 'watchdog');
246 foreach ($modules_required as $required) {
247 $disabled[] = $required;
248 $form['disabled_modules']['#value'][$required] = TRUE;
249 }
250
251 // Handle status checkboxes, including overriding
252 // the generated checkboxes for required modules.
253 $form['status'] = array(
254 '#type' => 'checkboxes',
255 '#default_value' => $status,
256 '#options' => $options,
257 '#process' => array(
258 'expand_checkboxes' => array(),
259 'system_modules_disable' => array($disabled),
260 'admin_enhance_hide_checkboxes' => array( $hidden_values, $status ),
261 ),
262 );
263
264 // Handle throttle checkboxes, including overriding the
265 // generated checkboxes for required modules.
266 if (module_exists('throttle')) {
267 $form['throttle'] = array(
268 '#type' => 'checkboxes',
269 '#default_value' => $throttle,
270 '#options' => $options,
271 '#process' => array(
272 'expand_checkboxes' => array(),
273 'system_modules_disable' => array(array_merge($modules_required, array('throttle'))),
274 'admin_enhance_hide_checkboxes' => array( $hidden_values, $throttle ),
275 ),
276 );
277 }
278
279 $form['buttons']['submit'] = array(
280 '#type' => 'submit',
281 '#value' => t('Save configuration'),
282 );
283 $form['#multistep'] = TRUE;
284 $form['#action'] = url("admin/build/modules/package/{$path_key}/confirm");
285
286 return $form;
287 }
288
289 function admin_enhance_hide_checkboxes($form, $edit, $hidden_keys, $values) {
290 foreach ($hidden_keys as $key) {
291 $form[$key] = array( '#type' => 'hidden', '#value' => in_array( $key, $values ) );
292 }
293 return $form;
294 }
295
296 function admin_enhance_system_modules_confirm_form($modules, $form_values = null) {
297 $form = array();
298 $items = array();
299
300 // Check values for submitted dependency errors.
301 if ($dependencies = system_module_build_dependencies($modules, $form_values)) {
302 // preserve the already switched on modules
303 foreach ($modules as $name => $module) {
304 if ($module->status) {
305 $form['status'][$name] = array('#type' => 'hidden', '#value' => 1);
306 }
307 }
308
309 $form['validation_modules'] = array('#type' => 'value', '#value' => $modules);
310 $form['status']['#tree'] = TRUE;
311 foreach ($dependencies as $name => $missing_dependencies) {
312 $form['status'][$name] = array('#type' => 'hidden', '#value' => 1);
313 foreach ($missing_dependencies as $k => $dependency) {
314 $form['status'][$dependency] = array('#type' => 'hidden', '#value' => 1);
315 $info = $modules[$dependency]->info;
316 $missing_dependencies[$k] = $info['name'] ? $info['name'] : drupal_ucfirst($dependency);
317 }
318 $t_argument = array(
319 '%module' => $modules[$name]->info['name'],
320 '%dependencies' => implode(', ', $missing_dependencies),
321 );
322 $items[] = strtr(format_plural(count($missing_dependencies), 'You must enable the %dependencies module to install %module.', 'You must enable the %dependencies modules to install %module.'), $t_argument);
323 }
324 $form['text'] = array('#value' => theme('item_list', $items));
325 }
326
327 if ($form) {
328 // Set some default form values
329 $form = confirm_form(
330 $form,
331 t('Some required modules must be enabled'),
332 'admin/build/modules',
333 t('Would you like to continue with enabling the above?'),
334 t('Continue'),
335 t('Cancel'));
336 return $form;
337 }
338 }
339
340 function theme_admin_enhance_system_modules( $form ){
341 if (isset($form['confirm'])) {
342 return drupal_render($form);
343 }
344
345 // Individual table headers.
346 $header = array(t('Enabled'));
347 if (module_exists('throttle')) {
348 $header[] = t('Throttle');
349 }
350 $header[] = t('Name');
351 $header[] = t('Version');
352 $header[] = t('Description');
353
354 $packages = array();
355 // Pull package information from module list and start grouping modules.
356 $modules = $form['package_modules']['#value'];
357 foreach ($modules as $module) {
358 if (!isset($module->info['package']) || !$module->info['package']) {
359 $module->info['package'] = t('Other');
360 }
361 $packages[$module->info['package']][$module->name] = $module->info;
362 }
363 ksort($packages);
364
365 // Display packages.
366 $output = '';
367 foreach ($packages as $package => $modules) {
368 $rows = array();
369 foreach ($modules as $key => $module) {
370 $row = array();
371 $row[] = array('data' => drupal_render($form['status'][$key]), 'align' => 'center');
372
373 if (module_exists('throttle')) {
374 $row[] = array('data' => drupal_render($form['throttle'][$key]), 'align' => 'center');
375 }
376 $row[] = '<strong>'. drupal_render($form['name'][$key]) .'</strong>';
377 $row[] = drupal_render($form['version'][$key]);
378 $row[] = array('data' => drupal_render($form['description'][$key]), 'class' => 'description');
379 $rows[] = $row;
380 }
381 $output .= theme('table', $header, $rows, array('class' => 'package'));
382 }
383
384 $output .= drupal_render($form);
385 return $output;
386
387 }
388
389 function admin_enhance_system_modules_submit($form_id, $form_values) {
390 include_once './includes/install.inc';
391 $new_modules = array();
392
393 // Merge in disabled active modules since they should be enabled.
394 // They don't appear because disabled checkboxes are not submitted
395 // by browsers.
396 $form_values['status'] = array_merge($form_values['status'], $form_values['disabled_modules']);
397
398 // Check values for dependency that we can't install.
399 if ($dependencies = system_module_build_dependencies($form_values['validation_modules'], $form_values)) {
400 // These are the modules that depend on existing modules.
401 foreach (array_keys($dependencies) as $name) {
402 $form_values['status'][$name] = 0;
403 }
404 }
405
406 $enable_modules = array();
407 $disable_modules = array();
408 foreach ($form_values['status'] as $key => $choice) {
409 if ($choice) {
410 if (drupal_get_installed_schema_version($key) == SCHEMA_UNINSTALLED) {
411 $new_modules[] = $key;
412 }
413 else {
414 $enable_modules[] = $key;
415 }
416 }
417 else {
418 $disable_modules[] = $key;
419 }
420 }
421
422 $old_module_list = module_list();
423
424 if (!empty($enable_modules)) {
425 module_enable($enable_modules);
426 }
427 if (!empty($disable_modules)) {
428 module_disable($disable_modules);
429 }
430
431 $install_modules = array( 'modules' => array(), 'weights' => array() );
432 foreach ($new_modules as $key => $modulename) {
433 $weight = 0; $dependency_weight = 0;
434 if( array_key_exists( $modulename, $install_modules['modules'] )){
435 $weight = $install_modules['modules'][$modulename];
436 }
437
438 $module = $validaton_modules[$modulename];
439 if( is_array( $module->info['dependencies'] ) ){
440 $dependencies = $module->info['dependencies'];
441 reset($dependencies);
442 while( list(,$dependency) = each($dependencies) ){
443 if(in_array($dependency,$new_modules)){
444 $dependency_weight = $weight-1;
445 if( array_key_exists( $dependency, $install_modules['modules'] )){
446 $dependency_weight = $install_modules['modules'][$dependency];
447 if($dependency_weight > $weight){
448 if( in_array($dependency, $install_modules['weights'][$dependency_weight]) ){
449 $key = array_search($dependency, $install_modules['weights'][$dependency_weight]);
450 unset($install_modules['weights'][$dependency_weight][$key]);
451 }
452 $dependency_weight = $weight-1;
453 }
454 }
455 $install_modules['modules'][$dependency] = $dependency_weight;
456 $install_modules['weights'][$dependency_weight][] = $dependency;
457 }
458 }
459 }
460 if( array_key_exists( $modulename, $install_modules['modules'] )){
461 $existing_weight = $install_modules['modules'][$modulename];
462 if( in_array($modulename, $install_modules['weights'][$existing_weight]) ){
463 $key = array_search($modulename, $install_modules['weights'][$existing_weight]);
464 unset($install_modules['weights'][$existing_weight][$key]);
465 }
466 }
467 $install_modules['modules'][$modulename] = $weight;
468 $install_modules['weights'][$weight][] = $modulename;
469 }
470
471
472 ksort($install_modules['weights']);
473 reset($install_modules['weights']);
474 while( list(,$modules) = each($install_modules['weights']) ){
475 $new_modules = array();
476 // Install new modules.
477 foreach ($modules as $key => $modulename) {
478 if (drupal_check_module($modulename)) {
479 $new_modules[] = $modulename;
480 }
481 }
482 drupal_install_modules($new_modules);
483 }
484
485 $current_module_list = module_list(TRUE, FALSE);
486 if (is_array($form_values['throttle'])) {
487 foreach ($form_values['throttle'] as $key => $choice) {
488 db_query("UPDATE {system} SET throttle = %d WHERE type = 'module' and name = '%s'", $choice ? 1 : 0, $key);
489 }
490 }
491
492 if ($old_module_list != $current_module_list) {
493 menu_rebuild();
494 node_types_rebuild();
495 drupal_set_message(t('The configuration options have been saved.'));
496 }
497
498 // If there where unmet dependencies and they haven't confirmed don't redirect.
499 if ($dependencies && !isset($form_values['confirm'])) {
500 return FALSE;
501 }
502
503 drupal_clear_css_cache();
504
505 return "admin/build/modules/package/{$form_values['package_key']}";
506 }

  ViewVC Help
Powered by ViewVC 1.1.2