Fix for rolesignup modification .. could not get the rid after role creation ..

  1. <?php # vim: set filetype=php expandtab tabstop=2 shiftwidth=2 autoindent smartindent:
  2. /* $Id: rolesignup.module,v 1.2.4.1 2007/01/20 21:49:48 sym Exp $ */
  3.  
  4. define("ROLE", "role_signup_role");
  5. /********************************************************************
  6. * Drupal Hooks
  7. ********************************************************************/
  8. /**
  9.  * Implementation of module_enable()
  10.  */
  11. function rolesignup_enable() {
  12.         cache_clear_all();
  13.         menu_cache_clear();
  14.         menu_rebuild();
  15. }
  16.  
  17. /**
  18.  * Implementation of module_disable()
  19.  */
  20. function rolesignup_disable() {
  21.         cache_clear_all();
  22.         menu_cache_clear();
  23.         menu_rebuild();
  24. }
  25.  
  26. /**
  27.  * Implementation of hook_perm()
  28.  */
  29. function rolesignup_allow_all() {
  30.   return true;
  31. }
  32.  
  33. function rolesignup_menu() {
  34.   return array(
  35.     'rolesignup' => array(
  36.       'title' => 'Sign Up'
  37.       ,'page callback' => 'rolesignup_main_page'
  38.       ,'type' => 'MENU_CALLBACK'
  39.       ,'access callback' => 'rolesignup_allow_all'
  40.       ,'file' => 'rolesignup.pages.inc'
  41.     )
  42.   );
  43. }
  44.  
  45. /**
  46.  * Implementation of hook_user()
  47.  */
  48. function rolesignup_user($op, &$edit, &$account, $category = NULL) {
  49.   switch ($op) {
  50.   case 'register':
  51.             if(!$category || $category == "account") {
  52.         $edit[ROLE] = arg(2); /* user/register/%role */
  53.         $roles = rolesignup_signup_roles();
  54.         $rids = array_keys($roles);
  55.         if(!isset($edit[ROLE]) || !in_array($edit[ROLE], $rids)) {
  56.           drupal_goto("rolesignup");
  57.           break;
  58.         }
  59.         drupal_set_message("Ah I am here now ..".$op.$category);
  60.         $form = array();
  61.         $output = node_view(node_load($roles[$edit[ROLE]]), 1);
  62.         $form["#prefix"] = $output;
  63.         $form[ROLE] = array(
  64.           "#type" => "value"
  65.           ,"#value" => $edit[ROLE]
  66.         );
  67.         return $form;
  68.             }
  69.     break;
  70.   case "insert":
  71.     $roles = rolesignup_signup_roles();
  72.           if (!$roles[$edit[ROLE]]) {
  73.       break;
  74.     }
  75.                 if(!isset($edit["roles"]) || !is_array($edit["roles"])) {
  76.                         $edit["roles"] = array();
  77.                 }
  78.     $node = node_load($roles[$edit[ROLE]]);
  79.                 $edit["roles"][$edit[ROLE]] = $node->title;
  80.     break;
  81.   }
  82. }
  83.  
  84. function rolesignup_form_alter(&$form, $form_state, $form_id) {
  85.         switch($form_id) {
  86.   case "user_register":
  87.                 $roles = user_roles(1, 'register for role');
  88.                 $rids = array_keys($roles);
  89.                 if(!isset($form_state["values"][ROLE]) || !in_array($form_state["values"][ROLE], $rids) || $form_state["values"]["back"] ) {
  90.                         /* Hide all the form elements */
  91.                         $form["submit"] = NULL;
  92.                         $form["account"] = NULL;
  93.                         $form["#validate"] = array("rolesignup_user_validate_wrapper");
  94.                 }
  95.     break;
  96.  
  97.   case "user_admin_role":
  98.     /* Initialize settings: copied from node.pages.inc */
  99.     $node = get_rolenode($form, $form_state);
  100.     $node_form = rolenode_form($node);
  101.  
  102.     foreach($node_form as $key => $value) {
  103.       if($key == "submit" || $key == "delete" || $key == 'rid') {
  104.         continue;
  105.       }
  106.       $form[$key] = $value;
  107.     }
  108.     $form["submit"]["#weight"] = 111;
  109.     $form["delete"]["#weight"] = 112;
  110.     $form["#submit"][] = 'rolenode_submit_wrapper';
  111.     $form["#validate"][] = 'rolenode_validate_wrapper';
  112.     break;
  113.         }
  114. }
  115.  
  116. function get_rolenode(&$form, &$form_state) {
  117.   global $user;
  118.   module_load_include('inc', 'node', 'node.pages');
  119.   if(
  120.     ($form_state["values"]["rid"] && $nid = rolenode_get_by_role($form_state["values"]["rid"]))
  121.     ||
  122.     ($form['rid']['#value'] && $nid = rolenode_get_by_role($form["rid"]['#value']))
  123.     ) {
  124.     $node = node_load($nid);
  125.   } else {
  126.     $node = array('uid' => $user->uid, 'name' => (isset($user->name) ? $user->name : ''), 'type' => 'rolenode', 'language' => '', "rid" => $form_state["values"]["rid"]);
  127.   }
  128.   return $node;
  129. }
  130.  
  131. function rolenode_validate_wrapper($form, $form_state) {
  132.   /* Note: the node validation may not be right :( */
  133.   unset($form->name);
  134.   unset($form_state["values"]["name"]);
  135.   module_load_include('inc', 'node', 'node.pages');
  136.   node_form_validate($form, $form_state);
  137. }
  138.  
  139. function rolenode_submit_wrapper($form, $form_state) {
  140.   unset($form_state["values"]["name"]);
  141.   module_load_include('inc', 'node', 'node.pages');
  142.   switch($form_state["values"]["op"]) {
  143.   case t('Save role'):
  144.   case t('Add role'):
  145.     if(!$form_state['values']['rid']) {
  146.       /* IMPORTANT: This will only work on role creation step .. */
  147.       $form_state['values']['rid'] = db_result(db_query("SELECT LAST_INSERT_ID()"));
  148.     }
  149.     $node = get_rolenode($form, $form_state);
  150.     $form_state["values"]["op"] = t("Save");
  151.     drupal_execute('rolenode_node_form', $form_state, $node);
  152.     break;
  153.   case t('Delete role'):
  154.     $nid = rolenode_get_by_role($form_state["values"]["rid"]);
  155.     node_delete($nid);
  156.     break;
  157.   }
  158. }
  159.  
  160. function rolesignup_signup_roles() {
  161.   static $signuproles = NULL;
  162.   if(!is_null($signuproles)) {
  163.     return $signuproles;
  164.   }
  165.   $signuproles = array();
  166.   $result = db_query("SELECT DISTINCT rid, nid FROM {rolenode} WHERE signup = 1 ORDER BY weight ");
  167.   while ($node = db_fetch_object($result)) {
  168.     $signuproles[$node->rid] = $node->nid;
  169.   }
  170.   return $signuproles;
  171. }