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.         return array("fine" => array("#type" => "textfield"));
  69.             }
  70.     break;
  71.   case "insert":
  72.     $roles = rolesignup_signup_roles();
  73.           if (!$roles[$edit[ROLE]]) {
  74.       break;
  75.     }
  76.                 if(!isset($edit["roles"]) || !is_array($edit["roles"])) {
  77.                         $edit["roles"] = array();
  78.                 }
  79.     $node = node_load($roles[$edit[ROLE]]);
  80.                 $edit["roles"][$edit[ROLE]] = $node->title;
  81.     break;
  82.   }
  83. }
  84.  
  85. function rolesignup_form_alter(&$form, $form_state, $form_id) {
  86.         switch($form_id) {
  87.   case "user_register":
  88.                 $roles = user_roles(1, 'register for role');
  89.                 $rids = array_keys($roles);
  90.                 if(!isset($form_state["values"][ROLE]) || !in_array($form_state["values"][ROLE], $rids) || $form_state["values"]["back"] ) {
  91.                         /* Hide all the form elements */
  92.                         $form["submit"] = NULL;
  93.                         $form["account"] = NULL;
  94.                         $form["#validate"] = array("rolesignup_user_validate_wrapper");
  95.                 }
  96.     break;
  97.  
  98.   case "user_admin_role":
  99.     /* Initialize settings: copied from node.pages.inc */
  100.     $node = get_rolenode($form, $form_state);
  101.     $node_form = rolenode_form($node);
  102.  
  103.     foreach($node_form as $key => $value) {
  104.       if($key == "submit" || $key == "delete" || $key == 'rid') {
  105.         continue;
  106.       }
  107.       $form[$key] = $value;
  108.     }
  109.     $form["submit"]["#weight"] = 111;
  110.     $form["delete"]["#weight"] = 112;
  111.     $form["#submit"][] = 'rolenode_submit_wrapper';
  112.     $form["#validate"][] = 'rolenode_validate_wrapper';
  113.     break;
  114.         }
  115. }
  116.  
  117. function get_rolenode(&$form, &$form_state) {
  118.   global $user;
  119.   module_load_include('inc', 'node', 'node.pages');
  120.   if(
  121.     ($form_state["values"]["rid"] && $nid = rolenode_get_by_role($form_state["values"]["rid"]))
  122.     ||
  123.     ($form['rid']['#value'] && $nid = rolenode_get_by_role($form["rid"]['#value']))
  124.     ) {
  125.     $node = node_load($nid);
  126.   } else {
  127.     $node = array('uid' => $user->uid, 'name' => (isset($user->name) ? $user->name : ''), 'type' => 'rolenode', 'language' => '', "rid" => $form_state["values"]["rid"]);
  128.   }
  129.   return $node;
  130. }
  131.  
  132. function rolenode_validate_wrapper($form, $form_state) {
  133.   /* Note: the node validation may not be right :( */
  134.   unset($form->name);
  135.   unset($form_state["values"]["name"]);
  136.   module_load_include('inc', 'node', 'node.pages');
  137.   node_form_validate($form, $form_state);
  138. }
  139.  
  140. function rolenode_submit_wrapper($form, $form_state) {
  141.   unset($form_state["values"]["name"]);
  142.   module_load_include('inc', 'node', 'node.pages');
  143.   switch($form_state["values"]["op"]) {
  144.   case t('Save role'):
  145.   case t('Add role'):
  146.     if(!$form_state['values']['rid']) {
  147.       /* IMPORTANT: This will only work on role creation step .. */
  148.       $form_state['values']['rid'] = db_result(db_query("SELECT LAST_INSERT_ID()"));
  149.     }
  150.     $node = get_rolenode($form, $form_state);
  151.     $form_state["values"]["op"] = t("Save");
  152.     drupal_execute('rolenode_node_form', $form_state, $node);
  153.     break;
  154.   case t('Delete role'):
  155.     $nid = rolenode_get_by_role($form_state["values"]["rid"]);
  156.     node_delete($nid);
  157.     break;
  158.   }
  159. }
  160.  
  161. function rolesignup_signup_roles() {
  162.   static $signuproles = NULL;
  163.   if(!is_null($signuproles)) {
  164.     return $signuproles;
  165.   }
  166.   $signuproles = array();
  167.   $result = db_query("SELECT DISTINCT rid, nid FROM {rolenode} WHERE signup = 1 ORDER BY weight ");
  168.   while ($node = db_fetch_object($result)) {
  169.     $signuproles[$node->rid] = $node->nid;
  170.   }
  171.   return $signuproles;
  172. }
  173.  
  174. /*
  175. Array
  176. (
  177.     [user_registration_help] => Array
  178.         (
  179.             [#value] =>
  180.         )
  181.  
  182.     [account] => Array
  183.         (
  184.             [#type] => fieldset
  185.             [#title] => Account information
  186.             [#weight] => -10
  187.             [name] => Array
  188.                 (
  189.                     [#type] => textfield
  190.                     [#title] => Username
  191.                     [#default_value] =>
  192.                     [#maxlength] => 60
  193.                     [#description] => Spaces are allowed; punctuation is not allowed except for periods, hyphens, and underscores.
  194.                     [#required] => 1
  195.                 )
  196.  
  197.             [mail] => Array
  198.                 (
  199.                     [#type] => textfield
  200.                     [#title] => E-mail address
  201.                     [#default_value] =>
  202.                     [#maxlength] => 64
  203.                     [#description] => A valid e-mail address. All e-mails from the system will be sent to this address. The e-mail address is not made public and will only be used if you wish to receive a new password or wish to receive certain news or notifications by e-mail.
  204.                     [#required] => 1
  205.                 )
  206.  
  207.         )
  208.  
  209.     [#uid] =>
  210.     [fine] => Array
  211.         (
  212.             [#type] => textfield
  213.         )
  214.  
  215. )
  216.  
  217. */