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