У меня есть форма на странице 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"
]