编辑:
您的解决方案适用于文本输入和文本区域,但是复选框没有为我正确工作。
这是我最初的复选框:
{{ Form::checkbox('active', true, (isset($user->active)) ? old($user->active) : true, ['class' => 'custom-control-input', 'id' => 'active']) }}我尝试过许多可能的解决方案,比如添加old('active', isset($user) ? $user->active: true),但是当出现错误时,我会丢失这个输入的值。在控制器上,我正在检查这一点,但是如果我将输入更改为“新解决方案”,active在我的db上总是为false:
if(!array_key_exists('active', $validated)){
$validated = array_add($validated, 'active', '0');
}原始问题(部分解决):
我有一个刀片视图调用编辑和--两个 forms,但是每一个都在调用自己的方法/路由。一个表单用于编辑/存储用户,另一个表单是用于更改用户密码的模式中的表单。当我更改密码而没有发生验证错误时,另一个表单仍然拥有通过索引方法从、old()或$user变量获得的所有值。但是,如果密码不匹配,则会发生验证错误,并且编辑/存储用户表单中的值将消失。
表单非常简单(请记住,它们位于相同的视图上,给我带来问题的是编辑/创建表单),每个表单都调用与UserController不同的方法
表单1用于编辑用户(简化)
@if($user->exists)
{{ Form::model($user, ['route' => ['users.update', $user], 'class' => 'needs-validation', 'novalidate'=>'']) }}
@method('PATCH')
@else
{{ Form::model($user, ['route' => ['users.store'], 'class' => 'needs-validation', 'novalidate'=>'']) }}
@method('POST')
@endif
@csrf
<div class="form-group">
<div class="row">
<div class="col-sm-4">
{{ Form::label('cif', __('users.cif'), ['class' => 'form-label']) }}
{{ Form::text('cif', (isset($user->cif)) ? old($user->cif) : '', ['class' => 'form-control', 'required','maxlength'=>'12', 'minlength'=>'9']) }}
{{ Form::hidden('validate','', ['class' => 'form-control', 'required', 'id'=>'validate']) }}
</div>
<div class="col-sm-6">
{{ Form::label('name', __('users.name'), ['class' => 'form-label']) }}
{{ Form::text('name', (isset($user->name)) ? old($user->name) : '', ['class' => 'form-control','required','maxlength'=>'255']) }}
</div>
<div class="col-sm-2">
{{ Form::label('initials', __('users.initials'), ['class' => 'form-label']) }}
{{ Form::text('initials', (isset($user->initials)) ? old($user->initials) : '', ['class' => 'form-control', 'required','maxlength'=>'5']) }}
</div>
</div>
<div class="col-sm-6">
{{ Form::label('province', __('users.province'), ['class' => 'form-label']) }}
{{ Form::text('province', (isset($user->city)) ? $user->city->province->name : '', ['class' => 'form-control', 'disabled'=>'']) }}
</div>
{!! Form::close() !!}表单2:更新密码
<form id="change-password" action="{{route('users.change.password', $user)}}" method="POST">
@csrf
<div class="modal-body">
<div class="card-body">
<div class="panel-tag">
<p>Las contraseñas debe de coincidir y tener más de 8 carácteres</p>
</div>
<div class="form-group row">
<label for="password" class="col-md-4 col-form-label text-md-right">Contraseña</label>
<div class="col-md-6">
<input id="password" type="password" class="form-control @error('password') is-invalid @enderror" name="password" required autocomplete="new-password" minlength="8">
@error('password')
<span class="invalid-feedback" role="alert">
<strong>{{ $message }}</strong>
</span>
@enderror
</div>
</div>
<div class="form-group row">
<label for="password-confirmation" class="col-md-4 col-form-label text-md-right">Confirmar contraseña</label>
<div class="col-md-6">
<input id="password-confirmation" type="password" class="form-control @error('password') is-invalid @enderror" name="password_confirmation" required autocomplete="new-password" minlength="8">
</div>
</div>
</div>
</div>
<div class="modal-footer">
<button id="change" type="submit" form="change-password" class="btn btn-primary">Confirmar</button>
<button type="button" class="btn btn-default" data-dismiss="modal">Cancelar</button>
</div>
</form>UserController我将粘贴两个方法,一个用于存储/用户,另一个用于更改密码。更新方法非常相似。
public function store(StoreUserRequest $request)
{
if( $request['validate'] == 1 ){
$validated = $request->validated();
$validated['password'] = Hash::make($validated['password']);
$id = DB::table('users')->insertGetId($validated);
return redirect()->route('users.edit',['user'=>$id])->with('status', 'created');
} else {
return redirect()->back()->withInput()->with('status', 'error_dni');
}
}
public function changePassword(PasswordUserRequest $request, User $user)
{ // HERE IS WHERE I THINK IS THE PROBLEM, IF VALIDATION FAILS (FOR EXAMPLE PASSWORD CONFIRM) VALUES FROM THE OTHER FORM DISAPPEAR AND IT DOESNT GET INTO THIS METHOD
$pass = Hash::make($request->password);
$user->password = $pass;
$action = $user->save();
if ($action) {
return redirect()->back()->with('status', 'change_password_ok');
}
return redirect()->back()->with('status', 'error_change_password');
}PasswordUserRequest --这是验证密码表单的请求
public function rules()
{
return [
'password' => 'required|string|confirmed';
];
}路线是这样的:
users/{user}/edit
我花了一整天的时间来解决这个问题,但仍然没有找到解决办法。我的英语不是很好,所以请告诉我,如果我没有正确解释,我将编辑这个问题。
谢谢,希望我能找到解决办法。
发布于 2020-09-14 19:58:02
旧值来自输入名称。
<input type="text" name="input" value="{{old('input')}}"示例
<div class="col-sm-4">
{{ Form::label('cif', __('users.cif'), ['class' => 'form-label']) }}
{{ Form::text('cif', old('cif', $user->cif ?? ''), ['class' => 'form-control', 'required','maxlength'=>'12', 'minlength'=>'9']) }}
{{ Form::hidden('validate','', ['class' => 'form-control', 'required', 'id'=>'validate']) }}
</div>
//$user->cif ?? '' <- left or right hand-side operand, return right-hand if left is null or undefined
//old('input', $user->cif ?? '') <- if old input available, use old input, if not, $user will be displayed表格::复选框:
注意,值是属性值,选中的是属性(选中)。
{{ Form::checkbox('active', true, (isset($user->active)) ? $user->active : true, ['class' => 'custom-control-input', 'id' => 'active']) }}
//2nd parameter (true) will always set checkbox value to 1(true)
//(isset($user->active)) ? $user->active : true <- will set default to true (checked) if $user is null or undefined
//maybe try
{{ Form::checkbox('active', $user->active ?? false, $user->active ?? false) }}
//if $user != null, put $user->active else put false
//if $user != null, set checked value based on $user->active else put false在html中,如下所示
<input type="checkbox" value="1" checked="checked">然后,需要在表单的第四个参数中添加内联事件onchange="$(this).is(':checked') ? $(this).val(1) : $(this).val(0);"::复选框,以更改运行时的默认值。
发布于 2020-09-14 20:01:02
如果我的理解是正确的,你应该这样做:
old('name', isset($user) ? $user->name : ''),在这里,您尝试获取旧的name输入,如果它不存在,则在第二个参数od old函数中,您将得到默认值,即用户存在时的用户名
有文档,它可以帮助您更多地理解。
https://stackoverflow.com/questions/63889728
复制相似问题