php - 如何组织这个上下文以正确收集每个参与者的答案?
问题描述
我有一个用户在会议中注册的表格。但是当用户单击“商店注册”时,它会显示一个未定义的偏移错误,问题应该是因为我没有正确组织这个上下文。根据会议表的“all_participants”列是“1”还是“0”,在会议中注册的表格会有所不同。
如果会议表中的 all_participants 为 1
如果会议表的“all_participants”列的值为“1”,这意味着需要收集每个参与者的姓名(关于每个选定的注册类型)。因此表单将显示表单字段以收集每个参与者的姓名和姓氏。此外,如果某些选定的注册类型具有关联的自定义问题,则如果“all_participants”为 1,则需要为每个参与者收集该问题的答案。在上图中,注册类型“常规”具有关联的自定义问题“电话”,因此有必要收集注册类型为“常规”的两个参与者的答案。
在会议表中将 all_participants 的形式显示为“1”的图像
用户单击“存储注册”后,应将其存储在如下表中:
如果会议表中 all_participants 为 0
如果“all_participants”为“0”,表单将只有一个字段“Phone”,因为姓名和姓氏直接来自经过身份验证的用户信息。并且因为“all_participants”为“0”也只需要收集正在进行注册的用户(经过身份验证的用户)的电话,因为“all_participants”为“0”,因此其他参与者不是必需的。因此,在这种情况下,如果“all_participants”为“0”,则表单将只有一个字段(电话)。参与者表只需要存储注册用户的姓名和姓氏,其他参与者可以存储为空的“”。
如果 all_participants 为“0”,则形成:
用户单击“存储注册”后,应将其存储在如下表中:
对于“all_participants”的情况,此图像上下文的 HTML 为 1:
<form method="post" id="registration_form" action="http://proj.test/conference/1/conference-title/registration/storeRegistration">
<h6>Participant - 1 - general</h6>
<div class="form-group">
<label for="namegeneral_1">Name</label>
<input type="text" id="namegeneral_1" name="participant_name[]" required="" class="form-control" value="">
</div>
<div class="form-group">
<label for="surnamegeneral_1">Surname</label>
<input type="text" id="surnamegeneral_1" required="" class="form-control" name="participant_surname[]" value="">
</div>
<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="hidden" name="rtypes[]" value="1">
<h6> Participant - 2 - general</h6>
<div class="form-group">
<label for="namegeneral_2">Name</label>
<input type="text" id="namegeneral_2" name="participant_name[]" required="" class="form-control" value="">
</div>
<div class="form-group">
<label for="surnamegeneral_2">Surname</label>
<input type="text" id="surnamegeneral_2" required="" class="form-control" name="participant_surname[]" value="">
</div>
<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="hidden" name="rtypes[]" value="1">
<h6> Participant - 1 - plus</h6>
<div class="form-group font-size-sm">
<label for="nameplus_1">Name</label>
<input type="text" id="nameplus_1" name="participant_name[]" required="" class="form-control" value="">
</div>
<div class="form-group font-size-sm">
<label for="surnameplus_1">Surname</label>
<input type="text" id="surnameplus_1" required="" class="form-control" name="participant_surname[]" value="">
</div>
<input type="hidden" name="rtypes[]" value="2">
<input type="submit" class="btn btn-primary" value="Store Registration">
</form>
当用户单击“商店注册”时,代码将转到 StoreRegistration() 以将所有注册信息存储在数据库中:
public function storeRegistration(Request $request, $id, $slug = null)
{
$allParticipants = Conference::where('id', $id)->first()->all_participants;
$user = Auth::user();
$rules = [];
$messages = [];
if ($allParticipants == 1) {
$rules["participant_name.*"] = 'required|max:255|string';
$rules["participant_surname.*"] = 'required|max:255|string';
}
$validator = Validator::make($request->all(), $rules);
if ($validator->passes()) {
$total = Session::get('total');
$registration = Registration::create([
'conferenec_id' => $id,
'main_participant_id' => $user->id,
'status' => ($total > 0) ? 'I' : 'C',
]);
$participants = [];
for ($i = 0; $i < count($request->participant_name); $i++) {
$name = ($allParticipants) ? $request->participant_name[$i] : '';
$surname = ($allParticipants) ? $request->participant_surname[$i] : '';
$participants[] = Participant::create([
'name' => $name,
'surname' => $surname,
'registration_id' => $registration->id,
'registration_type_id' => $request->rtypes[$i]
]);
}
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, // undefined index error is here
'answer' => $request->participant_question[$key],
]);
}
}
return redirect(route('user.index', ['user' => Auth::id()]).'#myTickets');
}
else{
dd($validator->errors());
}
}
如果数据透视表“registration_type_questions”中的“required”列是“1”,我有具有 getHtmlInput() 的 Question 模型来生成自定义问题的 HTML,并将 required 属性添加到字段中:
class Question extends Model
{
protected $fillable = [
'question', 'type', 'conference_id',
];
public static $typeHasOptions = [
'radio_btn',
'select_menu',
'checkbox'
];
public function registration_type()
{
return $this->belongsToMany('App\RegistrationType', 'registration_type_questions')
->withPivot('required');
}
public function options()
{
return $this->hasMany('App\QuestionOption');
}
public function hasOptions()
{
return in_array($this->type, self::$typeHasOptions);
}
public function getHtmlInput($name = "", $options = "", $required = false, $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() 的使用如下:
@foreach($selectedRtype['questions'] as $customQuestion)
<div class="form-group">
<label for="participant_question">{{$customQuestion->question}}</label>
@if($customQuestion->hasOptions() && in_array($customQuestion->type, ['checkbox', 'radio_btn', 'select_menu']))
{!! $customQuestion->getHtmlInput(
$customQuestion->name,
$customQuestion->options,
($customQuestion->pivot->required == '1'),
$customQuestion->type)
!!}
@else
{!! $customQuestion->getHtmlInput(
$customQuestion->name,
[],
($customQuestion->pivot->required == '1'),
$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
解决方案
我稍微修改了 HTML 文件结构。
<form method="post" id="registration_form" action="http://proj.test/conference/1/conference-title/registration/storeRegistration">
{{csrf_field()}}
<h6>Participant - 1 - general</h6>
<div class="form-group">
<label for="namegeneral_1">Name</label>
<input type="text" id="namegeneral_1" name="participant[1][name]" required="" class="form-control" value="">
</div>
<div class="form-group">
<label for="surnamegeneral_1">Surname</label>
<input type="text" id="surnamegeneral_1" required="" class="form-control" name="participant[1][surname]" value="">
</div>
<div class="form-group">
<label for="participant_question">Phone?</label>
<input type="text" name="participant[1][answer]" class="form-control" required="">
<input type="hidden" name="participant_question_required[]" value="1">
<input type="hidden" value="1" name="participant[1][question_id]">
</div>
<input type="hidden" name="participant[1][rtypes]" value="1">
<h6> Participant - 2 - general</h6>
<div class="form-group">
<label for="namegeneral_2">Name</label>
<input type="text" id="namegeneral_2" name="participant[2][name]" required="" class="form-control" value="">
</div>
<div class="form-group">
<label for="surnamegeneral_2">Surname</label>
<input type="text" id="surnamegeneral_2" required="" class="form-control" name="participant[2][surname]" value="">
</div>
<div class="form-group">
<label for="participant_question">Phone?</label>
<input type="text" name="participant[2][answer]" class="form-control" required="">
<input type="hidden" name="participant_question_required[]" value="1">
<input type="hidden" value="1" name="participant[2][question_id]">
</div>
<input type="hidden" name="participant[2][rtypes]" value="1">
<h6> Participant - 1 - plus</h6>
<div class="form-group font-size-sm">
<label for="nameplus_1">Name</label>
<input type="text" id="nameplus_1" name="participant[3][name]" required="" class="form-control" value="">
</div>
<div class="form-group font-size-sm">
<label for="surnameplus_1">Surname</label>
<input type="text" id="surnameplus_1" required="" class="form-control" name="participant[3][surname]" value="">
</div>
<input type="hidden" name="participant[3][rtypes]" value="2">
<input type="submit" class="btn btn-primary" value="Store Registration">
我会将所有 <code> 参与者存储在一个名为的数组中并将participant
其发送到Backend
输出 :
array:2 [▼
"_token" => "WDtDV0CL6OKVCsGSi5HNyi4HQ6Pmo6VAwzDsgYK1"
"participant" => array:3 [▼
1 => array:5 [▼
"name" => "ali"
"surname" => "shahabi"
"answer" => "0937"
"question_id" => "1"
"rtypes" => "1"
]
2 => array:5 [▼
"name" => "danyal"
"surname" => "shahabi"
"answer" => "0938"
"question_id" => "1"
"rtypes" => "1"
]
3 => array:3 [▼
"name" => "baba"
"surname" => "babaei"
"rtypes" => "2"
]
]
]
storeRegistration
方法 。
我validation
从代码中删除并专注于程序的逻辑:
public function storeRegistration(Request $request, $id, $slug = null)
{
# all_participants field
$allParticipants = Conference::where('id', $id)->first()->all_participants;
$total = Session::get('total');
# user object
$user = Auth::user();
# add registration to Database
$registration = Registration::create([
'conference_id' => $id,
'main_participant_id' => $user->id,
'status' => ($total > 0) ? 'I' : 'C',
]);
# List of all participants
$participants_list=$request->get('participant');
#add all participants to Database
foreach ($participants_list as $participant)
{
$name = ($allParticipants) ? $participant['name'] : '';
$surname = ($allParticipants) ? $participant['surname'] : '';
$participant_result = Participant::create([
'name' => $name,
'surname' => $surname,
'registration_id' => $registration->id,
'registration_type_id' => $participant['rtypes']
]);
# save answer to Database if exist
if(isset($participant['question_id']))
{
$answer = Answer::create([
'question_id' => $participant['question_id'],
'participant_id' => $participant_result->id,
'answer' => $participant['answer'],
]);}
}
return redirect(route('user.index', ['user' => Auth::id()]).'#myTickets');
}
推荐阅读
- html - 未捕获的 ReferenceError:未定义 PDFObject
- r - 表格包括使用 ANOVA 对 3+ 组进行组间 p 值比较
- javascript - 在一个
- reactjs - Switch' 不是从 'react-router-dom' 导出的
- unity3d - 执行云脚本的操作(推送通知)在段中不起作用
- android - 一旦对象与 RecyclerView 分离,如何停止 Stringify 方法?
- android - 如何在 Jetpack Compose 中仅显示最后 3 行文本?
- macos - Android SDK 位置不能位于文件系统根目录。[苹果电脑]
- 2sxc - 2sxc DNN 在同一个应用程序上复制数据内容类型
- python - Matplotlib 图不更新 - PyQt5