这一章感觉挺好懂的,越来越具体了。
先是legalagree模块,给我的账户和注册页面添加一个是否同意的选项:
legalagree.info
name = Legal Agreement description = Displays a dubious legal agreement during user registration. package = Pro Drupal Development core = 7.x files[] = legalagree.module
legalagree.module
<?php /** * @file * Support for dubious legal agreement during user registration. */ /** * Implements hook_form_alter(). */ function legalagree_form_alter (&$form, &$form_state, $form_id) { // check to see if the form is the user registration or user profile form // if not then return and don’t do anything // 检查表单是否是用户注册或者用户信息,如果不是的话直接返回 if (! ($form_id == 'user_register_form' || $form_id == 'user_profile_form')) { return; } // add a new validate function to the user form to handle the legal // agreement // 添加一个新的激活选项 $form['#validate'][] = 'legalagree_user_form_validate'; // add a field set to wrap the legal agreement // 限制同意协议 $form['account']['legal_agreement'] = array( '#type' => 'fieldset', '#title' => t('Legal agreement') ); // add the legal agreement radio buttons // 添加单选框 $form['account']['legal_agreement']['decision'] = array( '#type' => 'radios', '#description' => t( 'By registering at %site-name, you agree that at any time, we (or our surly, brutish henchmen) may enter your place of residence and smash your belongings with a ball-peen hammer.', array( '%site-name' => variable_get('site_name', 'drupal') )), '#default_value' => 0, '#options' => array( t('I disagree'), t('I agree') ) ); } /** * Form validation handler for the current password on the user_account_form(). * 表单有效性检查 * @see user_account_form() * */ function legalagree_user_form_validate ($form, &$form_state) { global $user; // Did user agree? // 用户是否同意 if ($form_state['input']['decision'] != 1) { form_set_error('decision', t( 'You must agree to the Legal Agreement before registration can be completed.')); } else { watchdog('user', t('User %user agreed to legal terms', array( '%user' => $user->name ))); } }
最后的效果:
然后是记录用户登录次数的loginhistory模块:
loginhistory.info
name = Login History description = Keeps track of user logins. package = Pro Drupal Development core = 7.x files[] = loginhistory.install files[] = loginhistory.module
loginhistory.install
<?php /** * Implements hook_schema(). * 往数据库里加表 */ function loginhistory_schema () { $schema['login_history'] = array( 'description' => 'Stores information about user logins.', 'fields' => array( 'uid' => array( 'type' => 'int', 'unsigned' => TRUE, 'not null' => TRUE, 'description' => 'The {user}.uid of the user logging in.' ), 'login' => array( 'type' => 'int', 'unsigned' => TRUE, 'not null' => TRUE, 'description' => 'Unix timestamp denoting time of login.' ) ), 'indexes' => array( // login_history表的索引,凭此排序 'uid' => array( 'uid' ) ) ); return $schema; }
loginhistory.module
<?php /** * @file * Keeps track of user logins. * 记录用户登录次数 */ /** * Implements hook_user_login */ function loginhistory_user_login (&$edit, $account) { // insert a new record each time the user logs in // 每次登录往表单里添加一个记录,其实这个非常没有效率,应该直接记录次数而不是Unix时间戳 $nid = db_insert('login_history')->fields( array( 'uid' => $account->uid, 'login' => $account->login ))->execute(); } /** * Implements hook_user_view_alter * 我的账户——查看的时候被调用 */ function loginhistory_user_view_alter (&$build) { global $user; // count the number of logins for the user // 计算登录次数,为啥没效率了的原因,不过时间戳可以换算成北京时间倒也有用 $login_count = db_query( "SELECT count(*) FROM {login_history} where uid = :uid", array( ':uid' => $user->uid ))->fetchField(); // fetchField从数据库获得一个单个的值, // 其实就是依靠索引统计行数 // update the user page 把数字显示在我的账户——查看上 // by adding the number // of logins to the page $build['summary']['login_history'] = array( '#type' => 'user_profile_item', '#title' => t('Number of logins'), '#markup' => $login_count, '#weight' => 10 ); }
最后是自定义的外部登录验证
authdave.info
name = Authenticate Daves description = External authentication for all Daves. package = Pro Drupal Development core = 7.x files[] = authdave.module
authdave.module
<?php /** * Implements hook_form_alter(). * We replace the local login validation handler with our own. * 替代原来的登录校验函数 */ function authdave_form_alter (&$form, &$form_state, $form_id) { // In this simple example we authenticate on username to see whether starts // with dave // 在这个简单的例子里直接用用户名是否含有dave来判断用户是否能够登录 if ($form_id == 'user_login' || $form_id == 'user_login_block') { $form['#validate'][] = 'authdave_user_form_validate'; } } /** * Custom form validation function * 用户接管的登录函数 */ function authdave_user_form_validate ($form, &$form_state) { if (! authdave_authenticate($form_state)) { form_set_error('name', t('Unrecognized username.')); } } /** * Custom user authentication function * 对用户名的检验 */ function authdave_authenticate ($form_state) { // get the first four characters取出开头四个字母 // of the users name $username = $form_state['input']['name']; $testname = drupal_substr(drupal_strtolower($username), 0, 4); // check to see if the person is a dave // 检查是不是dave if ($testname == "dave") { // if it’s a dave then use the external_login_register function // to either log the person in or create a new account if that // person doesn’t exist as a Drupal user // 如果是的话就让它登录或者给它注册一个authdave的用户 user_external_login_register($username, 'authdave'); return TRUE; } else { return FALSE; } } /** * Implements hook_user_insert(). * 钩子,实现给新加入的用户在user表里增加邮箱地址,当然mycompany_email_lookup还没有实现,所以 * 暂时注释掉 */ // function authdave_user_insert (&$edit, &$account, $category = NULL) // { // global $authdave_authenticated; // if ($authdave_authenticated) // { // $email = mycompany_email_lookup($account->name); // // Set e-mail address in the users table for this user. // db_update('users')->fields(array( // 'mail' => $email // )) // ->condition('uid', $account->uid) // ->execute(); // } // }
在数据库中的样子:
知识共享署名-非商业性使用-相同方式共享:码农场 » Chapter 06: Working with Users用户操作代码