this is my user_queue_member.module file,

  1. <?php # vim: set filetype=php expandtab tabstop=2 shiftwidth=2 autoindent smartindent:
  2.  
  3. /*
  4.   ERROR: warning: require_once(modules/system/user_queue_member.admin.inc) [function.require-once]: failed to open stream: No such file or directory in /data/projects/voip_support/trunk/control_interface/includes/menu.inc on line 344.
  5.   WHEN I GET ERROR: I get error when I go to "admin/user/user_queue_member"
  6.   NOTE: admin/user/user_queue_member is defined in user_queue_member_menu() ..
  7. */
  8.  
  9. define('USER_QUEUE_MEMBER_PHONE_NUMBER', 'USER_QUEUE_MEMBER_PHONE_NUMBER');
  10.  
  11. /* TODO: add an admin settings where user can create the phone number field or assign something .. */
  12.  
  13. function user_queue_member_enable() {
  14.   /* Add phone number field in profile.module */
  15.   if(module_exists('profile')) {
  16.     /* XXX we are not using drupal_execute(), so validation is left apart .. BAD ! */
  17.     if(db_query("INSERT INTO {profile_fields} (title, name, explanation, category, type, weight, required, register, visibility, autocomplete, options, page) VALUES ('%s', '%s', '%s', '%s', '%s', %d, %d, %d, %d, %d, '%s', '%s')", 'Phone Number', 'phone_number', '', 'Account Information', 'textfield', 4/* weight */, 1, 1, 0, 0, NULL, NULL)) {
  18.       $fid = db_last_insert_id('profile_fields', 'fid');
  19.       variable_set(USER_QUEUE_MEMBER_PHONE_NUMBER, $fid);
  20.     }
  21.   }
  22. }
  23.  
  24. function user_queue_member_perm() {
  25.   return array('can be queue member');
  26. }
  27.  
  28. function user_queue_member_help($path, $arg) {
  29.   /* TODO: say that activating profile will add support to calling the user by phone, and activating user_sip will enable calling using sip account .. */
  30.   switch($path) {
  31.     case 'user/%user/queue_member' :
  32.     return 'Asterisk queue membership details.';
  33.   }
  34. }
  35.  
  36. function user_queue_member_menu() {
  37.   return array(
  38.     'user/%user/queue_member' => array(
  39.       'title' => 'Asterisk queue membership',
  40.       'description' => 'Asterisk queue membership details.',
  41.       'page callback' => 'user_queue_member_details',
  42.       'page arguments' => array(1),
  43.       'access callback' => 'user_is_queue_member',
  44.       'access arguments' => array(1),
  45.       'file' => 'user_queue_member.pages.inc',
  46.       'type' => MENU_LOCAL_TASK,
  47.     )
  48.     ,'user/%user/queue_member/list' => array(
  49.       'title' => 'List',
  50.       'type' => MENU_DEFAULT_LOCAL_TASK,
  51.       'weight' => 0,
  52.     )
  53.     ,'user/%user/queue_member/add' => array(
  54.       'title' => 'Add',
  55.       'description' => t('Be a new queue member.'),
  56.       'page callback' => 'node_add',
  57.       'page arguments' => array('queue_member', 1),
  58.       'access callback' => 'node_access',
  59.       'access arguments' => array('create', 'queue_member'),
  60.       'file' => 'user_queue_member.node.pages.wrapper.inc',
  61.       'type' => MENU_LOCAL_TASK,
  62.       'weight' => 1,
  63.     )
  64.     ,'user/%user/queue_member/%node' => array(
  65.       'title' => 'Edit',
  66.       'description' => 'Asterisk queue membership details.',
  67.       'page arguments' => array('user_queue_member_details', 1),
  68.       'access callback' => 'user_is_queue_member',
  69.       'access arguments' => array(1),
  70.       'file' => 'user_queue_member.pages.inc',
  71.       'type' => MENU_LOCAL_TASK,
  72.       'weight' => 2,
  73.     )
  74.     ,'admin/user/user_queue_member' => array(
  75.       'title' => 'User queue member',
  76.       'description' => 'User Queue Member Settings.',
  77.       'page arguments' => array('user_queue_member_admin'),
  78.       'access arguments' => array('administer users'),
  79.       'file' => 'user_queue_member.admin.inc',
  80.     )
  81.     ,'admin/user/user_queue_member/autocomplete' => array(
  82.       'title' => 'Profile field name autocomplete',
  83.       'page callback' => 'user_queue_member_admin_autocomplete',
  84.       'type' => MENU_CALLBACK,
  85.       'file' => 'user_queue_member.admin.inc',
  86.     )
  87.   );
  88. }
  89.  
  90. function user_is_queue_member($account) {
  91.   global $user;
  92.   /*
  93.    * if I omit the following check it creates
  94.    * following error:
  95.    * ==========================================================
  96.    * warning: array_fill() [function.array-fill]: Number of elements must be positive in /data/projects/voip_support/trunk/control_interface/includes/database.inc on line 235.
  97.    * warning: implode() [function.implode]: Bad arguments. in /data/projects/voip_support/trunk/control_interface/includes/database.inc on line 235.
  98.    * warning: array_keys() [function.array-keys]: The first argument should be an array in /data/projects/voip_support/trunk/control_interface/modules/user/user.module on line 500.
  99.    * user warning: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ')' at line 1 query: SELECT p.perm FROM web_role r INNER JOIN web_permission p ON p.rid = r.rid WHERE r.rid IN () in /data/projects/voip_support/trunk/control_interface/modules/user/user.module on line 500.
  100.    * ==========================================================
  101.    * The probable reason is $account->role is not assigned when user_access() is called. Note that I called this in hook_user implementation which is called before all the node elements are loaded.
  102.    */
  103.   if(!is_array($account->roles)) {
  104.     return FALSE;
  105.   }
  106.   if($account->uid == 1) {
  107.     return FALSE; /* forbid the admin user.. */
  108.   }
  109.   if(!user_access('can be queue member', $account)) {
  110.     return FALSE;
  111.   }
  112.   if($account->uid == $user->uid || user_access('administer users', $user)) {
  113.     return TRUE;
  114.   }
  115.   return FALSE;
  116. }
  117.  
  118. function user_queue_member_user($op, &$edit, &$account, $category = NULL) {
  119.   if(!user_is_queue_member($account)) {
  120.     return;
  121.   }
  122.   switch($op) {
  123.   case 'view':
  124.     /* TODO: show the queues we are member of .. */
  125.     return;
  126.   case 'delete':
  127.     $result = db_query(db_rewrite_sql('SELECT n.nid FROM {user_queue_member} n WHERE uid = %d'), $account->uid);
  128.     while ($node = db_fetch_object($result)) {
  129.       node_delete(node_load($node->nid));
  130.     }
  131.     return;
  132.   }
  133. }
  134.  
  135. function user_queue_member_nodeapi(&$node, $op, $a3 = NULL, $a4 = NULL) {
  136.   if($node->type != 'queue_member') {
  137.     return;
  138.   }
  139.   /* handle delete */
  140.   switch($op) {
  141.   case 'delete':
  142.     db_query(
  143.       'DELETE FROM {user_queue_member} WHERE nid = %d'
  144.       , $node->nid
  145.     );
  146.     return;
  147.   }
  148.   /* check if we are working under a specific user */
  149.   $params = arg();
  150.   if(!$params[1]) {
  151.     return;
  152.   }
  153.   $account = user_load($params[1]);
  154.   if(!$account || !$account->uid) {
  155.     return;
  156.   }
  157.   switch($op) {
  158.   case 'insert':
  159.     /* associate the node with that user */
  160.     db_query(
  161.       'INSERT INTO {user_queue_member} SET uid = %d, nid = %d'
  162.       , $node->related_user
  163.       , $node->nid
  164.     );
  165.     drupal_set_message(t("You are now member of {$node->queue} queue"));
  166.     drupal_redirect_form($form, "user/{$node->related_user}/queue_member/list");
  167.     break;
  168.   }
  169. }
  170.  
  171. function user_queue_member_form_alter(&$form, $form_state, $form_id) {
  172.   if($form_id != 'queue_member_node_form') {
  173.     return;
  174.   }
  175.   $params = arg();
  176.   if(!$params[1]) {
  177.     return;
  178.   }
  179.   $account = user_load($params[1]);
  180.   if(!$account || !$account->uid) {
  181.     return;
  182.   }
  183.   $form['related_user'] = array(
  184.     '#type' => 'value'
  185.     ,'#value' => $account->uid
  186.   );
  187. }
  188.  
  189. function user_queue_member_queue_member($op, $data = NULL) {
  190.   switch($op) {
  191.   case 'title':
  192.     $params = arg();
  193.     if($params[0] != 'user' || !$params[1]) {
  194.       return;
  195.     }
  196.     $account = user_load($params[1]);
  197.     if(!$account || !$account->uid) {
  198.       return;
  199.     }
  200.     if(_user_queue_member_get_profile_field()) {
  201.       $result['user_phone'] = 'User Phone Number';
  202.     }
  203.     if(module_exists('user_sip')) {
  204.       $result['user_sip'] = 'User sip account';
  205.     }
  206.     return $result;
  207.   }
  208. }
  209.  
  210. function _user_queue_member_get_profile_field() {
  211.   return db_fetch_object(db_query('SELECT f.name, f.fid FROM {profile_fields} f WHERE f.fid = %d', variable_get(USER_QUEUE_MEMBER_PHONE_NUMBER, 0)));
  212. }