首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >自定义请求验证错误后,在窗体上获取旧的或用户变量值,使用两种不同的窗体查看

自定义请求验证错误后,在窗体上获取旧的或用户变量值,使用两种不同的窗体查看
EN

Stack Overflow用户
提问于 2020-09-14 18:13:15
回答 2查看 74关注 0票数 1

编辑:

您的解决方案适用于文本输入和文本区域,但是复选框没有为我正确工作。

这是我最初的复选框:

代码语言:javascript
复制
{{ 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:

代码语言:javascript
复制
if(!array_key_exists('active', $validated)){
    $validated = array_add($validated, 'active', '0');
}

原始问题(部分解决):

我有一个刀片视图调用编辑--两个 forms,但是每一个都在调用自己的方法/路由。一个表单用于编辑/存储用户,另一个表单是用于更改用户密码的模式中的表单。当我更改密码而没有发生验证错误时,另一个表单仍然拥有通过索引方法从、old()或$user变量获得的所有值。但是,如果密码不匹配,则会发生验证错误,并且编辑/存储用户表单中的值将消失。

表单非常简单(请记住,它们位于相同的视图上,给我带来问题的是编辑/创建表单),每个表单都调用与UserController不同的方法

表单1用于编辑用户(简化)

代码语言:javascript
复制
@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:更新密码

代码语言:javascript
复制
<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我将粘贴两个方法,一个用于存储/用户,另一个用于更改密码。更新方法非常相似。

代码语言:javascript
复制
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 --这是验证密码表单的请求

代码语言:javascript
复制
public function rules()
{
    return [
        'password' => 'required|string|confirmed'; 
    ];
}

路线是这样的:

users/{user}/edit

我花了一整天的时间来解决这个问题,但仍然没有找到解决办法。我的英语不是很好,所以请告诉我,如果我没有正确解释,我将编辑这个问题。

谢谢,希望我能找到解决办法。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2020-09-14 19:58:02

旧值来自输入名称。

代码语言:javascript
复制
<input type="text" name="input" value="{{old('input')}}"

示例

代码语言:javascript
复制
<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

表格::复选框:

  1. 第一个论点:名称
  2. 第二个论点:价值
  3. 第三个论点:检查或不检查(真或假)
  4. 第四个论点:附加属性

注意,值是属性值,选中的是属性(选中)。

代码语言:javascript
复制
{{ 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中,如下所示

代码语言:javascript
复制
<input type="checkbox" value="1" checked="checked">

然后,需要在表单的第四个参数中添加内联事件onchange="$(this).is(':checked') ? $(this).val(1) : $(this).val(0);"::复选框,以更改运行时的默认值。

票数 1
EN

Stack Overflow用户

发布于 2020-09-14 20:01:02

如果我的理解是正确的,你应该这样做:

代码语言:javascript
复制
old('name', isset($user) ? $user->name : ''),

在这里,您尝试获取旧的name输入,如果它不存在,则在第二个参数od old函数中,您将得到默认值,即用户存在时的用户名

文档,它可以帮助您更多地理解。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/63889728

复制
相关文章

相似问题

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