【问题标题】:Show the details of an administrator only when the corresponding radio button is selected?仅在选择相应的单选按钮时才显示管理员的详细信息?
【发布时间】:2018-03-01 12:34:59
【问题描述】:

我有一个页面来编辑帖子的管理员。 在此页面中有一些单选按钮。每个单选按钮对应一个帖子的管理员。选择单选按钮时,该管理员的详细信息在表单字段中填充

问题是,当用户访问帖子页面的此编辑管理员时,不应选中单选按钮,因此我在单选按钮中没有“已选中”属性。没关系。

但是虽然没有选中单选按钮,但在第一次访问页面时,默认情况下,表单字段中会显示最后创建的管理员的详细信息。然后,如果我选择其他管理员,则会显示该所选管理员的详细信息,但是当首先访问该页面并且在表单字段中未选中单选按钮时,会显示最后创建的管理员的详细信息。

您知道如何仅在选择相应的单选按钮时显示管理员的详细信息吗?

完整形式:

<form method="post" class="clearfix" action="{{route('admins.update', ['id' => $post->id])}}" enctype="multipart/form-data">
    {{csrf_field()}}
    @foreach($administrators $admin)
          <div class="form-check">
            <input class="form-check-input" type="radio" name="radiobutton" id="{{$admin->id}}" value="">
            <label class="form-check-label" for="">
              {{$admin->name}}
            </label>
          </div>
    @endforeach
    <div class="form-check">
      <input class="form-check-input" type="radio" name="radiobutton" id="create_administrator"
             value="option2">
      <label class="form-check-label" for="exampleRadios2">
          Create new administrator
      </label>
  </div>
  <div class="form-group">
    <label for="name">Name</label>
    <input type="text" required class="form-control" value="{{ $admin->name }}" name="name">
  </div>

  <!-- below I have more form fields like administrator name, email, etc -->

  <input type="submit" id="adminStoreButton" class="btn btn-primary" value="Create"/>
  <input type="submit" id="adminUpdateButton" class="btn btn-primary" value="Update"/>
  </form>

JS:

 $(document).ready(function () {

    $("#adminStoreButton").hide();

    var admins = {!!  $admin !!}

    $("input[name='radiobutton']").click(function() {

        if($(this).attr("id") == "create_administrator"){
            $("#adminUpdateButton").hide();
            $("#adminStoreButton").show();
            $("#edit_administrator").attr('action', '{{route('admins.store', ['post_id' => $post->id])}}');
        }
        else{
            $("#adminUpdateButton").show();
            $("#adminStoreButton").hide();
            $("#edit_administrator").attr('action', '{{route('admins.update', ['post_id' => $post->id])}}');

        }

        let id = $(this).attr("id");
        let data = admins.find(e => e.id == id) || {
            name: "",
            email: "",
            ...
            date: "",
        };

        $("input[name='name']").val(data.name);
        $("input[name='email']").val(data.email);
       ...
        $("input[name='date']").val(moment(data.date).format('DD MMMM YYYY - HH:mm'));

    });
});

// 管理员控制器编辑方法,返回带有上述编辑管理员表单的视图:

public function edit($id)
{
    $post = Post::find($id);
    $administrators = Administrator::where('post_id', $id)->get();

    return view('administrators.edit')
        ->with('post', $post)
        ->with('administrators', $administrators));
}

// 更新和存储管理路由

Route::get('post/edit/{id}/admins',    [ 'uses' => 'AdminController@edit', 'as'=>'admins.edit']);
Route::post('post/update/{id}/admins', [ 'uses' => 'AdminController@update', 'as'=>'admins.update']);
Route::post('post/store/{id}/admins', [ 'uses' => 'AdminController@store', 'as'=>'admins.store']);

//管理员控制器更新方法:

public function update(Request $request, $id){

        $this->validate($request, [
            'name' => 'required|string',
          ...
        ]);

        $adminToUpdate = Administrator::find($request->radiobutton);

        $adminToUpdate->name = $request->name;
        ...

        $adminToUpdate->save();

        return redirect()->back();
    }
}

//管理员控制器存储方法:

public function store(Request $request, $id){
    $this->validate($request, [
        'name' => 'required|string',
    ]);

    $post = Post::find($id);

    Administrator::create([
        'name' => $request->name,
        'post_id' => $post->id
    ]);

    return redirect()->back();
}

【问题讨论】:

  • autocomplete="off" 添加到您的表单输入中。
  • 感谢您的回答,但我遇到了同样的问题。
  • 您是否考虑过将您的 javascript 逻辑转换为 ajax 请求?如果是,请告诉我,我可能会为您制定逻辑。在我看来,它可以让你以更简单的方式做你想做的事。
  • 感谢您的回答。是的,但我已经尝试将这个工作示例转换为 ajax,但我怀疑如何正确地做到这一点。我有这个 "$("input[name='radiobutton']").click(function() { let id = $(this).attr("id"); $.get('post/edit/'+ id+ '/admins', 函数(管理员){ }); });"但我怀疑它是否正确以及如何在获取管理员详细信息后使用所选管理员(单选按钮)详细信息填充表单字段。
  • 你试过@MajidFouladpour 的建议了吗?您应该先尝试一下,以防止表单被缓存。

