Регистрация магазина не работает должным образом (код всегда переходит в остальную часть «if ($ validator-> pass ()) {...}» - PullRequest
0 голосов
/ 06 июня 2018

У меня есть форма на странице registration.blade.php, чтобы пользователь мог ввести некоторую информацию для регистрации в конференции.

В приведенной ниже форме есть часть, где используется getHtmlInput () метод, который используется для отображения для каждого типа билета / регистрации, выбранного пользователем, пользовательских вопросов, связанных с этим типом регистрации, на которые пользователь должен ответить.И добавляет атрибут «required», если в сводной таблице registration_type_questions вопрос имеет столбец «required» как «1».

Если пользователь выполняет регистрацию в конференции, и пользователь не выбрал билет / типы регистрации, с которыми связаны пользовательские вопросы, регистрация работает нормально, код вводится в "if ($ validator)-> pass ()) {...} ".

Проблема:

Проблема возникает, когда существуют пользовательские вопросы, связанные с одним или несколькими выбранными билетами / типами регистрации.

При наличии пользовательских вопросовчто требуется, я хочу подтвердить это также в Laravel.Итак, у меня есть код ниже в storeRegistration(), который показывает сообщение «Заполните все обязательные поля», если на требуемый пользовательский вопрос не было дано ответа.

Но даже если пользователь заполняет все необходимые пользовательские вопросы, код никогда не входит в if "if ($validator->passes()) {...}".Ты знаешь почему?Также, если вопрос является обязательным, а требуемый атрибут удаляется из HTML-кода в консоли, и пользователь нажимает кнопку «Регистрация магазина», ошибки проверки не отображаются.

Код всегда идет в остальную часть if "" if ($validator->passes()) {...} "и показывает с помощью" else{dd($validator->errors());} ":

MessageBag {#278 ▼
  #messages: array:1 [▼
    "participant_question.0" => array:1 [▼
      0 => "The participant question.0 field is required."
    ]
  ]
  #format: ":message"
}

Знаете ли вы, в чем проблема?


storeRegistrationInfo(), в котором хранится регистрация и имеется проверка, чтобы проверить, не были ли получены ответы на требуемые пользовательские вопросы:

public function storeRegistration(Request $request, $id, $slug = null, Validator $validator)
    {
        $user = Auth::user();

        $rules = [];
        $messages = [];

        if (isset($request->participant_question_required)) {

            dd($request->participant_question_required);

            $messages = [
                'participant_question.*.required' => 'Fill all mandatory fields',
            ];

            foreach ($request->participant_question_required as $key => $value) {
                $rule = 'string|max:255'; // I think string should come before max

                // if this was required, ie 1, prepend "required|" to the rule
                if ($value) {
                   $rule = 'required|' . $rule;
                }
                $rules["participant_question.{$key}"] = $rule;
            }
        }

        $validator = Validator::make($request->all(), $rules, $messages);

        if ($validator->passes()) {
            dd('test');  // this dont appears
            // create an entry in the registrations table
            // create an entry in the participants table for each registered participant
            // create a entry in the answer table for each answer to a custom question
            if (isset($request->participant_question)) {
                foreach( $request->participant_question as $key => $question ) {
                     $answer = Answer::create([
                         'question_id' => $request->participant_question_id[$key],
                         'participant_id' => $participants[$key]->id,
                          'answer' => $request->participant_question[$key],
                     ]); 
               }
            }
        }
    }

Если в базе данных таблицы вопросовэто как:

id      question     conference_id
1        Phone?          1

А в сводной таблице базы данных registration_type_questions:

id  registration_type_id   question_id    required
 1           1                   1             1 

Сгенерированный HTML с getHTMLInput() на основе значений сводной таблицы и таблицы вопросов вышеis:

<form method="post" id="registration_form" action="http://proj.test/conference/1/conference-test/registration/storeRegistration">
    <input type="hidden" name="_token" value="">
    <p> Is not necessary additional info for the registration. Please just answer the following questions. </p>
     <input type="hidden" value="" name="participant_name[]">
     <input type="hidden" value="" name="participant_surname[]">
    <input type="hidden" name="rtypes[]" value="1">
    <div class="form-group">
        <label for="participant_question">Phone?</label>                                           
        <input type="text" name="participant_question" class="form-control" required="">
        <input type="hidden" name="participant_question_required[]" value="1">
        <input type="hidden" value="1" name="participant_question_id[]">
    </div>                                                                  
    <input type="submit" class="btn btn-primary" value="Store Registration">
</form>

Метод getHtmlInput(), который генерирует html, находится в модели Вопроса:

