У меня есть форма для создания пользовательских вопросов.Для этого пользователю необходимо ввести вопрос (например: получать уведомления?), А также тип поля (текст, длинный текст, флажок, меню выбора, переключатель).Если пользователь выбирает поле с флажком, выбирает меню или переключатель, ему также необходимо ввести доступные параметры для вопроса.
В базе данных вопросы вставляются в таблицы вопросов и параметров вопроса, например:
// таблица вопросов
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
// таблица вопросов-ответов:
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") . ">";
}
}
}
// ВопросОпция модели
class QuestionOption extends Model
{
protected $fillable = [ 'question_id', 'value' ];
public function question() {
return $this->belongsTo('App\Question');
}
}