Index: modules/sms_user.install =================================================================== RCS file: modules/sms_user.install diff -N modules/sms_user.install --- /dev/null 1 Jan 1970 00:00:00 -0000 +++ modules/sms_user.install 3 Jun 2008 22:04:03 -0000 @@ -0,0 +1,33 @@ + user_access('administer sms_user'), 'type' => MENU_NORMAL_ITEM, ); - } else { - + if (arg(0) == 'user' && is_numeric(arg(1))) { + $items[] = array( + 'path' => 'user/' . arg(1) . '/mobile', + 'title' => t('Mobile'), + 'weight' => 1, + 'callback' => 'drupal_get_form', + 'callback arguments' => array('sms_user_form'), + 'type' => MENU_LOCAL_TASK, + ); + } } return $items; } function sms_user_user($op, &$edit, &$account, $category = NULL) { - $gateway = sms_gateways('gateway', variable_get('sms_default_gateway', 0)); switch ($op) { - case 'register': - return sms_user_form($edit, $account, $category, TRUE); + case 'load': + return sms_user_load($edit, $account, $category); case 'update': case 'insert': return sms_user_save($edit, $account, $category); - case 'form': - return sms_user_form($edit, $account, $category); - case 'validate': - return sms_user_validate($edit, $account); } } -function sms_user_form($edit, $account, $category, $register = FALSE) { - if ($category == 'account') { - $form['sms_user'] = array( - '#type' => 'fieldset', - '#title' => t('Mobile information'), - '#collapsible' => TRUE, - '#collapsed' => FALSE, - '#tree' => TRUE, - ); - - $destination->number = $edit['sms_user']['number']; - if (is_array($edit['sms_user']['gateway'])) { - foreach ($edit['sms_user']['gateway'] as $key => $field) { - $destination->$key = $field; +function sms_user_form($register = FALSE) { + $account = user_load(array('uid' => arg(1))); + + $edit = $_POST['op'] ? $_POST : (array)$account; + + $form['sms_user'] = array( + '#type' => 'fieldset', + '#title' => t('Mobile information'), + '#tree' => TRUE, + ); + + switch ($account->sms_user['status']) { + case 0: + $destination->number = $edit['sms_user'][0]['number']; + if (is_array($edit['sms_user'][0]['gateway'])) { + foreach ($edit['sms_user'][0]['gateway'] as $key => $field) { + $destination->$key = $field; + } } - } - $form['sms_user'] += sms_send_form(NULL, $destination, FALSE); - - if ($account->sms_user['status'] == 1 && $account->sms_user['code']) { + $form['sms_user'] += sms_send_form(NULL, $destination, FALSE); + $form['step'] = array('#type' => 'value', '#value' => '1'); + $form['submit'] = array( + '#type' => 'submit', + '#value' => t('Confirm number'), + ); + break; + case 1: + drupal_set_message(t('A message containing a confirmation code has been sent to your mobile phone. Please enter the code below.'), 'status'); + $form['sms_user']['confirm_code'] = array( '#type' => 'textfield', '#title' => t('Confirmation code'), @@ -71,69 +84,112 @@ function sms_user_form($edit, $account, '#size' => 4, '#maxlength' => 4, ); - } - elseif ($account->sms_user['status'] == 2) { - $form['sms_user']['status_message'] = array('#value' => t('Your mobile number has been confirmed.')); - } - - return $form; + $form['submit'] = array( + '#type' => 'submit', + '#value' => t('Submit'), + ); + $form['reset'] = array( + '#type' => 'submit', + '#value' => t('Start over'), + ); + + break; + case 2: + $form['sms_user']['number'] = array( + '#type' => 'item', + '#title' => t('Your number'), + '#value' => $account->sms_user['number'], + '#description' => t('Your number has been confirmed.') + ); + + $form['reset'] = array( + '#type' => 'submit', + '#value' => t('Start over'), + ); + break; } + + return $form; } -function sms_user_validate($edit, $category) { - if ($edit['sms_user']['number']) { - if (!sms_formatter($edit['sms_user']['number'])) { - form_set_error('number', t('You must enter a valid ten digit phone number.')); - $edit['sms_user']['status'] = 0; - } - else { - $errors = FALSE; - foreach ($edit['sms_user']['gateway'] as $key => $field) { - if (!$field) { - $errors = TRUE; - form_set_error('sms_user', t('Please check your input.')); - } - if ($edit['sms_user']['confirm_code'] && $edit['sms_user']['confirm_code'] != $edit['_account']->sms_user['code']) { - form_set_error('sms_user][confirm_code', t('The confirmation code is invalid.')); +function sms_user_form_validate($form_id, $form_values) { + $account = user_load(array('uid' => arg(1))); + + switch ($form_values['op']) { + case t('Confirm number'): + if ($form_values['sms_user']['number']) { + if (!sms_formatter($form_values['sms_user']['number'])) { + form_set_error('sms_user][number', t('You must enter a valid ten digit phone number.')); } } - } + break; + case t('Submit'): + if ($form_values['sms_user']['confirm_code'] != $account->sms_user['code']) { + form_set_error('sms_user][confirm_code', t('The confirmation code is invalid.')); + } + break; } } -function sms_user_save(&$edit, &$account, $category) { - if ($edit['sms_user']['number']) { - $edit['sms_user']['number'] = sms_formatter($edit['sms_user']['number']); +function sms_user_form_submit($form_id, $form_values) { + $account = user_load(array('uid' => arg(1))); - if ($edit['sms_user']['number'] != $account->sms_user['number']) { + switch ($form_values['op']) { + case t('Confirm number'): $code = rand(1000, 9999); - $edit['sms_user']['code'] = $code; - $edit['sms_user']['status'] = 1; + $data = $account->sms_user; + $data['code'] = $code; + $data['number'] = $form_values['sms_user']['number']; + $data['status'] = 1; + $data['gateway'] = $form_values['sms_user']['gateway']; - $destination->number = $edit['sms_user']['number']; - foreach ($edit['sms_user']['gateway'] as $key => $field) { + user_save($account, array('sms_user' => $data), 'mobile'); + $destination->number = $form_values['sms_user']['number']; + foreach ($form_values['sms_user']['gateway'] as $key => $field) { $destination->$key = $field; } + sms_send(array($destination), sms_user_confirm_message($code)); - drupal_set_message(t('A message containing a confirmation code has been sent to your mobile phone. Please enter the code on your !edit_account page.', array('!edit_account' => l(t('edit account'), 'user/'. $account->uid .'/edit'))), 'status'); - } - else { - $edit['sms_user']['code'] = $account->sms_user['code']; - $edit['sms_user']['status'] = $account->sms_user['status']; - if ($edit['sms_user']['confirm_code'] && $edit['sms_user']['confirm_code'] != $edit['_account']->sms_user['code']) { - $edit['sms_user']['status'] = 2; - drupal_set_message(t('Your mobile number has been confirmed.'), 'status'); - } - } + break; + case t('Start over'): + $data = $account->sms_user; + $data['number'] = NULL; + $data['status'] = 0; + $data['gateway'] = NULL; + $data['code'] = NULL; + + user_save($account, array('sms_user' => $data), 'mobile'); + db_query("DELETE FROM {sms_user} WHERE uid = %d", $account->uid); + break; + case t('Submit'): + $data = $account->sms_user; + $data['status'] = 2; + + user_save($account, array('sms_user' => $data), 'mobile'); + break; } - else { - $edit['sms_user']['status'] = 0; - $edit['sms_user']['code'] = 0; +} + +function sms_user_load(&$edit, &$account, $category) { + $data = db_fetch_array(db_query("SELECT number, gateway FROM {sms_user} WHERE uid = %d", $account->uid)); + $account->sms_user['number'] = $data['number']; + $account->sms_user['gateway'] = unserialize($data['gateway']); +} + +function sms_user_save(&$edit, &$account, $category) { + if ($category == 'mobile') { + $db_values = array($edit['sms_user']['number'], serialize($edit['sms_user']['gateway'])); - foreach ($edit['sms_user']['gateway'] as $key => $field) { - unset($edit['sms_user']['gateway'][$key]); + if ($account->sms_user['number']) { + db_query("UPDATE {sms_user} SET number = %d, gateway = '%s' WHERE uid = %d", array_merge($db_values, array($account->uid))); + } + else { + db_query("INSERT INTO {sms_user} (number, gateway, uid) VALUES (%d, '%s', %d)", array_merge($db_values, array($account->uid))); } + + $edit['sms_user']['number'] = NULL; + $edit['sms_user']['gateway'] = NULL; } } @@ -163,26 +219,20 @@ function sms_user_sms_receive($node, $sm if (substr($number, 0, 1) == '1') {// remove leading '1', sms_user doesn't store it... $number = substr($number, 1); } - // NOTE: this needs refactoring to NOT store in profile data -- can't loop through like this... - /* $result = db_query('SELECT uid, name, data FROM {users} WHERE status != 0 AND access != 0 ORDER BY created DESC'); - while ($account = db_fetch_object($result)) { - $user_data = unserialize($account->data); - if($user_data['sms_user']['number'] == $number) { - $node->uid = $account->uid; - $node->name = $account->name; - //$form_state['uid'] = $account->uid; - //$form_state['name'] = $account->name; - break; - } - }*/ - - // This is much cleaner, but might still be nice to use a table with phone numbers - // ie. could query: SELECT uid FROM {sms_user} WHERE 'number' = 7785555555 - $result = db_query("SELECT uid, name FROM {users} WHERE data LIKE '%". $number ."%'"); + + $account = sms_user_load_user($number); while ($account = db_fetch_object($result)) { $node->uid = $account->uid; $node->name = $account->name; break; } return $node; +} + +/** + * Get user based on mobile number + */ +function sms_user_load_user($number) { + $uid = db_fetch_array(db_query("SELECT uid FROM {sms_user} WHERE number = $number")); + return user_load(array('uid' => $uid)); } \ No newline at end of file