public function getHtmlInput($name = "", $options = "", $required = false, $class = "", $customtype = false)
{
    $html = '';
    $html .= $customtype == 'checkbox' ? "<div class='checkbox-group ".($required ? " required" : "")."'>" : '';
    $html .= $customtype == 'select_menu' ? "<select name='participant_question' class='form-control' " . ($required ? " required" : "")
        . ">" : '';

    if (empty($options)) {
        switch ($customtype) {
            case "text":

                $html .= " 
                <input type='text' name='participant_question' class='form-control'" . ($required ? " required" : "")
                    . ">";
                break;

            case "file":
                $html .= " 
                <input type='file' name='participant_question' class='form-control'" . ($required ? " required" : "") . ">";
                break;

            case "long_text":
                $html .= "
            <textarea name='participant_question' class='form-control' rows='3'" . ($required ? " required" : "") . ">"
                    . $name .
                    "</textarea>";
                break;
        }
    } else {
        foreach ($options as $option) {
            switch ($customtype) {
                case "checkbox":
                    $html .= " 
        <div class='form-check'>
            <input type='checkbox' name='participant_question[]' value='" . $option->value . "' class='form-check-input' >
                <label class='form-check-label' for='exampleCheck1'>" . $option->value . "</label>
        </div>";
                    break;
                case "radio_btn":
                    $html .= " 
            <div class='form-check'>
                <input type='radio' name='participant_question[]' value='" . $option->value . "' class='form-check-input'" . ($required ? " required" : "") . ">" .
                        '    <label class="form-check-label" for="exampleCheck1">' . $option->value . '</label>' .
                        "</div>";
                    break;
                case "select_menu":
                    $html .= "<option value='" . $option->value . "'>" . $option->value . "</option>";
                    break;
            }
        }
    }
    $html .= $customtype == 'select_menu' ? "</select>" : '';
    $html .= $customtype == 'checkbox' ? "</div>" : '';

    return $html;
}

Форма в представлении, использующем getHtmlInput () для генерации html дляПользовательские вопросы:

<div class="card-body">
    @include('includes.errors')
    <form method="post" id="registration_form" action="{{route('conferences.storeRegistration', ['id' => $id, 'slug' => $slug])}}">
        {{csrf_field()}}
        @if (!is_null($allParticipants) && is_int($allParticipants))
           <!-- If all_participants in conferences table is "1"
                is necessary to collect the name and surname of all participants -->
            @if($allParticipants == 1)
                <p>Please fill the following form.</p>
            @else
               <!-- if is 0 is not necessary to collect the name and surname of each participant 
                    and its used the name and surname of the auth user to do the registration-->
              <!-- the registration types selected by the user can have custom questions associated if don't have no 
                    custom question will appear, if 1 or more registration types have custom questions associated they will
                    appear on the form for the user to answer-->
                @if(collect($selectedRtypes)->first()['questions'] == null)
                    <p>Is not necessary additional info for the registration. </p>
                @else
                    <p>Is not necessary additional info for the registration. Please just answer the following
                        questions.</p>
                @endif
            @endif

            <!-- for each selected ticket is necessary collect the name and surname because all_participants is "1" inside this if -->
            @foreach($selectedRtypes as $k => $selectedRtype)
                @foreach(range(1,$selectedRtype['quantity']) as $val)
                    @if($allParticipants == 1)
                        <h6 class="text-heading-blue mb-3 pb-2 font-weight-bold">
                            Participant - {{$val}} - {{$k}}</h6>
                        <div class="form-group font-size-sm">
                            <label for="name{{ $k }}_{{ $val }}"
                                   class="text-gray">Name</label>
                            <input type="text" id="name{{ $k }}_{{ $val }}"
                                   name="participant_name[]" required
                                   class="form-control" value="">
                        </div>
                        <div class="form-group font-size-sm">
                            <label for="surname{{ $k }}_{{ $val }}"
                                   class="text-gray">Surname</label>
                            <input type="text" id="surname{{ $k }}_{{ $val }}"
                                   required class="form-control"
                                   name="participant_surname[]" value="">
                        </div>
                        <!-- for each registration type if there are custom questions thet will appear so the user can answer -->
                        @foreach($selectedRtype['questions'] as $customQuestion)
                            <div class="form-group">
                                <label for="participant_question">{{$customQuestion->question}}</label>
                                <!--if the custom question is a type checkbox, radio button or select menu-->
                                @if($customQuestion->hasOptions() && in_array($customQuestion->type, ['checkbox', 'radio_btn', 'select_menu']))
                                    {!! $customQuestion->getHtmlInput(
                                        $customQuestion->name,
                                        $customQuestion->options,
                                        ($customQuestion->pivot->required == '1'),
                                        'form-control',
                                        $customQuestion->type)
                                    !!}
                                <!-- if the custom question is of type text, file, textarea -->
                                @else
                                    {!! $customQuestion->getHtmlInput(
                                        $customQuestion->name,
                                        [],
                                        ($customQuestion->pivot->required == '1'),
                                        'form-control',
                                        $customQuestion->type)
                                    !!}
                                @endif
                                <input type="hidden"
                                       name="participant_question_required[]"
                                       value="{{ $customQuestion->pivot->required }}">
                                <input type="hidden"
                                       value="{{ $customQuestion->id }}"
                                       name="participant_question_id[]"/>
                            </div>
                        @endforeach
                    @else
                        <input type="hidden" value=""
                               name="participant_name[]"/>
                        <input type="hidden" value=""
                               name="participant_surname[]"/>
                    @endif
                    <input type="hidden" name="rtypes[]"
                           value="{{ $selectedRtype['id'] }}"/>
                @endforeach
                <!-- is not necessary collect info of each participant and its used the name and surname of the auth user
                    to do the registration -->
                @if ($allParticipants == 0)
                    <!-- if the selected registration types have custom questions associated they will appear in the form
                        so the user can answer -->
                    @foreach($selectedRtype['questions'] as $customQuestion)
                        <div class="form-group">
                            <label for="participant_question">{{$customQuestion->question}}</label>
                            <!-- if the custom question is of type checkbox, radio button or select menu -->
                            @if($customQuestion->hasOptions() && in_array($customQuestion->type, ['checkbox', 'radio_btn', 'select_menu']))
                                {!! $customQuestion->getHtmlInput(
                                    $customQuestion->name,
                                    $customQuestion->options,
                                    ($customQuestion->pivot->required == '1'),
                                    'form-control',
                                    $customQuestion->type)
                                !!}
                            <!-- if the checkbox is of type text, textarea, file-->
                            @else
                                {!! $customQuestion->getHtmlInput(
                                    $customQuestion->name,
                                    [],
                                    ($customQuestion->pivot->required == '1'),
                                    'form-control',
                                    $customQuestion->type)
                                !!}
                            @endif
                            <input type="hidden"
                                   name="participant_question_required[]"
                                   value="{{ $customQuestion->pivot->required }}">
                            <input type="hidden"
                                   value="{{ $customQuestion->id }}"
                                   name="participant_question_id[]"/>
                        </div>
                    @endforeach
                @endif
            @endforeach
        @endif
        <input type="submit" class="btn btn-primary" value="Store Registration"/>
    </form>
