1

トリガーとカスタム アクションを使用して、特定のプロファイル フィールドを指定して (追加/編集時に) ユーザーに特別な役割を与えようとしています。だからここに私のコードがあります:

function mymodule_action_info() {
    return array(
        'mymodule_user_appropriate_role' => array(
            'description' => t('Assign user special role'),
            'type' => 'user',
            'configurable' => FALSE,
            'hooks' => array(
                'user' => array('insert', 'update'),
            ),
        ),
    );
}

その後

function mymodule_user_appropriate_role(&$object, $context = array()) {
    // get the uid from the object
    if( isset( $object->uid ) ){
        $thisUID = $object->uid;
    }else if( isset( $context['uid'] ) ){
        $thisUID = $context['uid'];
    }else{
        global $user;
        $thisUID = $user->uid;
    }
    // make sure we have a user record
    if( $thisUID ){
        // load user object
        $thisUser = user_load( $thisUID );
        // get user profile object
        profile_load_profile( $thisUser );

        if( $thisUser->profile_special_field == "value1" ){

            // FIRST APPROACH
            db_query( 'INSERT INTO {users_roles} (uid, rid) VALUES (%d, %d)', $thisUser->uid, 5 ); // 5 is the custom role ID

            // SECOND APPROACH
            $thisUserRoles = $thisUser->roles;
            if( !isset( $thisUserRoles[5] ) ){
                $thisUserRoles[5] = "RID 5 Rule Name";
            }
            user_save( $thisUser, array( 'roles' => $thisUserRoles ) );

            // THIRD APPROACH
            $allUserRoles = user_roles();
            user_save( $thisUser, array( 'roles' => array( array_search( 'RID 5 Rule Name', $allUserRoles ) => 1 ) ) );

        }
    }
}

しかし、これら 3 つのアプローチはいずれも機能しませんでした。アクションが呼び出され、if( $thisUser->profile_special_field == "value1" )ステートメントを入力すると確信しています

私は昨日からこれに苦労しているので、どんな助けも大歓迎です...

4

1 に答える 1

0

私はhook_userになりました。参照用のコードは次のとおりです。

function mymodule_helper_user($op, &$edit, &$account, $category = NULL){

    // DEFINE OPERATIONS LIST TO ACT ON
    $opList = array( 'insert', 'update', 'after_update', 'submit' );

    if( in_array( $op, $opList ) ){

        // REVOKE ALL CUSTOM ROLES, HERE RID 5 AND 6
        db_query( 'DELETE FROM {users_roles} WHERE rid IN (5,6) AND uid = %d', $account->uid );

        if( $account->profile_custom_field == 'value1' ){
            // GIVE CUSTOM RID 5
            db_query( 'INSERT IGNORE INTO {users_roles} (uid, rid) VALUES (%d, %d)', $account->uid, 5 );
        }else if( $account->profile_custom_field == 'value2' ){
            // GIVE CUSTOM RID 6
            db_query( 'INSERT IGNORE INTO {users_roles} (uid, rid) VALUES (%d, %d)', $account->uid, 6 );
        }
    }

}

操作リストについては、「after_update」とは対照的に、「update」で実行してもうまくいきませんでした。そのため、必要なものだけをテストして保持するまで、4 つの疑わしい操作を追加しました。

それが役に立てば幸い

于 2013-03-12T16:17:33.947 に答える