标签: javascript php jquery laravel


【解决方案1】:

您的字段(姓名、电子邮件等)的 value 属性最初应为空白。你不需要

value="{{ $admin->name }}"

在初始加载时,因为您在单选按钮单击事件中设置值。相反,它应该是:

value=""

如:

<div class="form-group">
    <label for="name">Name</label>
    <input type="text" required class="form-control" value="" name="name">
</div>

【讨论】:

    【解决方案2】:

    我建议通过backed从ajax获取admin的数据,然后填写表格。

    let id = $(this).attr("id");
    

    你有一个管理员 id,创建接受 id 的新路由并将管理员数据返回到 json 中

    然后通过填充数据

     $("input[name='name']").val(data.name);
     $("input[name='date']").val(data.date);
    

    如果遇到任何问题,请发表评论,我会帮助你

    【讨论】:

    • 谢谢,但是例如,在这部分“var admins= {!! $admin!!}”中,控制器向视图发送已经拥有帖子所有管理员的数组“admins” ,所以它必要的ajax?当单击单选按钮时,所选管理员的详细信息会显示在表单字段中。问题是,当第一次访问此页面时,表单字段会填充最后创建的管理员的详细信息,但没有选择单选按钮(管理员),因此表单字段应该为空。
    • 你可以清空模型关闭事件的所有字段
    • 谢谢你的回答,你能解释一下怎么做吗?
    • $("#myModal").on("hidden", function () { $('#result').html('yes,result'); });
    • 谢谢,但我不明白。你能解释清楚吗?
    【解决方案3】:

    新答案

    <form method="post" class="clearfix" action="{{route('admins.update', ['id' => $post->id])}}" enctype="multipart/form-data">
        {{csrf_field()}}
        <div class="hide-first">
            @foreach($administrators $admin)
                <div class="form-check">
                    <input class="form-check-input" type="radio" name="radiobutton" id="{{$admin->id}}" value="option1">
                    <label class="form-check-label" for="">
                       {{$admin->name}}
                    </label>
                </div>
             @endforeach
        </div>
        <div class="form-check">
            <input class="form-check-input" type="radio" name="radiobutton" id="create_administrator"
             value="option2">
           <label class="form-check-label" for="exampleRadios2">
               Create new administrator
           </label>
         </div>
         <div class="form-group">
            <label for="name">Name</label>
            <input type="text" required class="form-control" value="{{ $admin->name }}" name="name">
         </div>
         <!-- below I have more form fields like administrator name, email, etc -->
         <input type="submit" id="adminStoreButton" class="btn btn-primary" value="Create"/>
         <input type="submit" id="adminUpdateButton" class="btn btn-primary" value="Update"/>
    </form>
    

    JS

    $(document).ready(function () {
    
        $('.hide-first).hide();
    
        $("#adminStoreButton").hide();
    
        var admins = {!!  $admin !!}
    
        $("input[name='radiobutton']").click(function() {
    
            $('.hide-first).show();
    
            if($(this).attr("id") == "create_administrator"){
                $("#adminUpdateButton").hide();
                $("#adminStoreButton").show();
                $("#edit_administrator").attr('action','{{route('admins.store', ['post_id' => $post->id])}}');
            }
            else{
                $("#adminUpdateButton").show();
                $("#adminStoreButton").hide();
                $("#edit_administrator").attr('action','{{route('admins.update', ['post_id' => $post->id])}}');
    
            }
    
            let id = $(this).attr("id");
            let data = admins.find(e => e.id == id) || {
                name: "",
                email: "",
                ...
                date: "",
            };
    
            $("input[name='name']").val(data.name);
            $("input[name='email']").val(data.email);
           ...
            $("input[name='date']").val(moment(data.date).format('DD MMMM YYYY - HH:mm'));
    
         });
    });
    

    老答案

    原因是当您使用编辑功能的 get 路由重定向回它已经获取最后存储的数据时。尽量不要传递 id 并检查表单/字段是否到来。

    不要重定向回尝试重定向到路径,即

    使用

    return redirect('post/edit//admins');
    

    而不是

    return redirect()->back();
    

    【讨论】:

    • 如果你这样做会发生什么 return redirect('post/edit//admins');
    • 谢谢,我遇到了同样的问题,当访问“proj.test/post/edit/2/admins”时,最后创建的管理员详细信息出现在表单字段中。
    • 不传id 2,不传id。
    • 当您切换单选按钮时,您可以通过传递 id 进行 api 调用或重新加载页面
    • 谢谢,但它看起来像“找不到页面”,因为在路由中我也传递了 id,而且似乎有必要,因为有必要编辑特定帖子的管理员,因为管理员是特定帖子的管理员,在本例中为帖子“2”。
    猜你喜欢
    • 2014-07-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-30
    • 1970-01-01
    • 2017-04-11
    • 2016-03-24
    相关资源
    最近更新 更多