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("ROLESIGNUP_ROLE", "role_signup_role");
  5. /********************************************************************
  6. * Drupal Hooks
  7. ********************************************************************/
  8. /**
  9.  * Implementation of module_enable()
  10.  */
  11. function rolesignup_enable() {
  12. }
  13.  
  14. /**
  15.  * Implementation of module_disable()
  16.  */
  17. function rolesignup_disable() {
  18. }
  19.  
  20. function rolesignup_menu() {
  21.   return array(
  22.     'rolesignup' => array(
  23.       'title' => 'Sign Up'
  24.       ,'page callback' => 'rolesignup_main_page'
  25.       ,'type' => 'MENU_CALLBACK'
  26.       ,'access callback' => TRUE
  27.       ,'file' => 'rolesignup.pages.inc'
  28.     )
  29.   );
  30. }
  31.  
  32. /**
  33.  * Implementation of hook_user()
  34.  */
  35. function rolesignup_user($op, &$edit, &$account, $category = NULL) {
  36.   switch ($op) {
  37.   case 'register':
  38.     if(!$category || $category == "account") {
  39.       $rid = arg(2); /* user/register/%role */
  40.  
  41.       /* check if we have a valid rid */
  42.       $roles = rolesignup_signup_roles();
  43.       $rids = array_keys($roles);
  44.       if(!in_array($rid, $rids)) {
  45.         drupal_goto("rolesignup");
  46.         break;
  47.       }
  48.       $form = array();
  49.  
  50.       /* show role information */
  51.       $role_node = node_load($roles[$rid]);
  52.       $role_node->hide_create_link = TRUE; /* A trick to hide the role create link */
  53.       $output = node_view($role_node);
  54.       $form["#prefix"] = $output;
  55.  
  56.  
  57.       /* keep the rid */
  58.       $form[ROLESIGNUP_ROLE] = array(
  59.         "#type" => "value"
  60.         ,"#value" => $rid
  61.       );
  62.       return $form;
  63.     }
  64.     break;
  65.   case "insert":
  66.     $roles = rolesignup_signup_roles();
  67.     if (!$roles[$edit[ROLESIGNUP_ROLE]]) {
  68.       break;
  69.     }
  70.     if(!isset($edit["roles"]) || !is_array($edit["roles"])) {
  71.        $edit["roles"] = array();
  72.     }
  73.     $node = node_load($roles[$edit[ROLESIGNUP_ROLE]]);
  74.     $edit["roles"][$edit[ROLESIGNUP_ROLE]] = $node->title;
  75.     break;
  76.   }
  77. }
  78.  
  79. function rolesignup_form_alter(&$form, $form_state, $form_id) {
  80.   switch($form_id) {
  81.   case "user_admin_role":
  82.     /* Initialize settings: copied from node.pages.inc */
  83.     $node = get_rolenode($form, $form_state);
  84.     $node_form = rolenode_form($node);
  85.  
  86.     foreach($node_form as $key => $value) {
  87.       if($key == "submit" || $key == "delete" || $key == 'rid') {
  88.         continue;
  89.       }
  90.       $form[$key] = $value;
  91.     }
  92.     $form["submit"]["#weight"] = 111;
  93.     $form["delete"]["#weight"] = 112;
  94.     $form["#submit"][] = 'rolenode_submit_wrapper';
  95.     $form["#validate"][] = 'rolenode_validate_wrapper';
  96.     break;
  97.   }
  98. }
  99.  
  100. function get_rolenode(&$form, &$form_state) {
  101.   global $user;
  102.   module_load_include('inc', 'node', 'node.pages');
  103.   if(
  104.     ($form_state["values"]["rid"] && $nid = rolenode_get_by_role($form_state["values"]["rid"]))
  105.     ||
  106.     ($form['rid']['#value'] && $nid = rolenode_get_by_role($form["rid"]['#value']))
  107.     ) {
  108.     $node = node_load($nid);
  109.   } else {
  110.     $node = array('uid' => $user->uid, 'name' => (isset($user->name) ? $user->name : ''), 'type' => 'rolenode', 'language' => '', "rid" => $form_state["values"]["rid"]);
  111.   }
  112.   return $node;
  113. }
  114.  
  115. function rolenode_validate_wrapper($form, $form_state) {
  116.   /* Note: the node validation may not be right :( */
  117.   unset($form->name);
  118.   unset($form_state["values"]["name"]);
  119.   module_load_include('inc', 'node', 'node.pages');
  120.   node_form_validate($form, $form_state);
  121. }
  122.  
  123. function rolenode_submit_wrapper($form, $form_state) {
  124.   unset($form_state["values"]["name"]);
  125.   module_load_include('inc', 'node', 'node.pages');
  126.   switch($form_state["values"]["op"]) {
  127.   case t('Save role'):
  128.   case t('Add role'):
  129.     if(!$form_state['values']['rid']) {
  130.       /* IMPORTANT: This will only work on role creation step .. */
  131.       $form_state['values']['rid'] = db_result(db_query("SELECT LAST_INSERT_ID()"));
  132.     }
  133.     $node = get_rolenode($form, $form_state);
  134.     $form_state["values"]["op"] = t("Save");
  135.     drupal_execute('rolenode_node_form', $form_state, $node);
  136.     break;
  137.   case t('Delete role'):
  138.     $nid = rolenode_get_by_role($form_state["values"]["rid"]);
  139.     node_delete($nid);
  140.     break;
  141.   }
  142. }
  143.  
  144. function rolesignup_signup_roles() {
  145.   static $signuproles = NULL;
  146.   if(!is_null($signuproles)) {
  147.     return $signuproles;
  148.   }
  149.   $signuproles = array();
  150.   $result = db_query("SELECT DISTINCT rid, nid FROM {rolenode} WHERE signup = 1 ORDER BY weight ");
  151.   while ($node = db_fetch_object($result)) {
  152.     $signuproles[$node->rid] = $node->nid;
  153.   }
  154.   return $signuproles;
  155. }