我使用的是laravel-backpack 4.0。我想添加一个页面的密码更改链接和所有的验证和所有的功能,如编辑用户列表中的操作列。
发布于 2020-10-15 11:00:13
想要另一个页面,当包的内置用户crud允许您更新密码以及所有其他用户字段时,您只能更新密码,这似乎有点奇怪。也就是说,假设您有自己的原因(并且我已经正确理解了用法),一种方法是使用建议的users addon package,然后为用户模型创建第二个CRUD控制器,该控制器只支持“更新”操作,并且只允许编辑密码。
备注
这是未经测试的,因此可能会有一些小问题需要解决,但方法是可靠的。
安装和配置users addon package。然后,为用户创建第二个控制器,但进行编辑,以便只允许"update“操作,并且只有密码和密码确认字段是可编辑的。我们会将姓名和电子邮件设置为只读,以便您可以查看收件人,但不能编辑这些字段。如果需要,您可以隐藏这些字段,也可以删除它们,但如果删除它们,请注意,您需要创建一个自定义请求类并更新规则,以便在提交时不需要这些字段。
<?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',
],
]);
}
}加载新控制器的路由:
<?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上创建一个包含以下内容的自定义按钮:
@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方法中的行堆栈中:
public function setupListOperation()
{
$this->crud->addButtonFromView('line', 'update_password', 'view', 'end');
// ... normal setup code
}https://stackoverflow.com/questions/64208065
复制相似问题