Fix: Картинки в ответах + toggleCorrect иконка

 store/update используют $request->file() для загрузки
 toggleCorrect работает с icon.classList вместо innerHTML
 Исправлено наследование цвета иконки от кнопки

Co-authored-by: Qwen-Coder <qwen-coder@alibabacloud.com>
This commit is contained in:
mirivlad 2026-03-27 11:54:48 +08:00
parent eefd5fc5da
commit be1ba308c9
3 changed files with 20 additions and 11 deletions

View File

@ -38,7 +38,7 @@ class QuestionController extends Controller
public function store(Request $request, Test $test)
{
Gate::authorize('create', Question::class);
$validated = $request->validate([
'type' => 'required|in:multiple_choice,matching,ordering',
'question_text' => 'required|string',
@ -53,6 +53,9 @@ class QuestionController extends Controller
'ordering_items' => 'nullable|array',
]);
// Получаем картинки из request напрямую (не через validate)
$answersImages = $request->input('answers', []);
// Проверка что есть хотя бы текст или картинка в ответах
if ($validated['type'] === 'multiple_choice' && !empty($validated['answers'])) {
$hasValidAnswer = false;
@ -79,14 +82,14 @@ class QuestionController extends Controller
// Ответы для multiple_choice
if ($validated['type'] === 'multiple_choice' && !empty($validated['answers'])) {
foreach ($validated['answers'] as $answer) {
foreach ($validated['answers'] as $index => $answer) {
$hasText = !empty($answer['text']);
$hasImage = !empty($answer['image']);
$hasImage = $request->hasFile("answers.$index.image");
if ($hasText || $hasImage) {
$imagePath = null;
if ($hasImage) {
$imagePath = $answer['image']->store('questions/answers', 'public');
$imagePath = $request->file("answers.$index.image")->store('questions/answers', 'public');
}
$question->answers()->create([
'answer_text' => $hasText ? $answer['text'] : null,
@ -189,14 +192,14 @@ class QuestionController extends Controller
// Ответы
if ($validated['type'] === 'multiple_choice' && !empty($validated['answers'])) {
$question->answers()->delete();
foreach ($validated['answers'] as $answer) {
foreach ($validated['answers'] as $index => $answer) {
$hasText = !empty($answer['text']);
$hasImage = !empty($answer['image']);
$hasImage = $request->hasFile("answers.$index.image");
if ($hasText || $hasImage) {
$imagePath = null;
if ($hasImage) {
$imagePath = $answer['image']->store('questions/answers', 'public');
$imagePath = $request->file("answers.$index.image")->store('questions/answers', 'public');
}
$question->answers()->create([
'answer_text' => $hasText ? $answer['text'] : null,

View File

@ -150,14 +150,17 @@ function removeAnswer(btn) { btn.parentElement.remove(); }
function toggleCorrect(btn) {
const inputGroup = btn.parentElement;
const hidden = inputGroup.querySelector('input[type="hidden"][name*="is_correct"]');
const icon = btn.querySelector('i');
if (hidden.value === '0') {
hidden.value = '1';
btn.innerHTML = '<i class="bi bi-check-circle-fill text-success"></i>';
icon.classList.remove('bi-circle');
icon.classList.add('bi-check-circle-fill');
btn.classList.remove('btn-outline-success');
btn.classList.add('btn-success');
} else {
hidden.value = '0';
btn.innerHTML = '<i class="bi bi-circle"></i>';
icon.classList.remove('bi-check-circle-fill');
icon.classList.add('bi-circle');
btn.classList.remove('btn-success');
btn.classList.add('btn-outline-success');
}

View File

@ -176,14 +176,17 @@ function removeAnswer(btn) { btn.parentElement.remove(); }
function toggleCorrect(btn) {
const inputGroup = btn.parentElement;
const hidden = inputGroup.querySelector('input[type="hidden"][name*="is_correct"]');
const icon = btn.querySelector('i');
if (hidden.value === '0') {
hidden.value = '1';
btn.innerHTML = '<i class="bi bi-check-circle-fill text-success"></i>';
icon.classList.remove('bi-circle');
icon.classList.add('bi-check-circle-fill');
btn.classList.remove('btn-outline-success');
btn.classList.add('btn-success');
} else {
hidden.value = '0';
btn.innerHTML = '<i class="bi bi-circle"></i>';
icon.classList.remove('bi-check-circle-fill');
icon.classList.add('bi-circle');
btn.classList.remove('btn-success');
btn.classList.add('btn-outline-success');
}