【问题标题】:If user belongs to group in October CMS - User plugin如果用户在 10 月属于组 CMS - 用户插件
【发布时间】:2018-01-19 21:01:57
【问题描述】:

我正在尝试过滤来自 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);
}

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

请注意以下相关问题。他们是关于后端用户列表,我希望过滤掉前端用户。

【问题讨论】:

    标签: octobercms octobercms-plugins octobercms-user-plugin


    【解决方案1】:

    如果您查看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() ) ;
    });
    

    【讨论】:

    • 谢谢拉贾。这看起来非常优雅。我猜公共静态函数 getAdminGroup() 应该在我的组件的 Plugin.php 文件中定义,是吗?在class Plugin extends PluginBase {}内?
    • 不应该在模型中定义静态方法,在这种情况下是用户组模型。请记住,如果您在其中添加它然后更新用户插件,您将失去更改,因此请阅读文档如何扩展插件模型,然后您可以安全地从您自己的插件扩展它。如果您不希望将来更新用户插件,那么我认为只需将其添加到那里就可以了。
    • 你的代码看起来不错,你可以坚持,只是问题是 inGroup 方法需要一个模型实例,所以添加:$group=UserGroup::whereCode('mycode')->first ();然后传递 $group 作为参数而不是代码: $user->inGroup($group)..
    • 感谢 Raja,这似乎可行。我仍然需要弄清楚一些细节,但 inGroup 方法现在似乎产生了结果。十月摇滚!
    【解决方案2】:

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

    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);
    }
    

    【讨论】:

      猜你喜欢
      • 2019-01-12
      • 2020-02-26
      • 2019-11-05
      • 2016-12-26
      • 2018-06-01
      • 1970-01-01
      • 2017-04-24
      • 2019-03-28
      • 2013-05-16
      相关资源
      最近更新 更多