Drupal 7 开发内部培训资料, 分头诗人

drupal用户注册不同角色的的用户需要管理员确认

赞成!
0
否决!

如,在网站上注册了一个公司权限的用户,这需要管理员在后台,批准,然后用户收到一封邮件,才可以设置密码登录等等。
如,在网站上注册了一个学生权限的用户,直接就会收到邮件,设置密码登录等等。


现在drupal的后台,只可以设置需要管理员批准,或不用管理员批准,是针对所有的角色设置的,我想实现上面的功能,不知从何下手,请各位高手指点一下。

 

我的做法是,用Rules模块,先允许所有角色的注册,然后再Rules里添加一条规则,如果新增的用户是管理员,就先禁用该用户并发邮件给管理员,让管理员解锁用户.

但按照这个做好之后,用户注册不上,会报数据库错错误(用户角色表唯一键冲突),然后再次编辑刚加的rules网页就会显示500错误。

请教备位高手帮助,或有更好的办法。

4 个回答

赞成!
0
否决!

试一下 Registration role 或者 Auto Assign Role

赞成!
0
否决!

试一下代码方式,给你一个类似的参考

function yourmodule_form_alter(&$form, &$form_state, $form_id) {

    if($form_id == 'user_register_form' || $form_id == 'user_profile_form'){

        $form['autoassignrole_user']['user_roles']['#ajax'] = array(
          // #ajax has two required keys: callback and wrapper.
          // 'callback' is a function that will be called when this element changes.
          'callback' => 'ajax_form_alter',
          // 'wrapper' is the HTML id of the page element that will be replaced.
          'wrapper' => 'replace_field_div',
          // Don't show any throbber...
          'progress' => array('type' => 'none'),              
         );

        # This profile field will be shown or hidden when the respective "user_roles" is selected
        $form['field_first_name']['und'][0]['value']['#type']       = 'hidden';
        $form['field_first_name']['und'][0]['value']['#required']   = FALSE;
        $form['field_first_name']['und'][0]['value']['#type']       = 'hidden';
        $form['field_first_name']['und'][0]['value']['#prefix']     = '<div id="replace_field_div">';
        $form['field_first_name']['und'][0]['value']['#suffix']     = '</div>';

        // An AJAX request calls the form builder function for every change.
        // We can change how we build the form based on $form_state.        
        if(isset($form_state['values']['autoassignrole_user']['user_roles']) && $form_state['values']['autoassignrole_user']['user_roles'] == {rid_here}){
            # when the respective user roles is selected, show this field and set required.
            $form['field_first_name']['und'][0]['value']['#type']       = 'textfield';
            $form['field_first_name']['und'][0]['value']['#required']   = TRUE;   
        }else{ 
            # when the respective user roles, hide this field and remove required.
            $form['field_first_name']['und'][0]['value']['#type']       = 'hidden';
            $form['field_first_name']['und'][0]['value']['#required']   = FALSE;           
        }
    }
}
/**
 * Callback for user_roles
 *
 * On an ajax submit, the form builder function is called again, then the $form
 * and $form_state are passed to this callback function so it can select which
 * portion of the form to send on to the client.
 *
 * @return renderable array (the textfield element)
 */     
function ajax_form_alter($form, $form_state){
    return $form['field_first_name']; 
}
赞成!
0
否决!

@孤魂

你说的两个插件,去都试了,好像都没有用,我下了之后觉得他们应该是自动分配角色的。

我要实现的功能是,a角色注册直接就可以用了。b角色注册需要管理员在后台通过后才可以。

 

@脑震荡的猪

你发的代码我运行了。但是没有完全懂。field_first_name是你举例说的吗,我应该将它修改成角色的字段?

另外,是不是drupal有钩子,注册完之后,调用一下,我将数据库的用户修改为禁用,就可以了是这样吗?我上drupal官网,但访问不了。

赞成!
1
否决!

再次感谢各位的回答,问题已经解决了。下面是代码,意思就是用户注册成功后,如果需要禁用帐号就修改一下数据库,就可以了。

//用户注册后回调
function hook_user_insert(&$edit, $account, $category) {
	$wpy_role_id = 2;//角色id
	if(isset($wpy_role_id) && $wpy_role_id>0 && isset($account->roles[$wpy_role_id])){
		db_update('users')
		->condition('uid', $account->uid)
		->fields(array('status' => '0'))
		->execute();
	}
}