Index: patterns.module
===================================================================
RCS file: /cvs/drupal-contrib/contributions/modules/patterns/patterns.module,v
retrieving revision 1.1.2.2.2.89
diff -u -r1.1.2.2.2.89 patterns.module
--- patterns.module	21 Apr 2010 15:12:08 -0000	1.1.2.2.2.89
+++ patterns.module	4 May 2010 02:52:43 -0000
@@ -167,6 +167,28 @@
     'weight' => -5
   );
 
+
+ $items['admin/build/patterns/generate'] = array(
+    'title' => 'Generate',
+    'page callback' => 'patterns_generate_splash',
+    'access arguments' => array('administer patterns'),
+    'type' => MENU_LOCAL_TASK,
+    'file' => 'patterns.generate.inc',
+  );
+ 
+  foreach (array('Roles and Perms' ,'Variables', 'Blocks', 'All') as $type ) {
+    $key = strtolower(str_replace(' ', '',$type)); 
+     $items['admin/build/patterns/generate/'. $key] = array(
+      'title' => "$type",
+      'page callback' => 'drupal_get_form',
+      'page arguments' => array('patterns_generate', $key),
+      'access arguments' => array('administer patterns'),
+      'type' => MENU_LOCAL_TASK,
+      'weight' => -3,
+      'file' => 'patterns.generate.inc',
+    ); 
+  }
+
   return $items;
 }
 
