如果用户属于 October CMS 中的组 - 用户插件

问题描述 投票:0回答:2

我正在尝试从 PHP 组件中的特定用户组中过滤用户。 首先,我根据关键字搜索特定用户,接下来我想测试该用户是否属于一个特定组“mygroupcode”。理想情况下,这两个陈述应该结合起来。

我尝试过以下方法:

public function onSelect() {
    $s2_opts = [];
    foreach(User::where('surname', 'LIKE', '%'.Input::get('q').'%')->orWhere('name', 'LIKE', '%'.Input::get('q').'%')->get() as $user) {
        if($user->groups()->whereName('mygroupcode')->exists()) {
            array_push($s2_opts, array('id' => $user->id, 'text' => $user->name . ' ' . $user->surname));
        }
    }
    return json_encode($s2_opts);
}

这会引发 MySQL 错误。像表

mydb.groups
之类的东西没有找到...在数据库中,它应该寻找user_groups。

另外,我已经尝试过:

public function onSelect() {
    $s2_opts = [];
    foreach(User::where('surname', 'LIKE', '%'.Input::get('q').'%')->orWhere('name', 'LIKE', '%'.Input::get('q').'%')->get() as $user) {
        if(in_array('mygroupcode',array_keys($user->groups))) {
            array_push($s2_opts, array('id' => $user->id, 'text' => $user->name . ' ' . $user->surname));
        }
    }
    return json_encode($s2_opts);
}

这也会产生 MySQL 错误。类似的,还有关于找不到表

groups
的问题。

另外,我注意到有一个名为 inGroup() 的方法,但这会产生相同的错误...

public function onSelect() {
    $s2_opts = [];
    foreach(User::where('surname', 'LIKE', '%'.Input::get('q').'%')->orWhere('name', 'LIKE', '%'.Input::get('q').'%')->get() as $user) {
        if($user->inGroup('mygroupcode')) {
            array_push($s2_opts, array('id' => $user->id, 'text' => $user->name . ' ' . $user->surname));
        }
    }
    return json_encode($s2_opts);
}

我做错了什么?预先感谢您的宝贵时间。

请注意以下相关问题。他们与后端用户列表有关,我正在寻找过滤前端用户。

php octobercms octobercms-plugins octobercms-user-plugin
2个回答
2
投票

如果你看一下

InGroup
函数,参数不是字符串(代码)而是一个对象:

/**
 * See if the user is in the given group.
 * @param Group $group
 * @return bool
 */
public function inGroup($group)
{
    foreach ($this->getGroups() as $_group) {
        if ($_group->getKey() == $group->getKey()) {  
            return true;
        }
    }

    return false;
}

您可以向您的 UserGroup 模型添加一个方法:

const GROUP_ADMIN     =   'admin'; // admin is the group unique code

public static function getAdminGroup()
 {
    return self::where('code', self::GROUP_ADMIN)->first() ;
 }

然后你可以使用这个方法来检查用户是否在组中

public function onSelect() {

    $q = Input('q', false );

    if (!empty ($q)) {

       $users = User::searchWhere( $q , 'surname' )
                      ->searchWhere( $q , 'name' )
                      ->get();

        if ( count ($users) ) {

            $s2_opts = [];

            $users->each( function( $user ) {
                if( $user->inGroup( UserGroupModel::getAdminGroup() )) {
                    // User is in Group... Push to Array
                }
            });

             return json_encode($s2_opts);

        } else {
            // No users found...
        }                 
    }

}

另请查看 filter 方法,您可以根据某些条件返回过滤后的集合

$filteredUsers = $users->filter(function ( $user ) {
    return $user->inGroup( UserGroupModel::getAdminGroup() ) ;
});

0
投票

我依靠查询生成器设法获得了一个可行的解决方案。我怀疑这是否是最佳解决方案,但目前它正在发挥作用。如果有人有更好的解决方案,请告诉我:

public function onSelect() {
    $s2_opts = [];
    foreach(User::select('users.id', 'users.surname', 'users.name')
                ->join('users_groups', 'users.id', '=', 'users_groups.user_id')
                ->join('user_groups', 'users_groups.user_group_id', '=', 'user_groups.id')
                ->where('user_groups.code','mygroupcode')
                ->where(function ($query) {
                    $query->where('users.surname', 'LIKE', '%'.Input::get('q').'%')->orWhere('users.name', 'LIKE', '%'.Input::get('q').'%');
                })
                ->groupBy('users.id')
                ->get() as $user) {
        array_push($s2_opts, array('id' => $user->id, 'text' => $user->name . ' ' . $user->surname));
    }

    return json_encode($s2_opts);
}
© www.soinside.com 2019 - 2024. All rights reserved.