</div>

$rules до "$validator = Validator::make($request->all(), $rules);" показывает:

array:1 [▼
  "participant_question.0" => "required|string|max:255"
]

request->all() до "$validator = Validator::make($request->all(), $rules);" показывает:

array:7 [▼
  "_token" => ""
  "participant_name" => array:1 [▼
    0 => null
  ]
  "participant_surname" => array:1 [▼
    0 => null
  ]
  "rtypes" => array:1 [▼
    0 => "1"
  ]
  "participant_question" => "j"
  "participant_question_required" => array:1 [▼
    0 => "1"
  ]
  "participant_question_id" => array:1 [▼
    0 => "1"
  ]

Ответы [ 2 ]

0 голосов
/ 12 июня 2018

У нас есть метод прохода:

$rules = ['name' => 'unique'];

$input = ['name' => null];

Validator::make($input, $rules)->passes(); // true

Итак, определите ваши правила и количество входов и попробуйте.

Вы можете использовать dd(Validator::make($input, $rules)->passes();), это даст вам истину или ложь, Ложь для проверки без сбоев и истину для проверки прохода.

Далее используйте это так:

if(Validator::make($input, $rules)->passes(); // true){
    //On pass validation, This section will execute
}
0 голосов
/ 10 июня 2018

Согласно документации :

Если вы не хотите использовать метод проверки в запросе, вы можете создать экземпляр средства проверки вручную, используя фасад Validator.Метод make на фасаде генерирует новый экземпляр валидатора:

public function store(Request $request)
{
    $validator = Validator::make($request->all(), [
        'title' => 'required|unique:posts|max:255',
        'body' => 'required',
    ]);

    if ($validator->fails()) {
        return redirect('post/create')
                    ->withErrors($validator)
                    ->withInput();
    }

    // Store the blog post...
}

Кажется, они не передают Validator как параметр, как вы, а статически вызывают функциюбез какой-либо ссылки на запрос или другие параметры.

Во-вторых, рассмотрите возможность использования флага проверки nullable, который позволяет определять дополнительные поля.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...