@@ -2106,13 +2128,17 @@
 }
 
 function patterns_exit($destination = null) {
-  $batch =& batch_get();
+  //require_once(drupal_get_path())
+  if (function_exists('batch_get')) {
+    $batch =& batch_get();
+  }
+  
   if (variable_get('patterns_form_helper', FALSE) && $_SESSION['patterns_form_helper'] && !$destination && empty($batch)) {
-    if (module_exists('devel')) {
+    if (module_exists('devel') && function_exists('kprint_r')) {
       //dpm($_SESSION['patterns_form_helper']);
       kprint_r($_SESSION['patterns_form_helper']);
     }
-    else {
+    elseif (function_exists('theme')) {
       print theme('patterns_form_helper', $_SESSION['patterns_form_helper']['form_id'], $_SESSION['patterns_form_helper']['form_values']);
     }
 
--- generate/all.inc
+++ generate/all.inc
@@ -0,0 +1,52 @@
+<?php
+
+/**
+ * @file
+ * generate a start for a pattern based on variables, roles and perms
+ */
+
+/**
+ * Generate variables patterns actions for set of modules
+ *
+ * @param array $modules
+ *   array of module names such as 'user','block',...
+ *   
+ * @param array &$form_state
+ * 
+ * @return
+ *   array of actions as xml such as
+ *    <variable name="user_picture_guidelines"></variable>,
+ *    <variable name="user_picture_path">pictures</variable>,
+ *
+ */
+
+function patterns_generate_all_template($modules, &$form_state) {
+  $type = 'all';
+  $actions = array();
+  foreach (array('rolesandperms', 'blocks', 'variables') as $object_type) {
+    require_once("${object_type}.inc");
+    $actions = array_merge($actions, call_user_func("patterns_generate_". $object_type . "_template", $modules, $form_state));
+  }
+  return $actions;
+
+}
+
+
+function patterns_generate_all_form() {
+
+  $form_elements = array();
+  foreach (array('blocks', 'variables', 'rolesandperms') as $object_type) {
+    require_once("${object_type}.inc");
+    $extra_form_elements = "patterns_generate_" .  $object_type .  "_form";
+    if (function_exists($extra_form_elements)) {
+      $form_elements = array_merge($form_elements, call_user_func($extra_form_elements, 'all'));
+    }
+  }
+
+  return $form_elements;
+}
+
+
+
+
+

--- generate/blocks.inc
+++ generate/blocks.inc
@@ -0,0 +1,98 @@
+<?php
+
+/**
+ * @file
+ *  include file for generating block patterns
+ */
+
+/**
+ * Generate block actions
+ *
+ * @param array $modules
+ *   array of module names such as 'user','block',...
+ *
+ * @param array &$form_state
+ * 
+ * @return
+ *   array of block actions as xml
+ */
+
+function patterns_generate_blocks_template($modules, &$form_state) {
+
+  $block_defns = patterns_generate_blocks_get_blocks();
+  
+  $direct_db_map = array(
+    'module' => 'module',
+    'delta'  => 'delta',
+    'body'  => 'body',
+    'info'  => 'info',
+    'format'  => 'format',
+    'theme' => 'theme',
+    'status' => 'status',
+    'weight' => 'weight',
+    'region' => 'region',
+    'custom' => 'custom',
+    'throttle' => 'throttle',
+    'visibility' => 'visibility',
+    'title' => 'title',
+    'cache' => 'cache',
+    );
+    
+    $actions = array();
+    foreach ($block_defns as $bid => $block) {
+      if (in_array($block['module'], $modules)) {
+//        dpm($block['module']); dpm($mod_list);
+        $block_tags = array();
+        // direct mapping fields
+        foreach ($direct_db_map as $element_name => $db_field_name) {
+          if (isset($block[$db_field_name]) && $block[$db_field_name]) {
+            $value = $block[$db_field_name];
+            if ($value && ! @simplexml_load_string("<?xml version='1.0'?>\n<document>$value</document>\n")) { 
+              $value = "\n<![CDATA[$value \n]]>";
+            }
+          $block_tags[] = "    <$element_name>$value</$element_name>";
+          }
+          
+        }
+      
+      //pages 
+      if (isset($block['pages'])) {
+        $pages = explode("\n", $block['pages']); // = $block[$db_field_name];
+        $pages_element = "  <pages>\n    <path>" . join("</path>\n    <path>", $pages) . "</path>\n  </pages>\n";
+        $pages_element = str_replace("<front>","[front]",$pages_element);
+        $block_tags[] = $pages_element;
+      }
+       
+      // roles
+      if ($block['role']) {
+        $roles = explode('|', $block['role']);
+        $role_element = "  <roles>\n    <role>" . join("</role>\n    <role>", $roles) . "</role>\n  </roles>\n";
+        $block_tags[] = $role_element;
+      }   
+  
+      $actions[] = "<block>\n" . join("\n", $block_tags) . "</block>\n";
+    }
+  }
+  return $actions;
+}
+
+
+function patterns_generate_blocks_get_blocks($theme = NULL) {
+  $sql = "SELECT boxes.body as body, boxes.info as info, boxes.format as format, blocks.*,
+  (SELECT GROUP_CONCAT(blocks_roles.rid SEPARATOR \"|\")  FROM {blocks_roles} 
+  WHERE blocks.module = blocks_roles.module AND blocks.delta = {blocks_roles}.delta) as role
+  FROM {blocks}
+  LEFT OUTER JOIN {system} ON system.name = blocks.theme AND type = 'theme' AND system.status = 1
+  LEFT OUTER JOIN {boxes} ON boxes.bid = delta and blocks.module = 'block'
+  WHERE blocks.status = 1
+  ORDER BY module, theme, delta";
+  
+    $result = db_query($sql);
+    
+    $blocks = array();
+    while ($block = db_fetch_array($result)) {
+      $blocks[$block['bid']] = $block;
+    }
+    return $blocks;
+}
+

--- generate/rolesandperms.inc
+++ generate/rolesandperms.inc
@@ -0,0 +1,103 @@
+<?php
+
+/**
+ * @file
+ * generate a start for a pattern based on variables, roles and perms
+ */
+
+
+/**
+ * Generate block actions
+ *
+ * @param array $modules
+ *   array of module names such as 'user','block',...
+ *
+ * @param array &$form_state
+ *   
+ * @return
+ *   array of block actions as xml
+ */
+function patterns_generate_rolesandperms_template($modules, &$form_state) {
+  
+ $rids_requested = ($form_state['values']['roles']) ? array_keys(array_filter($form_state['values']['roles'])) : array_keys(user_roles());
+ $overwrite = (isset($form_state['values']['overwrite'][1])) ? $form_state['values']['overwrite'][1] : 0;
+ $result = db_query('SELECT r.rid, p.perm FROM {role} r LEFT JOIN {permission} p ON r.rid = p.rid WHERE r.rid in (%s)',
+    join(',', $rids_requested) );
+  
+  while ($role = db_fetch_object($result)) {
+    $role_permissions[$role->rid] = $role->perm .',';
+  }
+/* snipped below modified from user_admin_perm  from modules/user/user.admin.inc */
+  foreach ($modules as $module) {
+    if ($module && $permissions = module_invoke($module, 'perm')) {
+      asort($permissions);
+      foreach (array_values($permissions) as $perm) {
+        foreach ($rids_requested as $rid) {
+          if (strpos($role_permissions[$rid], $perm .',') !== FALSE) {
+            $perms_filtered_by_requested_rid[$rid][] = $perm;
+          }
+        }
+      }
+    }
+  }
+  
+  $roles = user_roles();
+  
+
+  if (is_array($perms_filtered_by_requested_rid)) {
+    foreach ($perms_filtered_by_requested_rid as $rid => $perms) {
+      $role_name = $roles[$rid];
+      if (count($perms) > 0) {
+          $perm_items = "      <value>". join("</value>\n      <value>", $perms) ."</value>\n";
+          $perms_xml .= "    <permissions role=\"$role_name\" overwrite=\"$overwrite\" >\n$perm_items    </permissions>\n\n";
+      }
+    
+    $roles_names = array_flip($roles);
+    unset($roles_names['anonymous user']);
+    unset($roles_names['authenticated user']);
+    $roles_xml = "    <role>". join("</role>\n    <role>", array_keys($roles_names) ) ."</role>\n";
+    }
+  } 
+  $actions = array($roles_xml, $perms_xml);
+  return $actions;
+
+}
+
+
+/**
+ * generate a pattern for roles and perms based on subset of current site's roles and perms
+ */
+function patterns_generate_rolesandperms_form($state = NULL) {  // action can be 'all' or 'blocks','variables', etc
+
+  $user_roles = user_roles();
+  //dpm($state); dpm($_SESSION['patterns_generate_state'][$state]);
+  if ($state && $_SESSION['patterns_generate_state'][$state]) {
+    $form_values = $_SESSION['patterns_generate_state'][$state];
+  }
+  else {
+    $form_values['roles'] = array_combine(array_keys($user_roles) , array_keys($user_roles));  
+    $form_values['overwrite'] = array();
+  }
+  
+  $form['roles'] = array(
+    '#type' => 'checkboxes',
+    '#title' => t('Roles to Include in Pattern'),
+    '#required' => True,
+    '#options' => $user_roles,
+    '#default_value' => $form_values['roles'],
+  );
+    
+  $form['overwrite'] = array(
+    '#type' => 'checkboxes',
+    '#title' => t('Overwrite Permissions'),
+    '#required' => FALSE,
+    '#default_value' => $form_values['overwrite'],
+    '#description' => "overwrite will cause all other permissions for each role 
+      to be reset/disabled",
+    '#options' => array('1' => 'Overwrite'),
+  );
+ 
+  return $form;
+}
+
+

--- generate/variables.inc
+++ generate/variables.inc
@@ -0,0 +1,36 @@
+<?php
+
+/**
+ * @file
+ *  include file for generating variable patterns
+ */
+
+/**
+ * Generate variables patterns actions for set of modules
+ *
+ * @param array $modules
+ *   array of module names such as 'user','block',...
+ *   
+ * @param array &$form_state
+ * 
+ * @return
+ *   array of actions as xml such as
+ *    <variable name="user_picture_guidelines"></variable>,
+ *    <variable name="user_picture_path">pictures</variable>,
+ *
+ */
+
+function patterns_generate_variables_template($modules, &$form_state) {
+  
+  $sql = 'SELECT name,value FROM {variable} WHERE '. str_repeat(' name like "%s%" OR ', count($modules));
+  $sql = trim($sql, "OR ");
+  $result = db_query($sql, $modules);
+  $parser = xml_parser_create('');
+  $actions = array();
+  while ($variable = db_fetch_array($result)) {
+    $value = patterns_generate_xmlize_value(unserialize($variable['value']));
+    $actions[] = '    <variable name="'. $variable['name']  .'">'. $value ."</variable>";
+  }
+  return $actions;
+}
+

--- patterns.generate.inc
+++ patterns.generate.inc
@@ -0,0 +1,173 @@
+<?php
+
+/**
+ * @file
+ * generate a start for a pattern based on variables, roles and perms
+ */
+
+function patterns_generate_splash() {
+  
+$content = <<<EOF
+
+<p>These patterns generation functions will create "starter" or
+"stub" patterns.  They will attempt to create the blocks,
+roles and perms, variables or all 3 for the modules you select.</p>
+
+<p>The resulting pattern is meant to tweaked, edited,
+and tested and in no way should be used.
+</p>
+
+EOF;
+  
+  
+return $content;
+  
+  
+}
+
+function patterns_generate(&$form_state, $type) {
+  require_once("generate/${type}.inc");
+  
+  // show existing pattern in textarea
+  if  ($_SESSION['patterns_generate_pattern']) {
+    $form['patterns_generate'] = array(
+      '#type' => 'fieldset',
+      '#title' => t('Pattern Result'),
+      '#collapsible' => TRUE,
+      );       
+    $form['patterns_generate']['pattern'] = array(
+      '#type' => 'textarea',
+      '#title' => t('Pattern'),
+      '#rows' => 20,
+      '#default_value' => $_SESSION['patterns_generate_pattern'],
+      '#description' => "Cut and paste this where you want to.
+         Maybe eyeball it to see if its what you want."
+      );
+    unset($_SESSION['patterns_generate_pattern']);
+  }
+  
+  $form_state['#storage']['generate_object_type'] = $type;
+  $form['modules'] = patterns_generate_module_options($type);
+  $extra_form_elements = "patterns_generate_" .  $type .  "_form";
+  if (function_exists($extra_form_elements)) {
+    $elements = call_user_func($extra_form_elements, $type);
+    foreach ($elements as $name => $data) {
+       $form[$name] = $data;
+    }
+  }
+  
+  $form['submit'] = array(
+    '#type' => 'submit',
+    '#value' => t('Generate !type Pattern for selected Modules', array('!type' => $type)),
+  );
+
+  $form['#validate'][] = "patterns_generate_validate";
+  $form['#submit'][] = "patterns_generate_submit";
+
+  return $form;
+}
+
+function patterns_generate_validate($form, &$form_state) {
+  
+}
+
+function patterns_generate_submit($form, &$form_state) {
+  $type = $form_state['#storage']['generate_object_type'];
+  require_once("generate/${type}.inc");
+  $modules = array_keys(array_filter($form_state['values']['modules']));
+  $actions = array();
+  $actions = array_merge($actions, call_user_func("patterns_generate_". $type . "_template", $modules, $form_state));
+  $pattern = patterns_generate_template($actions, $modules);
+  $_SESSION['patterns_generate_pattern'] = $pattern;
+
+  $_SESSION['patterns_generate_state'][$type] = $form_state['values'];  // keep current values in form
+  $form_state['redirect'] = 'admin/build/patterns/generate/'. $type;
+}
+
+
+function patterns_generate_xmlize_value($value) {
+  if (is_array($value)) {
+      $value =  patterns_generate_array_to_xml($value)  ;
+  }
+  elseif ( (! $value ) || is_null($value) || is_numeric($value) || is_bool($value) ) {
+    // do nothing, but don't parse xml either
+  } 
+  elseif (! @simplexml_load_string("<?xml version='1.0'?>\n<document>$value</document>\n")) { 
+    $value = "\n<![CDATA[$value \n]]>";
+  }
+  return $value;
+}
+
+
+function patterns_generate_array_to_xml($data) {
+  $xml = "";
+  if (is_array($data)) {
+    foreach ($data as $key => $value) {
+      if (is_array($value)) {
+        $xml .= "<$key>\n" . patterns_generate_array_to_xml($value) . "</$key>\n";
+      }
+      else {
+        $xml .= "<$key>".  $value . "</$key>\n";
+      }
+      
+    }
+  }
+  return $xml;
+}
+
+
+function patterns_generate_template($actions, $required_modules) {
+
+
+  if (count($required_modules) > 0) {
+    $modules_xml = "\n  <modules>\n    <module>". join("</module>\n    <module>", $required_modules) ."</module>\n  </modules>\n";
+  }
+  
+  $actions_xml = join("\n", $actions);
+    return   <<<EOF
+<?xml version="1.0" encoding="ISO-8859-1"?>
+<pattern>
+  <info>
+    <title></title>
+    <description></description>
+    <author></author>
+    <author_email></author_email>
+    <version></version>
+    <category></category>
+    <core>6.x</core>    
+  </info>
+$modules_xml 
+  <actions>
+
+$actions_xml
+  </actions>
+</pattern>
+EOF;
+
+}
+
+function patterns_generate_module_options($object_type) {
+  
+  require_once(drupal_get_path('module', 'system') .'/system.admin.inc');
+  $modules = system_modules();
+  foreach ($modules['validation_modules']['#value'] as $name => $module_obj) {
+    $module_options[$name] = $module_obj->info['name'];
+  }
+  
+  if (isset($_SESSION['patterns_generate_state'][$object_type]) && is_array($_SESSION['patterns_generate_state'][$object_type])) {
+    $modules = $_SESSION['patterns_generate_state'][$object_type]['modules'];
+  }
+  else {
+    $modules = array();  // for variables, not checked by default
+  }
+  
+  return  array(
+    '#type' => 'checkboxes',
+    '#title' => t("Module's to generate $object_type pattern for"),
+    '#required' => True,
+    '#default_value' => $modules,
+    '#options' => $module_options,
+  );
+    
+}
+


