首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在列表页面的用户动作栏中要添加一个change_password链接及其工作流程

在列表页面的用户动作栏中要添加一个change_password链接及其工作流程
EN

Stack Overflow用户
提问于 2020-10-05 19:50:46
回答 1查看 100关注 0票数 0

我使用的是laravel-backpack 4.0。我想添加一个页面的密码更改链接和所有的验证和所有的功能,如编辑用户列表中的操作列。

EN

回答 1

Stack Overflow用户

发布于 2020-10-15 11:00:13

想要另一个页面,当包的内置用户crud允许您更新密码以及所有其他用户字段时,您只能更新密码,这似乎有点奇怪。也就是说,假设您有自己的原因(并且我已经正确理解了用法),一种方法是使用建议的users addon package,然后为用户模型创建第二个CRUD控制器,该控制器只支持“更新”操作,并且只允许编辑密码。

备注

这是未经测试的,因此可能会有一些小问题需要解决,但方法是可靠的。

安装和配置users addon package。然后,为用户创建第二个控制器,但进行编辑,以便只允许"update“操作,并且只有密码和密码确认字段是可编辑的。我们会将姓名和电子邮件设置为只读,以便您可以查看收件人,但不能编辑这些字段。如果需要,您可以隐藏这些字段,也可以删除它们,但如果删除它们,请注意,您需要创建一个自定义请求类并更新规则,以便在提交时不需要这些字段。

代码语言:javascript
复制
<?php

namespace App\Http\Controllers;

use Backpack\CRUD\app\Http\Controllers\CrudController;
use Backpack\CRUD\app\Http\Requests\CrudRequest;
use EduardoArandaH\UserManager\app\Http\Requests\UserStoreCrudRequest as StoreRequest;
use EduardoArandaH\UserManager\app\Http\Requests\UserUpdateCrudRequest as UpdateRequest;

class UserPasswordCrudController extends CrudController
{
    use \Backpack\CRUD\app\Http\Controllers\Operations\UpdateOperation { update as traitUpdate; }

    public function setup()
    {
        $this->crud->setModel(config('backpack.permissionmanager.models.user'));
        $this->crud->setEntityNameStrings('User Password', 'User Passwords');
        $this->crud->setRoute(backpack_url('userPasswords'));
        $this->crud->denyAccess('create');
        $this->crud->denyAccess('list');
        $this->crud->denyAccess('delete');
        $this->crud->denyAccess('reorder');
        $this->crud->denyAccess('revisions');
    }

    public function setupUpdateOperation()
    {
        $this->addUserFields();
        $this->crud->setValidation(UpdateRequest::class);
    }

    /**
     * Update the specified resource in the database.
     *
     * @return \Illuminate\Http\RedirectResponse
     */
    public function update()
    {
        $this->crud->setRequest($this->crud->validateRequest());
        $this->crud->setRequest($this->handlePasswordInput($this->crud->getRequest()));
        $this->crud->unsetValidation(); // validation has already been run
        return $this->traitUpdate();
    }

    /**
     * Handle password input fields.
     */
    protected function handlePasswordInput($request)
    {
        // Remove fields not present on the user.
        $request->request->remove('password_confirmation');
        $request->request->remove('roles_show');
        $request->request->remove('permissions_show');

        // Encrypt password if specified.
        if ($request->input('password')) {
            $request->request->set('password', Hash::make($request->input('password')));
        } else {
            $request->request->remove('password');
        }

        return $request;
    }

    protected function addUserFields()
    {
        $this->crud->addFields([
            [
                'name'  => 'name',
                'label' => trans('backpack::permissionmanager.name'),
                'type'  => 'text',
                'attributes' => ['readonly' => 'readonly'],
            ],
            [
                'name'  => 'email',
                'label' => trans('backpack::permissionmanager.email'),
                'type'  => 'email',
                'attributes' => ['readonly' => 'readonly'],
            ],
            [
                'name'  => 'password',
                'label' => trans('backpack::permissionmanager.password'),
                'type'  => 'password',
            ],
            [
                'name'  => 'password_confirmation',
                'label' => trans('backpack::permissionmanager.password_confirmation'),
                'type'  => 'password',
            ],
        ]);
    }
}

加载新控制器的路由:

代码语言:javascript
复制
<?php

Route::group([
    'namespace'  => 'App\Http\Controllers',
    'prefix'     => config('backpack.base.route_prefix', 'admin'),
    'middleware' => ['web', backpack_middleware()],
], function () {
    Route::crud('userPasswords', 'UserPasswordCrudController');
});

resources/views/vendor/backpack/crud/buttons/update_password.blade.php上创建一个包含以下内容的自定义按钮:

代码语言:javascript
复制
@if ($crud->hasAccess('update'))
    <!-- Single edit button -->
    <a href="{{ url(config('backpack.base.route_prefix').'/userPasswords/'.$entry->getKey().'/edit') }}" class="btn btn-sm btn-link"><i class="la la-edit"></i>Edit Password</a>
@endif

最后,在您的普通用户crud控制器(或您希望在其中放置按钮的任何控制器)中,将按钮添加到控制器的setupListOperation方法中的行堆栈中:

代码语言:javascript
复制
public function setupListOperation()
{
    $this->crud->addButtonFromView('line', 'update_password', 'view', 'end');
    
    // ... normal setup code
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/64208065

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档