【问题标题】:Validation of at least one checkbox from group in multiple forms in laravel在laravel中以多种形式验证组中的至少一个复选框
【发布时间】:2020-05-03 16:44:26
【问题描述】:

我有一组复选框和多个表单。至少应选中一组表单中的一个复选框。可以存在一种或多种形式。我已经搜索但无法从谷歌找到答案。请帮我解决这个问题。 我有以下 create.blade.php 代码

@extends('layouts.backend.app')

@section('title', 'Dashboard - Create Email Templates')

    @section('content')
        <div class="col-lg-12">

            <h1 class="page-header">Create Email Templates</h1>

        </div>

            <div class="col-lg-8">
                <p> <strong>Note :</strong> Fields given <span class="text-info">*</span> are Compulsory.</p>
                <form method="post" id="foo" >
                    {{ csrf_field() }}
                    <div class="multiple_feilds">
                    </div>
                    <div class="form-group">
                        <a id="add_another_form">Add Another Form</a>
                    </div>
                    <button type="submit" class="btn btn-default">Submit</button>
                </form>

            <script type="text/javascript">
                $(document).ready(function(){

                    function createForm(n){
                        var form = ""+
                            "<div class=\"form\">"+
                                "<div class=\"form-group\">"+
                                    "<label class=\"text-primary\">#Form "+n+"</label>"+
                                "</div>"+
                                "<div class=\"form-group\">"+
                                    "<label>Email Subject<span class=\"text-info\">*</span></label>"+
                                    "<input class=\"form-control\" type=\"text\" name=\"email_subject[]\">"+
                                    "<span class=\"email_subject text-danger\"></span>"+
                                "</div>"+
                                "<div class=\"form-group\">"+
                                    "<label>Email Body<span class=\"text-info\">*</span></label>"+
                                    "<textarea class=\"form-control\" name=\"email_body[]\"></textarea>"+
                                    "<span class=\"email_body text-danger\"></span>"+
                                "</div>"+
                                "<div class=\"form-group\">"+
                                    "<label>Email Type<span class=\"text-info\">*</span></label>"+
                                    @php
                                        $emailType = ['register_email'=>'Register Email','weekly_email'=>'Weekly Email','other'=>'Other'];
                                    @endphp
                                    @foreach($emailType as $key => $value)
                                    "<div class=\"checkbox\">"+
                                        "<label>"+
                                            "<input type=\"checkbox\" name=\"email_type["+n+"][]\" value=\"{{$key}}\">{{$value}}"+
                                        "</label>"+
                                    "</div>"+
                                    @endforeach
                                    "<span class=\"email_type text-danger\"></span>"+
                                "</div>"+
                                "<div class=\"form-group\">"+
                                    "<input type=\"hidden\" name=\"form_id[]\" value=\""+n+"\">"+
                                "</div>"+
                                "<a class=\"remove_form\">Remove Form</a>"+
                                "<hr class=\"multiple_form_separator\">"+
                            "</div>";

                        return form;

                    }

                    var n = 1;

                    var form = createForm(n);

                    $(".multiple_feilds").html(form);

                    $("#add_another_form").click(function(){

                        n = n+1;

                        var form = createForm(n);

                        $('.multiple_feilds').append(form);

                    });

                    $('.multiple_feilds').delegate('.remove_form', 'click', function () {

                        $(this).parent().remove();

                    });

                });

                //Ajax Validation For Laravel
                /* attach a submit handler to the form */
                $("#foo").submit(function(event) {

                alert('validating');

                /* stop form from submitting normally */
                event.preventDefault();

                /*clear result div*/
                $("#result").html('');

                /* get some values from elements on the page: */
                var values = $(this).serialize();


                 var url = "{{route('email-template.store')}}"; // the script where you handle the form input.

                 $.ajax({
                           type: "POST",
                           url: url,
                           data: $("#foo").serialize(), // serializes the form's elements.
                           success: function(data)
                               {
                                   indexPageUrl = "{{route('email-template.index')}}";
                                   location.href = indexPageUrl;
                               },
                            error:function(msg){
                                data = msg.responseJSON.errors;
                                console.log(data);
                                var email_subject=document.getElementsByName("email_subject[]");
                                for(var x=0;x<email_subject.length;x++){
                                    if( typeof data["email_subject."+x]!=="undefined"){
                                        document.getElementsByClassName("email_subject")[x].innerHTML = data["email_subject."+x];
                                    }else{
                                        document.getElementsByClassName("email_subject")[x].innerHTML = "";
                                    }
                                }


                                var email_body=document.getElementsByName("email_body[]");
                                for(var x=0;x<email_body.length;x++){
                                    if( typeof data["email_body."+x]!=="undefined"){
                                        document.getElementsByClassName("email_body")[x].innerHTML = data["email_body."+x];
                                    }else{
                                        document.getElementsByClassName("email_body")[x].innerHTML = "";
                                    }
                                }

                                // Validation of Group of Checkbox (At least one is required from a group.)

                            }
                         });

                    return false; // avoid to execute the actual submit of the form.


                });

            </script>
        </div>
    @endsection

以及FromRequest的以下代码

           return [
                'email_subject.*' => 'required|string',
                'email_body.*' => 'required|string',
                'email_type' => 'required', //Please answer the validating rule
            ];

请帮我找到答案。提前致谢

【问题讨论】:

    标签: laravel validation checkbox


    【解决方案1】:

    解决此问题的一种方法是计算email_subjectemail_body 字段,然后将该值用于minmin 验证规则email_type

    $count = count($this->input('email_subject', []));
    
    return [
        'email_subject'   => 'required|array',
        'email_subject.*' => 'required|string',
        'email_body'      => 'required|array',
        'email_body.*'    => 'required|string',
        'email_type'      => "required|array|min:{$count}",
        'email_type.*'    => 'required|array',
        'email_type.*.*'  => 'required|string',
    ];
    

    【讨论】:

    • @BishwaRanjanTimilsina 很高兴我能帮上忙!
    【解决方案2】:

    使用min:1。它会检查数组必须有最少的值。

     return [
                'email_subject.*' => 'required|string',
                'email_body.*' => 'required|string',
                'email_type' => 'min:1', 
            ];
    

    【讨论】:

    • 'email_type' => 'required' 已经在单个表单中工作,但在多个表单中(注意:单击添加另一个表单后添加的另一个相同表单)无法使用不同表单的两个单独的复选框组。我需要从单个多个表单的组复选框中的至少一个复选框。
    • 在你的情况下,我认为应该是"email_type.*" =&gt; 'min:1',因为每个email_type 条目都是用户选项的数组(对吗?)
    • 您可以使用min 启用多个,例如min:2
    猜你喜欢
    • 2014-07-15
    • 2017-07-27
    • 1970-01-01
    • 1970-01-01
    • 2013-04-25
    • 2018-05-23
    • 2011-07-01
    • 1970-01-01
    • 2011-03-13
    相关资源
    最近更新 更多