Я создаю веб-сайт опроса, после создания нового опроса и выбора типа вопроса и добавления вопроса и параметров.Я хочу проверить, принимаю ли я участие в опросе, и все ответы будут сохранены в базе данных.Я пробовал, но проблема заключалась в каких-либо ответах на вопрос (с типом переключателя / флажка), значение, которое было сохранено в базе данных, «включено».Текст / текстовая область была сохранена правильно.Но не мог понять, как я могу это исправить.Независимо от того, что я выберу, значение будет «включено».
Это мой answerController.php:
<?php
namespace App\Http\Controllers;
use Illuminate\Http\Request;
use App\Survey;
use App\Answer;
use App\Http\Requests;
class AnswerController extends Controller
{
public function store(Request $request, Survey $survey)
{
// remove the token
$arr = $request->except('_token');
foreach ($arr as $key => $value) {
$newAnswer = new Answer();
if (! is_array( $value )) {
$newValue = $value['answer'];
} else {
$newValue = json_encode($value['answer']);
}
$newAnswer->answer = $newValue;
$newAnswer->question_id = $key;
$newAnswer->survey_id = $survey->id;
$newAnswer->save();
$answerArray[] = $newAnswer;
};
return redirect()->action('SurveyController@view_survey_answers', [$survey->id]);
}
}
Это ответ Модель:
<?php
namespace App;
use Illuminate\Database\Eloquent\Model;
class Answer extends Model
{
protected $fillable = ['answer'];
protected $table = 'answers';
public function survey() {
return $this->belongsTo(Survey::class);
}
public function question() {
return $this->belongsTo(Question::class);
}
}
Это код для создания вопроса и он выбирает тип:
@extends('master')
@section('title', 'Survey')
@section('content')
<div class="card">
<div class="card-content">
<span class="card-title"> {{ $survey->title }}</span>
<p>
{{ $survey->description }}
</p>
<br/>
<a href='view/{{$survey->id}}'>Take Survey</a> | <a href="{{$survey->id}}/edit">Edit Survey</a> | <a href="/survey/answers/{{$survey->id}}">View Answers</a> <a href="#doDelete" style="float:right;" class="modal-trigger red-text">Delete Survey</a>
<!-- Modal Structure -->
<!-- TODO Fix the Delete aspect -->
<div id="doDelete" class="modal bottom-sheet">
<div class="modal-content">
<div class="container">
<div class="row">
<h4>Are you sure?</h4>
<p>Do you wish to delete this survey called "{{ $survey->title }}"?</p>
<div class="modal-footer">
<a href="/survey/{{ $survey->id }}/delete" class=" modal-action waves-effect waves-light btn-flat red-text">Yep yep!</a>
<a class=" modal-action modal-close waves-effect waves-light green white-text btn">No, stop!</a>
</div>
</div>
</div>
</div>
</div>
<div class="divider" style="margin:20px 0px;"></div>
<p class="flow-text center-align">Questions</p>
<ul class="collapsible" data-collapsible="expandable">
@forelse ($survey->questions as $question)
<li style="box-shadow:none;">
<div class="collapsible-header">{{ $question->title }} <a href="/question/{{ $question->id }}/edit" style="float:right;">Edit</a></div>
<div class="collapsible-body">
<div style="margin:5px; padding:10px;">
{!! Form::open() !!}
@if($question->question_type === 'text')
{{ Form::text('title')}}
@elseif($question->question_type === 'textarea')
<div class="row">
<div class="input-field col s12">
<textarea id="textarea1" class="materialize-textarea"></textarea>
<label for="textarea1">Provide answer</label>
</div>
</div>
@elseif($question->question_type === 'radio')
@foreach($question->option_name as $key=>$value)
<p style="margin:0px; padding:0px;">
<input type="radio" id="{{ $key }}" />
<label for="{{ $key }}">{{ $value }}</label>
</p>
@endforeach
@elseif($question->question_type === 'checkbox')
@foreach($question->option_name as $key=>$value)
<p style="margin:0px; padding:0px;">
<input type="checkbox" id="{{ $key }}" />
<label for="{{$key}}">{{ $value }}</label>
</p>
@endforeach
@endif
{!! Form::close() !!}
</div>
</div>
</li>
@empty
<span style="padding:10px;">Nothing to show. Add questions below.</span>
@endforelse
</ul>
<h2 class="flow-text">Add Question</h2>
<form method="POST" action="{{ $survey->id }}/questions" id="boolean">
<input type="hidden" name="_token" value="{{ csrf_token() }}">
<div class="row">
<div class="input-field col s12">
<select class="browser-default" name="question_type" id="question_type">
<option value="" disabled selected>Choose your option</option>
<option value="text">Text</option>
<option value="textarea">Textarea</option>
<option value="checkbox">Checkbox</option>
<option value="radio">Radio Buttons</option>
</select>
</div>
<div class="input-field col s12">
<input name="title" id="title" type="text">
<label for="title">Question</label>
</div>
<!-- this part will be chewed by script in init.js -->
<span class="form-g"></span>
<div class="input-field col s12">
<button class="btn waves-effect waves-light">Submit</button>
</div>
</div>
</form>
</div>
</div>
@endsection
И это файл JS:
$(document).ready(function() {
$('.collapsible').collapsible({
accordion: false
});
$('.modal-trigger').leanModal();
$(document).on('click', '.delete-option', function() {
$(this).parent(".input-field").remove();
});
// will replace .form-g class when referenced
var material = '<div class="input-field col input-g s12">' +
'<input name="option_name[]" id="option_name[]" type="text">' +
'<span style="float:right; cursor:pointer;"class="delete-option">Delete</span>' +
'<label for="option_name">Options</label>' +
'<span class="add-option" style="cursor:pointer;">Add Another</span>' +
'</div>';
// for adding new option
$(document).on('click', '.add-option', function() {
$(".form-g").append(material);
});
// allow for more options if radio or checkbox is enabled
$(document).on('change', '#question_type', function() {
var selected_option = $('#question_type :selected').val();
if (selected_option === "radio" || selected_option === "checkbox") {
$(".form-g").html(material);
} else {
$(".input-g").remove();
}
});
});
Я следовал учебному пособию, и он сказал: На данный момент типичныйотправка ответа может выглядеть следующим образом:
{
4: {
answer: "My answer"
},
5: {
answer: "on"
},
6: {
answer: "on"
}
}
Таким образом, наша функция store (), part foreach ($ arr as $ key => $ value) проходит через вышеуказанный объект JSON, тогда ключ будетнапример, 4, тогда значением будет $ value ['answer']
Таким образом, мы можем выполнить итерацию и получить ключ, который относится к какому идентификатору вопроса, тогда ответхранится в $ value ['answer'].
^ Но он не решил эту проблему.
Таким образом, Radio и Checkbox будут массивом, а код непринять участие, которое пользователь выбирает из этих массивов.У вас есть идея, как я могу изменить AnswerController так, чтобы код принимал только тот, который выбрал пользователь?
Это answerController, который заботится о части магазина:
public function store(Request $request, Survey $survey)
{
// remove the token
$arr = $request->except('_token');
foreach ($arr as $key => $value) {
$newAnswer = new Answer();
if (! is_array( $value )) {
$newValue = $value['answer'];
} else {
$newValue = json_encode($value['answer']);
}
$newAnswer->answer = $newValue;
$newAnswer->question_id = $key;
$newAnswer->survey_id = $survey->id;
$newAnswer->save();
$answerArray[] = $newAnswer;
};
return redirect()->action('SurveyController@view_survey_answers', [$survey->id]);
}
}
И это таблица ответов:
public function up()
{
Schema::create('answers', function (Blueprint $table) {
$table->increments('id');
$table->integer('question_id');
$table->integer('survey_id');
$table->string('answer');
$table->timestamps();
});
}
Может кто-нибудь помочь мне, пожалуйста?