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