我有一个用户创建自定义问题的表单。为此,用户需要引入问题(例如:接收通知?)以及字段的类型(文本、长文本、复选框、选择菜单、单选按钮)。如果用户选择一个复选框字段,选择菜单或单选按钮,他还需要介绍问题的可用选项。
在数据库中,问题被插入到问题和question_options表中,如下所示:
//问题表
id question type conference_id
1 question1 text 1
2 question2 long_text 1
3 question3 checkbox 1
4 question4 radio_btn 1
5 question5 select_menu 1
//question_options表:
id question_id type
1 3 q3op1
2 3 q3op2
3 4 q4op1
4 4 q4op2
5 5 q5op1
6 5 q5op2
我的疑问是如何在registration.blade.php中正确地显示输入(文本、单选按钮、复选框、选择、文本区和输入文件),这是基于存储在问题表的“类型”列中的类型。现在不能正常工作,它看起来像图像的左屏幕,但应该看起来像图像的右屏幕:
您知道为什么图像的屏幕不像右侧那样显示吗?
在问题模型中,有这个getHtmlInput方法():
switch ($this->type) {
case "text":
return "<input type='text' name='$name' val='$val' class='$class''" . ($required?:"required") . "/>";
case "checkbox":
return "<input type='checkbox' name='$name' class='$class''" . ($required?:"required") . "/>";
case "radio_btn":
return "<input type='radio' name='$name' class='$class''" . ($required?:"required") . "/>";
case "select_menu":
return "<select name='$name' class='$class''" . ($required?:"required") . "></select>";
case "textarea":
return "<textarea name='$name' class='$class''" . ($required?:"required") . "></textaera>";
}
在registration.blade.php中,问题用以下代码表示:
@if ($allParticipants == 0)
@foreach($selectedRtype['questions'] as $customQuestion)
<div class="form-group">
<label for="participant_question">{{$customQuestion->question}}</label>
{!! $customQuestion->getHtmlInput(
'participant_question[]',($customQuestion->pivot->required == "1") ? 'required' : '',
$class = "form-control",
$customtype=$customQuestion->type) !!}
</div>
@if($customQuestion->hasOptions())
@foreach($customQuestion->options as $option)
<p>{{ $option->value }}</p>
@endforeach
@endif
@endforeach
@endif
用于创建问题的QuestionController存储方法:
public function store(Request $request, $id){
$this->validate($request, [
'question' => 'required|max:255|string',
'type' => 'required|max:255|string',
]);
$conference = Conference::find($id);
$question = Question::create([
'conference_id' => $conference->id,
'question' => $request->question,
'type' => $request->type,
]);
if(in_array($request->type, Question::$typeHasOptions)){
foreach($request->input('questionOptions') as $questionOption) {
QuestionOption::create([
'question_id' => $question->id,
'value' => $questionOption
]);
}
}
Session::flash('success', 'Question created with success.');
return redirect()->back();
}
型号:
//问题模型
class Question extends Model
{
protected $fillable = [
'question', 'type', 'conference_id',
];
public static $typeHasOptions = [
'radio_btn',
'select_menu',
'checkbox'
];
public function ticket_types(){
return $this->belongsToMany('App\TicketType', 'ticket_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 = "", $val = "", $required = false, $class = "", $customtype=false)
{
switch ($this->type) {
case "text":
return "<input type='".($customtype?:"text")."' name='$name' val='$val' class='$class''" . ($required?:"required") . ">";
case "checkbox":
return "<input type='".($customtype?:"checkbox")."' name='$name' class='$class''" . ($required?:"required") . ">";
case "radio_btn":
return "<input type='".($customtype?:"radio")."' name='$name' class='$class''" . ($required?:"required") . ">";
case "select_menu":
return "<input type='".($customtype?:"radio")."' name='$name' class='$class''" . ($required?:"required") . ">";
case "textarea":
return "<input type='".($customtype?:"radio")."' name='$name' class='$class''" . ($required?:"required") . ">";
}
}
}
// QuestionOption模型
class QuestionOption extends Model
{
protected $fillable = [ 'question_id', 'value' ];
public function question() {
return $this->belongsTo('App\Question');
}
}
发布于 2018-06-02 21:55:05
代码中的错误:
class='$class''"
getHtmlInput
中设置了两次引号getHtmlInput
3 switch
中的最后一个输入是用name[]
生成的,但是[]
只需要radio
和<p>{{ $option->value }}</p>
radio
>d21registration.blade.php在这种情况下没有意义,因为它应该绑定到具有唯一id的输入。每个输入都应该有唯一的name
字段。您需要在questions
表中添加name
字段。并在模板中用作$customQuestion->name
已修复代码的示例(未测试):
registration.blade.php
可能如下所示:
@if ($allParticipants == 0)
@foreach($selectedRtype['questions'] as $customQuestion)
<div class="form-group">
<div>
{{$customQuestion->question}}
</div>
<div>
@if($customQuestion->hasOptions())
{!! $customQuestion->getHtmlInput(
$customQuestion->name,
$customQuestion->options,
($customQuestion->pivot->required == '1'),
'form-control',
$customQuestion->type)
!!}
@endif
</div>
</div>
@endforeach
@endif
和方法getHtmlInput()
可能如下所示:
public function getHtmlInput($name = "", $options = "", $required = false, $class = "", $customtype=false)
{
$html = '';
$html .= $customtype == 'select_menu' ? "<select name='$name' class='$class' ".($required?:" required").">" : '';
foreach($options as $option) {
switch ($customtype) {
case "text":
$html .= "<div><input type='text' name='$name' value='".$option->value."' class='$class'" . ($required?:" required") . "></div>";
break;
case "checkbox":
$html .= "<div><input type='checkbox' name='".$name."[]' value='".$option->value."' class='$class'" . ($required?:" required") . ">". $option->value."</div>";
break;
case "radio_btn":
$html .= "<div><input type='radio' name='".$name."[]' class='$class'" . ($required?:" required") . "> ".$option->value."</div>";
break;
case "select_menu":
$html .= "<option value='".$option->value."'>";
break;
case "textarea":
$html .= "<div><textarea name='$name' class='$class'" . ($required?:" required") . ">" . $option->value . "</textarea></div>";
break;
}
}
$html .= $customtype == 'select_menu' ? "</select>" : '';
return $html;
}
https://stackoverflow.com/questions/50516960
复制相似问题