Index: patterns.module
===================================================================
RCS file: /cvs/drupal-contrib/contributions/modules/patterns/patterns.module,v
retrieving revision 1.1.2.2.2.1
diff -u -r1.1.2.2.2.1 patterns.module
--- patterns.module 26 Nov 2008 06:34:12 -0000 1.1.2.2.2.1
+++ patterns.module 26 Nov 2008 14:14:08 -0000
@@ -100,6 +100,12 @@
'access arguments' => array('administer patterns'),
'type' => MENU_CALLBACK
);
+ $items['admin/build/patterns/modules/get_module'] = array(
+ 'title' => 'Get Module',
+ 'page callback' => '_patterns_get_module',
+ 'access arguments' => array('administer patterns'),
+ 'type' => MENU_CALLBACK
+ );
// $items[] = array('path' => 'admin/build/patterns/revert',
// 'access' => user_access('administer patterns'),
@@ -321,6 +327,7 @@
$actions[] = l(t('Run Update'), 'admin/build/patterns/enable/'. $pid);
}
$actions[] = l(t('Edit'), 'admin/build/patterns/edit/'. $pid);
+ $actions[] = l(t('Modules'), 'admin/build/patterns/modules/'. $pid, array('attributes' => array('title' => 'View modules required to run this pattern.')));
$actions = implode(' ', $actions);
$cells = array();
@@ -505,6 +512,10 @@
drupal_set_title($pattern->title .' '. t('(Pattern Modules)'));
$modules = patterns_modules($pattern);
+ if(!$modules) {
+ drupal_set_message("This pattern doesn't seem to have any modules");
+ drupal_goto("/admin/build/patterns");
+ }
$modules_info = module_rebuild_cache();
$modules_list = module_list();
@@ -516,10 +527,15 @@
$delete = is_array($module) ? $module['delete'] : false;
$module = is_array($module) ? $module['value'] : $module;
$available = array_key_exists($module, $modules_info);
+ if(!$available) {
+ $module_info = _patterns_get_module_links(array($module));
+ }
$enabled = array_key_exists($module, $modules_list);
- $row[] = $module;
- $row[] = $available ? t('Yes') : ''. t('No') .'';
- $row[] = $enabled ? t('Yes') : ''. t('No') .'';
+ $row[] = $available ? $module : $module . "
" . "Likely location: " . $module_info[$module]['link'];
+ $row[] = $available ? t('Yes') : ''. t('No') . " (" .
+ l("download", "admin/build/patterns/modules/get_module", array('query' => 'pid='. $pid ."&url=".$module_info[$module]['link']))
+ . ")" . '';
+ $row[] = $enabled ? t('Yes') : ''. t('No') . '';
$row[] = $delete ? t('Delete') : t('Enable');
$rows[] = $row;
@@ -535,7 +551,9 @@
drupal_set_message(t('All modules required by this module are available. Click !here to run this pattern.', array('!here' => l(t('here'), 'admin/build/patterns/enable/'. $pid))));
}
- return theme('table', array(t('Name'), t('Available'), t('Enabled'), t('Pattern Action')), $rows, t('Modules used for this pattern'));
+ //return theme('table', array(t('Name'), t('Available'), t('Enabled'), t('Pattern Action')), $rows, t('Modules used for this pattern'));
+ $output = theme('table', array(t('Name'), t('Available'), t('Enabled'), t('Pattern Action')), $rows, t('Modules used for this pattern'));
+ return $output;
}
function patterns_load_components() {
@@ -1417,3 +1435,75 @@
)
);
}
+
+function _patterns_get_module_links($modules) {
+ $links = Array();
+ foreach($modules as $module) {
+ $url = "http://www.drupal.org/project/" . $module;
+ $page = drupal_http_request($url);
+ //TODO: better checking of results here
+ if($page->data) {
+ //TODO: Select version depending on Drupal version dynamically
+ $did_match = preg_match("/http.*?".$module.".*?6.x.*?gz/", $page->data, $module_link);
+ }
+ if($did_match) {
+ $links[$module]['found'] = TRUE;
+ $links[$module]['link'] = $module_link[0];
+ }
+ else {
+ $links[$module]['found'] = FALSE;
+ }
+ }
+ return $links;
+}
+
+function _patterns_get_module() {
+ $url = check_plain($_GET['url']);
+ if(!empty($url) && is_string($url)) {
+ $result = _patterns_http_get_file($url);
+ }
+ if($result) {
+ drupal_set_message("Retrieved $url");
+ chdir($_SERVER['DOCUMENT_ROOT'] . "/sites/all/modules/");
+ exec("tar zxvf " . $result, $_null, $exec_result);
+ if($exec_result !== 0) {
+ drupal_set_message("Decompression failed", "error");
+ }
+ else {
+ drupal_set_message("Decompressed $result");
+ }
+ exec("rm " . $result, $_null, $exec_result);
+ if($exec_result !== 0) {
+ drupal_set_message("Cleanup failed", "error");
+ }
+ else {
+ drupal_set_message("Removed $result");
+ }
+ chdir($_SERVER['DOCUMENT_ROOT']);
+ }
+
+ $pid = check_plain($_GET['pid']);
+ if (!empty($pid) && is_numeric($pid)) {
+ drupal_goto('/admin/build/patterns/modules/'. $pid);
+ }
+ else {
+ drupal_goto('/admin/build/patterns/');
+ }
+}
+
+function _patterns_http_get_file($url) {
+ define('BUFSIZ', 4095);
+ $dir = $_SERVER['DOCUMENT_ROOT'] . "/sites/all/modules/";
+ $module_dir_is_writable = file_check_directory($dir);
+ if(!$module_dir_is_writable) {
+ drupal_set_message("Modules directory is not writable", "error");
+ return FALSE;
+ }
+ $rfile = fopen($url, 'r');
+ $lfile = fopen($dir . '/'. basename($url), 'w');
+ while(!feof($rfile))
+ fwrite($lfile, fread($rfile, BUFSIZ), BUFSIZ);
+ fclose($rfile);
+ fclose($lfile);
+ return $dir . '/' . basename($url);
+}